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は、Y2k38修正を含むbuildroot rel.2023-aug用に構築されました。 (ビルドを含む -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE)。

gettybuildrootを使ってビルドしてくださいloginbusybox-1.36.1

/var/run/utmp今、私は次のコード(buildを使って)を使って読もうとしたら -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;
}

ルートがログインして表示されたコードを実行すると、

# /tmp/utmpread
XXXXXXXXX sizeof utmp: 400

しかし、サイズは/var/run/utmp384です。

# 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

そこで私がテストした結果、64ビットでstruct utmp構築され、サイズも400バイトと報告されたことがわかりました。ただし、32ビットを使用してもサイズはまだ384バイトです。timeval_tlogingetty
/var/run/utmptimeval_t

なぜ不一致があるのか​​わかりません(コードで報告されたサイズはstruct utmp400ですが、生成されたファイルはstruct utmp384です)。 GLIBCから来たのか、それともbusybox

ありがとう、

ベストアンサー1

/var/run/utmpwho.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();
...

しかし、質問は残ります。なぜサイズが違うのですか?

おすすめ記事