The STRUCT_UTMP typedef was introduced and began being used by readutmp in this Gnulib commit:
commit 622d2c0763777eb909a4fda5048238f524cc36f9 Author: Bruno Haible <br...@clisp.org> AuthorDate: Tue Aug 8 17:36:10 2023 +0200 Commit: Bruno Haible <br...@clisp.org> CommitDate: Tue Aug 8 18:04:53 2023 +0200 readutmp: Return entries with unbounded strings on all platforms. I think it looks nicer than 'struct gl_utmp'. And the prototypes in readutmp.h use them, so it is easier to find references to what the structure is by changing it. Will push the attatched patch in a bit. Collin
>From 22f5a2e6428dc1f3d11ac425d45128a756e526de Mon Sep 17 00:00:00 2001 Message-ID: <22f5a2e6428dc1f3d11ac425d45128a756e526de.1755985637.git.collin.fu...@gmail.com> From: Collin Funk <collin.fu...@gmail.com> Date: Sat, 23 Aug 2025 14:26:45 -0700 Subject: [PATCH] maint: prefer STRUCT_UTMP to struct gl_utmp * cfg.mk (sc_prohibit-struct-gl_utmp): New rule for 'make syntax-check'. * src/pinky.c (time_string, print_entry, scan_entries, short_pinky): Use STRUCT_UTMP instead of struct gl_utmp. * src/uptime.c (print_uptime, print_uptime, uptime): Likewise. * src/users.c (list_entries_users, users): Likewise. * src/who.c (time_string, print_user, print_boottime, print_deadprocs) (print_login, print_initspawn, print_clockchange, print_runlevel) list_entries_who, scan_entries, who): Likewise. --- cfg.mk | 7 +++++++ src/pinky.c | 8 ++++---- src/uptime.c | 6 +++--- src/users.c | 4 ++-- src/who.c | 24 ++++++++++++------------ 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/cfg.mk b/cfg.mk index 2db427012..093305c2b 100644 --- a/cfg.mk +++ b/cfg.mk @@ -311,6 +311,13 @@ sc_prohibit-_gl-attributes: halt='Use ATTRIBUTE_... instead of _GL_ATTRIBUTE_...' \ $(_sc_search_regexp) +# Prefer the STRUCT_UTMP typedef over struct gl_utmp. +sc_prohibit-struct-gl_utmp: + @prohibit='struct gl_utmp' \ + in_vc_files='\.[ch]$$' \ + halt='Use STRUCT_UTMP, not struct gl_utmp' \ + $(_sc_search_regexp) + # Prefer the const declaration form, with const following the type sc_prohibit-const-char: @prohibit='const char \*' \ diff --git a/src/pinky.c b/src/pinky.c index 7fda56ba2..287b3a3f2 100644 --- a/src/pinky.c +++ b/src/pinky.c @@ -179,7 +179,7 @@ idle_string (time_t when) /* Return a time string. */ static char const * -time_string (struct gl_utmp const *utmp_ent) +time_string (STRUCT_UTMP const *utmp_ent) { static char buf[INT_STRLEN_BOUND (intmax_t) + sizeof "-%m-%d %H:%M"]; struct tm *tmp = localtime (&utmp_ent->ut_ts.tv_sec); @@ -196,7 +196,7 @@ time_string (struct gl_utmp const *utmp_ent) /* Display a line of information about UTMP_ENT. */ static void -print_entry (struct gl_utmp const *utmp_ent) +print_entry (STRUCT_UTMP const *utmp_ent) { struct stat stats; time_t last_change; @@ -428,7 +428,7 @@ print_heading (void) /* Display UTMP_BUF, which should have N entries. */ static void -scan_entries (idx_t n, struct gl_utmp const *utmp_buf, +scan_entries (idx_t n, STRUCT_UTMP const *utmp_buf, const int argc_names, char *const argv_names[]) { if (hard_locale (LC_TIME)) @@ -472,7 +472,7 @@ short_pinky (char const *filename, const int argc_names, char *const argv_names[]) { idx_t n_users; - struct gl_utmp *utmp_buf; + STRUCT_UTMP *utmp_buf; if (read_utmp (filename, &n_users, &utmp_buf, READ_UTMP_USER_PROCESS) != 0) error (EXIT_FAILURE, errno, "%s", quotef (filename)); diff --git a/src/uptime.c b/src/uptime.c index 63b355121..0faaf0662 100644 --- a/src/uptime.c +++ b/src/uptime.c @@ -37,7 +37,7 @@ proper_name ("Kaveh Ghazi") static int -print_uptime (idx_t n, struct gl_utmp const *utmp_buf) +print_uptime (idx_t n, STRUCT_UTMP const *utmp_buf) { int status = EXIT_SUCCESS; time_t boot_time = 0; @@ -47,7 +47,7 @@ print_uptime (idx_t n, struct gl_utmp const *utmp_buf) idx_t entries = 0; for (idx_t i = 0; i < n; i++) { - struct gl_utmp const *this = &utmp_buf[i]; + STRUCT_UTMP const *this = &utmp_buf[i]; entries += IS_USER_PROCESS (this); if (UT_TYPE_BOOT_TIME (this)) boot_time = this->ut_ts.tv_sec; @@ -125,7 +125,7 @@ static _Noreturn void uptime (char const *filename, int options) { idx_t n_users; - struct gl_utmp *utmp_buf; + STRUCT_UTMP *utmp_buf; int read_utmp_status = (read_utmp (filename, &n_users, &utmp_buf, options) < 0 ? EXIT_FAILURE : EXIT_SUCCESS); if (read_utmp_status != EXIT_SUCCESS) diff --git a/src/users.c b/src/users.c index 6e730eaf1..5e298acd5 100644 --- a/src/users.c +++ b/src/users.c @@ -42,7 +42,7 @@ userid_compare (const void *v_a, const void *v_b) } static void -list_entries_users (idx_t n, struct gl_utmp const *this) +list_entries_users (idx_t n, STRUCT_UTMP const *this) { char **u = xinmalloc (n, sizeof *u); idx_t i; @@ -83,7 +83,7 @@ static void users (char const *filename, int options) { idx_t n_users; - struct gl_utmp *utmp_buf; + STRUCT_UTMP *utmp_buf; options |= READ_UTMP_USER_PROCESS; if (read_utmp (filename, &n_users, &utmp_buf, options) != 0) error (EXIT_FAILURE, errno, "%s", quotef (filename)); diff --git a/src/who.c b/src/who.c index b481dd2f8..c4205a554 100644 --- a/src/who.c +++ b/src/who.c @@ -205,7 +205,7 @@ idle_string (time_t when, time_t boottime) /* Return a time string. */ static char const * -time_string (struct gl_utmp const *utmp_ent) +time_string (STRUCT_UTMP const *utmp_ent) { static char buf[INT_STRLEN_BOUND (intmax_t) + sizeof "-%m-%d %H:%M"]; struct tm *tmp = localtime (&utmp_ent->ut_ts.tv_sec); @@ -312,7 +312,7 @@ is_tty_writable (struct stat const *pstat) /* Send properly parsed USER_PROCESS info to print_line. The most recent boot time is BOOTTIME. */ static void -print_user (struct gl_utmp const *utmp_ent, time_t boottime) +print_user (STRUCT_UTMP const *utmp_ent, time_t boottime) { struct stat stats; time_t last_change; @@ -426,14 +426,14 @@ print_user (struct gl_utmp const *utmp_ent, time_t boottime) } static void -print_boottime (struct gl_utmp const *utmp_ent) +print_boottime (STRUCT_UTMP const *utmp_ent) { print_line ("", ' ', _("system boot"), time_string (utmp_ent), "", "", "", ""); } static char * -make_id_equals_comment (struct gl_utmp const *utmp_ent) +make_id_equals_comment (STRUCT_UTMP const *utmp_ent) { char const *id = UT_ID (utmp_ent); idx_t idlen = strlen (id); @@ -447,7 +447,7 @@ make_id_equals_comment (struct gl_utmp const *utmp_ent) } static void -print_deadprocs (struct gl_utmp const *utmp_ent) +print_deadprocs (STRUCT_UTMP const *utmp_ent) { static char *exitstr; char *comment = make_id_equals_comment (utmp_ent); @@ -470,7 +470,7 @@ print_deadprocs (struct gl_utmp const *utmp_ent) } static void -print_login (struct gl_utmp const *utmp_ent) +print_login (STRUCT_UTMP const *utmp_ent) { char *comment = make_id_equals_comment (utmp_ent); PIDSTR_DECL_AND_INIT (pidstr, utmp_ent); @@ -483,7 +483,7 @@ print_login (struct gl_utmp const *utmp_ent) } static void -print_initspawn (struct gl_utmp const *utmp_ent) +print_initspawn (STRUCT_UTMP const *utmp_ent) { char *comment = make_id_equals_comment (utmp_ent); PIDSTR_DECL_AND_INIT (pidstr, utmp_ent); @@ -494,7 +494,7 @@ print_initspawn (struct gl_utmp const *utmp_ent) } static void -print_clockchange (struct gl_utmp const *utmp_ent) +print_clockchange (STRUCT_UTMP const *utmp_ent) { /* FIXME: handle NEW_TIME & OLD_TIME both */ print_line ("", ' ', _("clock change"), @@ -502,7 +502,7 @@ print_clockchange (struct gl_utmp const *utmp_ent) } static void -print_runlevel (struct gl_utmp const *utmp_ent) +print_runlevel (STRUCT_UTMP const *utmp_ent) { static char *runlevline, *comment; unsigned char last = utmp_ent->ut_pid / 256; @@ -525,7 +525,7 @@ print_runlevel (struct gl_utmp const *utmp_ent) /* Print the username of each valid entry and the number of valid entries in UTMP_BUF, which should have N elements. */ static void -list_entries_who (idx_t n, struct gl_utmp const *utmp_buf) +list_entries_who (idx_t n, STRUCT_UTMP const *utmp_buf) { idx_t entries = 0; char const *separator = ""; @@ -557,7 +557,7 @@ print_heading (void) /* Display UTMP_BUF, which should have N entries. */ static void -scan_entries (idx_t n, struct gl_utmp const *utmp_buf) +scan_entries (idx_t n, STRUCT_UTMP const *utmp_buf) { char *ttyname_b IF_LINT ( = nullptr); time_t boottime = TYPE_MINIMUM (time_t); @@ -611,7 +611,7 @@ static void who (char const *filename, int options) { idx_t n_users; - struct gl_utmp *utmp_buf; + STRUCT_UTMP *utmp_buf; if (short_list) options |= READ_UTMP_USER_PROCESS; if (read_utmp (filename, &n_users, &utmp_buf, options) != 0) -- 2.51.0