Hello Konstantin, On 9/13/20 9:40 PM, Konstantin Bukin 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. 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); Thanks for your patches and problem report. But, it seems best to go with Alejandro's suggestion to use uintmax_t + %ju. See the patch that Alejandro has sent. Thanks, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/