64-bit stat (or not) in 32-bit Fedora binaries

Miloslav Trmač mitr at volny.cz
Wed Feb 20 12:33:49 UTC 2013


On Tue, Feb 19, 2013 at 5:04 PM, Florian Weimer <fweimer at redhat.com> wrote:
> On 02/19/2013 04:32 PM, Jakub Jelinek wrote:
>>
>> On Tue, Feb 19, 2013 at 09:22:55AM -0600, Eric Sandeen wrote:
>>>>
>>>> (3) For my code that uses st_ino, I need to ensure this is never
>>>> assigned to a 32 bit integer (eg. 'int', 'int32_t', 'long' on 32 bit,
>>>> etc.)?
>>>
>>>
>>> To be safe I'd use it in an u64 type, I guess.  The *internal* kernel stat
>>> structure uses u64:
>>
>> That would be wrong.  To store st_ino values, you should be using the ino_t
>> type, like for file sizes/offsets (st_size, seeking, etc.) you should be
>> using off_t.  Both of these types depend on _FILE_OFFSET_BITS macro.
>
> You can't use ino_t and off_t in public header files because of that
> _FILE_OFFSET_BITS dependency.  At least in such header files, using explicit
> 64-bit types (uint64_t, presumably) is the way to go.
>
> Admittedly, this has a certain yuck factor, but I don't see a way around
> that.

To be safe and portable, use uintmax_t.  It's still not quite pretty,
but at least the type is portable, has a fixed ABI, and there are
printf specifiers for uintmax_t (unlike ino_t or ino64_t).
    Mirek


More information about the devel mailing list