I am working on an embedded Linux system (kernel-5.10.24), which is a 32bit system, and it is using GLibc-2.38 to fix Y2k38.
The rootfs is built from buildroot rel.2023-aug with Y2k38 fix. (built with -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE).
There are getty and login built from busybox-1.36.1 in the buildroot.
Now I found strange things when I tried to read the /var/run/utmp with following codes (also built with -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE).
#include <stdio.h> #include <utmp.h> #include <time.h> #include <string.h> int main() { FILE *fp; struct utmp ut; printf("XXXXXXXXX sizeof utmp: %ld\n", sizeof(ut)); fp = fopen("/var/run/utmp", "r"); if (fp == NULL) { perror("Error opening UTMP file"); return 1; } while (fread(&ut, sizeof(struct utmp), 1, fp) == 1) { if (ut.ut_type == USER_PROCESS) { printf("Login Name: %s\n", ut.ut_user); printf("Login Time: %s", ctime(&ut.ut_tv.tv_sec)); } } fclose(fp); return 0; } When root is logged in and run the code, it showed,
# /tmp/utmpread XXXXXXXXX sizeof utmp: 400 But the size of /var/run/utmp is 384.
# stat /var/run/utmp File: /var/run/utmp Size: 384 Blocks: 8 IO Block: 4096 regular file Device: fh/15d Inode: 8 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 1970-01-01 01:14:24.270002128 +0000 Modify: 1970-01-01 00:03:12.000000000 +0000 Change: 1970-01-01 01:12:47.210002082 +0000 So based on my tests, it seemed that struct utmp is already built as 64bit of timeval_t, and the login and getty also report its size is 400Bytes.
But the size of /var/run/utmp is still 384 Bytes, which is using 32bit timeval_t.
I don't know why there is the mismatch (the code reports size of struct utmp is 400, but the file generated from struct utmp is 384), is it from the GLIBC or from the busybox?
Thanks,