Re: [PATCH] stat.2: fixed inode printing in example program

Konstantin Bukin
2020-09-13T19:40:06Z

I mentioned cast in the commit message. Sending a new patch with a
revised commit message.

On Sun, Sep 13, 2020 at 12:12 PM Konstantin Bukin <kbukin@gmail.com> wrote:
>
> inode numbers are expected to be positive. Casting them to a signed type
> may result in printing negative values. E.g. running example program on
> the following file:
>
> $ ls -li test.txt
> 9280843260537405888 -r--r--r-- 1 kbukin hardware 300 Jul 21 06:36 test.txt
>
> resutls in the following output:
>
> $ ./example test.txt
> ID of containing device: [0,480]
> File type: regular file
> I-node number: -9165900813172145728
> Mode: 100444 (octal)
> Link count: 1
> Ownership: UID=2743 GID=30
> Preferred I/O block size: 32768 bytes
> File size: 300 bytes
> Blocks allocated: 8
> Last status change: Tue Jul 21 06:36:50 2020
> Last file access: Sat Sep 12 14:13:38 2020
> Last file modification: Tue Jul 21 06:36:50 2020
>
> Such erroneous reporting happens for inode values greater than maximum
> value which can be stored in signed long. Casting does not seem to be
> necessary here. Printing inode as unsigned long long fixes the issue.
> ---
> man2/stat.2 | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/man2/stat.2 b/man2/stat.2
> index 7e5417480..82eaefcda 100644
> --- a/man2/stat.2
> +++ b/man2/stat.2
> @@ -681,7 +681,7 @@ main(int argc, char *argv[])
> default: printf("unknown?\en"); break;
> }
>
> - printf("I\-node number: %ld\en", (long) sb.st_ino);
> + printf("I\-node number: %llu\en", (unsigned long long) sb.st_ino);
>
> printf("Mode: %lo (octal)\en",
> (unsigned long) sb.st_mode);
> --
> 2.17.0
>