使用 GLIBC 2.38 构建的 Linux 中 /var/run/utmp 和 `struct utmp` 的大小不匹配(Y2k38 修复)

使用 GLIBC 2.38 构建的 Linux 中 /var/run/utmp 和 `struct utmp` 的大小不匹配(Y2k38 修复)

我正在开发一个嵌入式Linux系统(kernel-5.10.24),这是一个32位系统,它正在使用 GLibc-2.38 来修复 Y2k38。

rootfs 是根据 buildroot rel.2023-aug 构建的,并带有 Y2k38 修复。 (用 构建 -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE)。

getty并从buildroot 中login构建。busybox-1.36.1

现在,当我尝试/var/run/utmp使用以下代码(也使用 构建-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;
}

当 root 登录并运行代码时,它显示,

# /tmp/utmpread
XXXXXXXXX sizeof utmp: 400

但大小/var/run/utmp是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

因此,根据我的测试,似乎struct utmp已经构建为 64 位timeval_t,并且logingetty报告其大小为 400Bytes。
但大小/var/run/utmp仍然是 384 Bytes,即使用 32bit timeval_t

我不知道为什么会出现不匹配(代码报告的大小是struct utmp400,但生成的文件struct utmp是384),是来自GLIBC还是来自busybox

谢谢,

答案1

/var/run/utmp我通过参考who.cbusybox找到了正确读取的解决方案。

    struct utmp *ut;

    setutent();
    while ((ut = getutent()) != NULL) {
        if (ut->ut_type == USER_PROCESS) {
            if (strcmp(ut->ut_user, "root") == 0) {
                printf("root logged in\n");
            }
        }
    }

    endutent();
...

但问题仍然存在,为什么尺寸不同?

相关内容