summaryrefslogblamecommitdiff
path: root/system/sysvinit/utmpx.patch
blob: d874f2e7c013706b40a147ca0447d885205b4992 (plain) (tree)
1
2
3
4
5
6
7
8
9





                                                           


                   



                    
  









                                                                         
 

                    
 







                                                                                
         

                    
 




                                                           








                       
                 





                         


                              









                                                                      
                   





                                                  








































































































































































                                                                                       


                    


                   
                  
       


                     
                  











                                    
                   
























                                                                          
                    












                                                          
                    












                                                                               
                     



















                                                                          
                    












                                                           
                   










                                                                               
                   











                                          
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 <time.h>
 #include <unistd.h>
 #include <stdio.h>
-#include <utmp.h>
+#include <utmpx.h>
 #include <pwd.h>
 #include <fcntl.h>
 #include <signal.h>
@@ -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 <sys/stat.h>
 #include <sys/param.h>
 #include <stdlib.h>
-#include <utmp.h>
+#include <utmpx.h>
 #include <fcntl.h>
 #include <string.h>
 #include <unistd.h>
@@ -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 <string.h>
 #include <signal.h>
 #include <termios.h>
-#ifdef __FreeBSD__
 #include <utmpx.h>
-#else
-#include <utmp.h>
-#endif
 #include <ctype.h>
 #include <stdarg.h>
 #include <sys/ttydefaults.h>
@@ -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 <stdio.h>
-#include <utmp.h>
+#include <utmpx.h>
 #include <time.h>
 #include <stdlib.h>
 #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 <signal.h>
 #include <fcntl.h>
 #include <stdarg.h>
-#ifdef __FreeBSD__
 #include <utmpx.h>
-#else
-#include <utmp.h>
-#endif
 #include <syslog.h>
 #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 <time.h>
 #include <fcntl.h>
 #include <string.h>
-#ifdef __FreeBSD__
 #include <utmpx.h>
-#else
-#include <utmp.h>
-#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();
 }
 
 /*