diff -ur a/src/dowall.c b/src/dowall.c --- a/src/dowall.c 2022-05-04 08:18:19.100000000 +0000 +++ b/src/dowall.c 2022-05-04 08:18:29.040000000 +0000 @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include #include #include @@ -160,7 +160,7 @@ { FILE *tp; struct sigaction sa; - struct utmp *utmp; + struct utmpx *utmp; time_t t; char term[UT_LINESIZE+ strlen(_PATH_DEV) + 1]; char line[256]; @@ -217,9 +217,9 @@ sigemptyset(&sa.sa_mask); sigaction(SIGALRM, &sa, NULL); - setutent(); + setutxent(); - while ((utmp = getutent()) != NULL) { + while ((utmp = getutxent()) != NULL) { if(utmp->ut_type != USER_PROCESS || utmp->ut_user[0] == 0) continue; if (strncmp(utmp->ut_line, _PATH_DEV, strlen(_PATH_DEV)) == 0) { @@ -253,7 +253,7 @@ if (fd >= 0) close(fd); if (tp != NULL) fclose(tp); } - endutent(); + endutxent(); exit(0); } diff -ur a/src/halt.c b/src/halt.c --- a/src/halt.c 2022-05-04 08:18:19.100000000 +0000 +++ b/src/halt.c 2022-05-04 08:18:29.030000000 +0000 @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include #include #include @@ -95,7 +95,7 @@ */ int get_runlevel(void) { - struct utmp *ut; + struct utmpx *ut; char *r; int runlevel, status; @@ -123,8 +123,8 @@ /* * Find runlevel in utmp. */ - setutent(); - while ((ut = getutent()) != NULL) { + setutxent(); + while ((ut = getutxent()) != NULL) { #if RUNLVL_PICKY /* * Only accept value if it's from after boottime. @@ -136,7 +136,7 @@ return (ut->ut_pid & 255); #endif } - endutent(); + endutxent(); /* Did not find utmp entry, try to read from log file */ status = Read_Runlevel_Log(&runlevel); diff -ur a/src/init.c b/src/init.c --- a/src/init.c 2022-05-04 08:18:19.100000000 +0000 +++ b/src/init.c 2022-05-04 08:22:24.310000000 +0000 @@ -53,11 +53,7 @@ #include #include #include -#ifdef __FreeBSD__ #include -#else -#include -#endif #include #include #include @@ -149,7 +145,7 @@ int sleep_time = WAIT_BETWEEN_SIGNALS; /* Sleep time between TERM and KILL */ char *argv0; /* First arguments; show up in ps listing */ int maxproclen; /* Maximal length of argv[0] with \0 */ -struct utmp utproto; /* Only used for sizeof(utproto.ut_id) */ +struct utmpx utproto; /* Only used for sizeof(utproto.ut_id) */ char *console_dev; /* Console device. */ int pipe_fd = -1; /* /run/initctl */ int did_boot = 0; /* Did we already do BOOT* stuff? */ @@ -2322,12 +2318,6 @@ static void redo_utmp_wtmp(void) { - struct stat ustat; - const int ret = stat(UTMP_FILE, &ustat); - - if ((ret < 0) || (ustat.st_size == 0)) - wrote_utmp_rlevel = wrote_utmp_reboot = 0; - if ((wrote_wtmp_reboot == 0) || (wrote_utmp_reboot == 0)) write_utmp_wtmp("reboot", "~~", 0, BOOT_TIME, "~"); @@ -2862,8 +2852,6 @@ console_init(); if (!reload) { - int fd; - /* Close whatever files are open, and reset the console. */ close(0); close(1); @@ -2877,13 +2865,6 @@ setenv("PATH", PATH_DEFAULT, 1 /* Overwrite */); /* - * Initialize /var/run/utmp (only works if /var is on - * root and mounted rw) - */ - if ((fd = open(UTMP_FILE, O_WRONLY|O_CREAT|O_TRUNC, 0644)) >= 0) - close(fd); - - /* * Say hello to the world */ initlog(L_CO, bootmsg, "booting"); diff -ur a/src/runlevel.c b/src/runlevel.c --- a/src/runlevel.c 2022-05-04 08:18:19.100000000 +0000 +++ b/src/runlevel.c 2022-05-04 08:21:34.870000000 +0000 @@ -22,7 +22,7 @@ */ #include -#include +#include #include #include #include "runlevellog.h" @@ -31,23 +31,23 @@ int argc; char **argv; { - struct utmp *ut; + struct utmpx *ut; char prev; int status, runlevel; if (argc > 1) utmpname(argv[1]); - setutent(); - while ((ut = getutent()) != NULL) { + setutxent(); + while ((ut = getutxent()) != NULL) { if (ut->ut_type == RUN_LVL) { prev = ut->ut_pid / 256; if (prev == 0) prev = 'N'; printf("%c %c\n", prev, ut->ut_pid % 256); - endutent(); + endutxent(); exit(0); } } - endutent(); + endutxent(); status = Read_Runlevel_Log(&runlevel); if (status) diff -ur a/src/shutdown.c b/src/shutdown.c --- a/src/shutdown.c 2022-05-04 08:18:19.100000000 +0000 +++ b/src/shutdown.c 2022-05-04 08:22:47.300000000 +0000 @@ -54,11 +54,7 @@ #include #include #include -#ifdef __FreeBSD__ #include -#else -#include -#endif #include #include "paths.h" #include "reboot.h" @@ -355,6 +351,9 @@ for(i = 3; i < 20; i++) close(i); close(255); + /* Record the fact that we're going down */ + write_wtmp("shutdown", "~~", 0, RUN_LVL, "~~"); + /* First idle init. */ if (kill(1, SIGTSTP) < 0) { fprintf(stderr, "shutdown: can't idle init: %s.\r\n", strerror(errno)); @@ -381,9 +380,6 @@ /* Give init the chance to collect zombies. */ /* sleep(1); */ - /* Record the fact that we're going down */ - write_wtmp("shutdown", "~~", 0, RUN_LVL, "~~"); - /* This is for those who have quota installed. */ #if defined(ACCTON_OFF) # if (ACCTON_OFF > 1) && (_BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)) @@ -514,7 +510,7 @@ struct sigaction sa; struct tm *lt; struct stat st; - struct utmp *ut; + struct utmpx *ut; time_t t, target_time; char *halttype; char *downusers[32]; @@ -634,7 +630,7 @@ fclose(fp); /* Now walk through /var/run/utmp to find logged in users. */ - while(!user_ok && (ut = getutent()) != NULL) { + while(!user_ok && (ut = getutxent()) != NULL) { /* See if this is a user process on a VC. */ if (ut->ut_type != USER_PROCESS) continue; @@ -660,7 +656,7 @@ break; } } - endutent(); + endutxent(); /* See if user was allowed. */ if (!user_ok) { diff -ur a/src/utmp.c b/src/utmp.c --- a/src/utmp.c 2022-05-04 08:18:19.100000000 +0000 +++ b/src/utmp.c 2022-05-04 08:22:04.640000000 +0000 @@ -32,11 +32,7 @@ #include #include #include -#ifdef __FreeBSD__ #include -#else -#include -#endif #include "init.h" #include "initreq.h" @@ -50,7 +46,11 @@ # define HAVE_UPDWTMP 1 # endif #else -# define HAVE_UPDWTMP 0 +# define HAVE_UPDWTMPX 1 +#endif + +#ifndef WTMP_FILE +# define WTMP_FILE "/var/run/wtmp" #endif @@ -64,24 +64,10 @@ int type, /* TYPE of entry */ char *line) /* Which line is this */ { - int fd; - struct utmp utmp; + struct utmpx utmp; struct utsname uname_buf; struct timeval tv; - /* - * Can't do much if WTMP_FILE is not present or not writable. - */ - if (access(WTMP_FILE, W_OK) < 0) - return; - - /* - * Try to open the wtmp file. Note that we even try - * this if we have updwtmp() so we can see if the - * wtmp file is accessible. - */ - if ((fd = open(WTMP_FILE, O_WRONLY|O_APPEND)) < 0) return; - #ifdef INIT_MAIN /* * Note if we are going to write a boot record. @@ -119,13 +105,9 @@ * Zero the fields and enter new fields. */ memset(&utmp, 0, sizeof(utmp)); -#if defined(__GLIBC__) gettimeofday(&tv, NULL); utmp.ut_tv.tv_sec = tv.tv_sec; utmp.ut_tv.tv_usec = tv.tv_usec; -#else - time(&utmp.ut_time); -#endif utmp.ut_pid = pid; utmp.ut_type = type; strncpy(utmp.ut_name, user, sizeof(utmp.ut_name)); @@ -136,12 +118,7 @@ if (uname(&uname_buf) == 0) strncpy(utmp.ut_host, uname_buf.release, sizeof(utmp.ut_host)); -#if HAVE_UPDWTMP - updwtmp(WTMP_FILE, &utmp); -#else - write(fd, (char *)&utmp, sizeof(utmp)); -#endif - close(fd); + updwtmpx(WTMP_FILE, &utmp); } /* @@ -156,17 +133,11 @@ char *line, /* LINE if used. */ char *oldline) /* Line of old utmp entry. */ { - struct utmp utmp; - struct utmp tmp; - struct utmp *utmptr; + struct utmpx utmp; + struct utmpx tmp; + struct utmpx *utmptr; struct timeval tv; - /* - * Can't do much if UTMP_FILE is not present or not writable. - */ - if (access(UTMP_FILE, W_OK) < 0) - return; - #ifdef INIT_MAIN /* * Note if we are going to write a boot record. @@ -207,13 +178,9 @@ utmp.ut_type = type; utmp.ut_pid = pid; strncpy(utmp.ut_id, id, sizeof(utmp.ut_id)); -#if defined(__GLIBC__) gettimeofday(&tv, NULL); utmp.ut_tv.tv_sec = tv.tv_sec; utmp.ut_tv.tv_usec = tv.tv_usec; -#else - time(&utmp.ut_time); -#endif strncpy(utmp.ut_user, user, UT_NAMESIZE); if (line) strncpy(utmp.ut_line, line, UT_LINESIZE); @@ -225,9 +192,9 @@ /* * Find existing entry for the tty line. */ - setutent(); + setutxent(); tmp = utmp; - if ((utmptr = getutid(&tmp)) != NULL) { + if ((utmptr = getutxid(&tmp)) != NULL) { strncpy(utmp.ut_line, utmptr->ut_line, UT_LINESIZE); if (oldline) strncpy(oldline, utmptr->ut_line, UT_LINESIZE); @@ -237,9 +204,9 @@ /* * Update existing utmp file. */ - setutent(); - pututline(&utmp); - endutent(); + setutxent(); + pututxline(&utmp); + endutxent(); } /*