svn commit: trunk/busybox: coreutils include libbb loginutils

vda at busybox.net vda at busybox.net
Thu Sep 7 16:20:04 UTC 2006


Author: vda
Date: 2006-09-07 09:20:03 -0700 (Thu, 07 Sep 2006)
New Revision: 16065

Log:
getty, sulogin: convert to using bb_msg for syslog output



Modified:
   trunk/busybox/coreutils/nohup.c
   trunk/busybox/include/libbb.h
   trunk/busybox/libbb/error_msg_and_die.c
   trunk/busybox/libbb/fflush_stdout_and_exit.c
   trunk/busybox/libbb/herror_msg_and_die.c
   trunk/busybox/libbb/perror_msg_and_die.c
   trunk/busybox/libbb/verror_msg.c
   trunk/busybox/libbb/vinfo_msg.c
   trunk/busybox/libbb/warn_ignoring_args.c
   trunk/busybox/libbb/xfuncs.c
   trunk/busybox/loginutils/getty.c
   trunk/busybox/loginutils/login.c
   trunk/busybox/loginutils/su.c
   trunk/busybox/loginutils/sulogin.c


Changeset:
Modified: trunk/busybox/coreutils/nohup.c
===================================================================
--- trunk/busybox/coreutils/nohup.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/coreutils/nohup.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -47,7 +47,7 @@
 	if (temp) fdprintf(2,"Writing to %s\n", home ? home : nohupout);
 	dup2(temp ? 1 : nullfd, 2);
 	close(nullfd);
-	signal (SIGHUP, SIG_IGN);
+	signal(SIGHUP, SIG_IGN);
 
 	// Exec our new program.
 

Modified: trunk/busybox/include/libbb.h
===================================================================
--- trunk/busybox/include/libbb.h	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/include/libbb.h	2006-09-07 16:20:03 UTC (rev 16065)
@@ -118,7 +118,9 @@
 	LOGMODE_SYSLOG = 1<<1,
 	LOGMODE_BOTH = LOGMODE_SYSLOG + LOGMODE_STDIO,
 };
+extern const char *msg_eol;
 extern int logmode;
+extern int die_sleep;
 
 extern void bb_show_usage(void) ATTRIBUTE_NORETURN ATTRIBUTE_EXTERNALLY_VISIBLE;
 extern void bb_error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2)));

Modified: trunk/busybox/libbb/error_msg_and_die.c
===================================================================
--- trunk/busybox/libbb/error_msg_and_die.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/libbb/error_msg_and_die.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -13,6 +13,8 @@
 #include <stdlib.h>
 #include "libbb.h"
 
+int die_sleep;
+
 void bb_error_msg_and_die(const char *s, ...)
 {
 	va_list p;
@@ -20,5 +22,7 @@
 	va_start(p, s);
 	bb_verror_msg(s, p, NULL);
 	va_end(p);
+	if (die_sleep)
+		sleep(die_sleep);
 	exit(bb_default_error_retval);
 }

Modified: trunk/busybox/libbb/fflush_stdout_and_exit.c
===================================================================
--- trunk/busybox/libbb/fflush_stdout_and_exit.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/libbb/fflush_stdout_and_exit.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -20,5 +20,7 @@
 	if (fflush(stdout)) {
 		retval = bb_default_error_retval;
 	}
+	if (die_sleep)
+		sleep(die_sleep);
 	exit(retval);
 }

Modified: trunk/busybox/libbb/herror_msg_and_die.c
===================================================================
--- trunk/busybox/libbb/herror_msg_and_die.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/libbb/herror_msg_and_die.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -19,5 +19,7 @@
 	va_start(p, s);
 	bb_vherror_msg(s, p);
 	va_end(p);
+	if (die_sleep)
+		sleep(die_sleep);
 	exit(bb_default_error_retval);
 }

Modified: trunk/busybox/libbb/perror_msg_and_die.c
===================================================================
--- trunk/busybox/libbb/perror_msg_and_die.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/libbb/perror_msg_and_die.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -20,5 +20,7 @@
 	va_start(p, s);
 	bb_vperror_msg(s, p);
 	va_end(p);
+	if (die_sleep)
+		sleep(die_sleep);
 	exit(bb_default_error_retval);
 }

Modified: trunk/busybox/libbb/verror_msg.c
===================================================================
--- trunk/busybox/libbb/verror_msg.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/libbb/verror_msg.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -15,6 +15,7 @@
 #include "libbb.h"
 
 int logmode = LOGMODE_STDIO;
+const char *msg_eol = "\n";
 
 void bb_verror_msg(const char *s, va_list p, const char* strerr)
 {
@@ -28,9 +29,9 @@
 		fprintf(stderr, "%s: ", bb_applet_name);
 		vfprintf(stderr, s, p);
 		if (!strerr)
-			fputc('\n', stderr);
+			fputs(msg_eol, stderr);
 		else
-			fprintf(stderr, ": %s\n", strerr);
+			fprintf(stderr, ": %s%s", strerr, msg_eol);
 	}
 	if (ENABLE_FEATURE_SYSLOG && (logmode & LOGMODE_SYSLOG)) {
 		if (!strerr)

Modified: trunk/busybox/libbb/vinfo_msg.c
===================================================================
--- trunk/busybox/libbb/vinfo_msg.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/libbb/vinfo_msg.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -22,7 +22,7 @@
 	va_copy(p2, p);
 	if (logmode & LOGMODE_STDIO) {
 		vprintf(s, p);
-		putchar('\n');
+		fputs(msg_eol, stdout);
 	}
 	if (ENABLE_FEATURE_SYSLOG && (logmode & LOGMODE_SYSLOG))
 		vsyslog(LOG_INFO, s, p2);

Modified: trunk/busybox/libbb/warn_ignoring_args.c
===================================================================
--- trunk/busybox/libbb/warn_ignoring_args.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/libbb/warn_ignoring_args.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -12,6 +12,6 @@
 void bb_warn_ignoring_args(int n)
 {
 	if (n) {
-		bb_perror_msg("ignoring all arguments");
+		bb_error_msg("ignoring all arguments");
 	}
 }

Modified: trunk/busybox/libbb/xfuncs.c
===================================================================
--- trunk/busybox/libbb/xfuncs.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/libbb/xfuncs.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -408,7 +408,8 @@
 void xprint_and_close_file(FILE *file)
 {
 	// copyfd outputs error messages for us.
-	if (bb_copyfd_eof(fileno(file), 1) == -1) exit(bb_default_error_retval);
+	if (bb_copyfd_eof(fileno(file), 1) == -1)
+		exit(bb_default_error_retval);
 
 	fclose(file);
 }

Modified: trunk/busybox/loginutils/getty.c
===================================================================
--- trunk/busybox/loginutils/getty.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/loginutils/getty.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -223,51 +223,6 @@
 #endif
 
 
-/*
- * output error messages
- */
-static void error(const char *fmt, ...) ATTRIBUTE_NORETURN;
-static void error(const char *fmt, ...)
-{
-	va_list va_alist;
-	char buf[256];
-
-#ifdef CONFIG_SYSLOGD
-	va_start(va_alist, fmt);
-	vsnprintf(buf, sizeof(buf), fmt, va_alist);
-	openlog(bb_applet_name, 0, LOG_AUTH);
-	syslog(LOG_ERR, "%s", buf);
-	closelog();
-#else
-	int fd;
-	size_t l;
-
-	snprintf(buf, sizeof(buf), "%s: ", bb_applet_name);
-	l = strlen(buf);
-	va_start(va_alist, fmt);
-	vsnprintf(buf + l, sizeof(buf) - l, fmt, va_alist);
-	l = strlen(buf);
-	/* truncate if need */
-	if((l + 3) > sizeof(buf))
-		l = sizeof(buf) - 3;
-	/* add \r\n always */
-	buf[l++] = '\r';
-	buf[l++] = '\n';
-	buf[l] = 0;
-	if ((fd = open("/dev/console", 1)) >= 0) {
-		write(fd, buf, l);
-		close(fd);
-	}
-#endif
-
-	va_end(va_alist);
-
-	(void) sleep((unsigned) 10);    /* be kind to init(8) */
-	exit(1);
-}
-
-
-
 /* bcode - convert speed string to speed code; return 0 on failure */
 static int bcode(const char *s)
 {
@@ -291,15 +246,15 @@
 	debug("entered parse_speeds\n");
 	for (cp = strtok(arg, ","); cp != 0; cp = strtok((char *) 0, ",")) {
 		if ((op->speeds[op->numspeed++] = bcode(cp)) <= 0)
-			error("bad speed: %s", cp);
+			bb_error_msg_and_die("bad speed: %s", cp);
 		if (op->numspeed > MAX_SPEED)
-			error("too many alternate speeds");
+			bb_error_msg_and_die("too many alternate speeds");
 	}
 	debug("exiting parsespeeds\n");
 }
 
 
-/* parse-args - parse command-line arguments */
+/* parse_args - parse command-line arguments */
 static void parse_args(int argc, char **argv, struct options *op)
 {
 	char *ts;
@@ -327,7 +282,7 @@
 	op->flags ^= F_ISSUE;           /* revert flag show /etc/issue */
 	if(op->flags & F_TIMEOUT) {
 		if ((op->timeout = atoi(ts)) <= 0)
-			error("bad timeout value: %s", ts);
+			bb_error_msg_and_die("bad timeout value: %s", ts);
 	}
 	debug("after getopt loop\n");
 	if (argc < optind + 2)          /* check parameter count */
@@ -350,6 +305,12 @@
 	debug("exiting parseargs\n");
 }
 
+static void xdup2(int srcfd, int dstfd, const char *tty)
+{
+	if(dup2(srcfd, dstfd) == -1)
+		bb_perror_msg_and_die("%s: dup", tty);
+}
+
 /* open_tty - set up tty as standard { input, output, error } */
 static void open_tty(char *tty, struct termio *tp, int local)
 {
@@ -363,37 +324,34 @@
 
 		/* Sanity checks... */
 
-		if (chdir("/dev"))
-			error("/dev: chdir() failed: %m");
+		xchdir("/dev");
 		chdir_to_root = 1;
-		if (stat(tty, &st) < 0)
-			error("/dev/%s: %m", tty);
+		xstat(tty, &st);
 		if ((st.st_mode & S_IFMT) != S_IFCHR)
-			error("/dev/%s: not a character device", tty);
+			bb_error_msg_and_die("%s: not a character device", tty);
 
 		/* Open the tty as standard input. */
 
-		close(0);
 		debug("open(2)\n");
-		fd = open(tty, O_RDWR | O_NONBLOCK, 0);
-		if (fd != 0)
-			error("/dev/%s: cannot open as standard input: %m", tty);
+		fd = xopen(tty, O_RDWR | O_NONBLOCK);
+		if(fd) {
+			xdup2(fd, 0, tty);
+			close(fd);
+		}		
 	} else {
-
 		/*
 		 * Standard input should already be connected to an open port. Make
 		 * sure it is open for read/write.
 		 */
 
 		if ((fcntl(0, F_GETFL, 0) & O_RDWR) != O_RDWR)
-			error("%s: not open for read/write", tty);
+			bb_error_msg_and_die("%s: not open for read/write", tty);
 	}
 
 	/* Replace current standard output/error fd's with new ones */
 	debug("duping\n");
-	if (dup2(STDIN_FILENO, STDOUT_FILENO) == -1 ||
-	    dup2(STDIN_FILENO, STDERR_FILENO) == -1)
-		error("%s: dup problem: %m", tty);      /* we have a problem */
+	xdup2(0, 1, tty);
+	xdup2(0, 2, tty);
 
 	/*
 	 * The following ioctl will fail if stdin is not a tty, but also when
@@ -405,7 +363,7 @@
 	 */
 
 	if (ioctl(0, TCGETA, tp) < 0)
-		error("%s: ioctl: %m", tty);
+		bb_perror_msg_and_die("%s: ioctl(TCGETA)", tty);
 
 	/*
 	 * It seems to be a terminal. Set proper protections and ownership. Mode
@@ -428,10 +386,8 @@
 		if (!strncmp(tty, "tty", 3) && isdigit(tty[3])) {
 			char *vcs, *vcsa;
 
-			if (!(vcs = strdup(tty)))
-				error("Can't malloc for vcs");
-			if (!(vcsa = malloc(strlen(tty) + 2)))
-				error("Can't malloc for vcsa");
+			vcs = xstrdup(tty);
+			vcsa = xmalloc(strlen(tty) + 2);
 			strcpy(vcs, "vcs");
 			strcpy(vcs + 3, tty + 3);
 			strcpy(vcsa, "vcsa");
@@ -451,8 +407,8 @@
 	(void) chown(tty, 0, 0);        /* root, sys */
 	(void) chmod(tty, 0622);        /* crw--w--w- */
 #endif
-	if(chdir_to_root && chdir("/"))
-		error("chdir to / failed: %m");
+	if (chdir_to_root)
+		xchdir("/");
 }
 
 /* termio_init - initialize termio settings */
@@ -634,7 +590,7 @@
 			if (read(0, &c, 1) < 1) {
 				if (errno == EINTR || errno == EIO)
 					exit(0);
-				error("%s: read: %m", op->tty);
+				bb_perror_msg_and_die("%s: read", op->tty);
 			}
 			/* Do BREAK handling elsewhere. */
 
@@ -681,7 +637,7 @@
 				if (!isascii(ascval) || !isprint(ascval)) {
 					/* ignore garbage characters */ ;
 				} else if (bp - logname >= sizeof(logname) - 1) {
-					error("%s: input overrun", op->tty);
+					bb_error_msg_and_die("%s: input overrun", op->tty);
 				} else {
 					(void) write(1, &c, 1); /* echo the character */
 					*bp++ = ascval; /* and store it */
@@ -759,7 +715,7 @@
 	/* Finally, make the new settings effective */
 
 	if (ioctl(0, TCSETA, tp) < 0)
-		error("%s: ioctl: TCSETA: %m", op->tty);
+		bb_perror_msg_and_die("%s: ioctl(TCSETA)", op->tty);
 }
 
 
@@ -828,6 +784,7 @@
 #undef logname
 int getty_main(int argc, char **argv)
 {
+	int nullfd;
 	char *logname = NULL;           /* login name, given to /bin/login */
 	struct chardata chardata;       /* set by get_logname() */
 	struct termio termio;           /* terminal mode bits */
@@ -845,6 +802,29 @@
 		0,                      /* no baud rates known yet */
 	};
 
+	/* Already too late because of theoretical
+	 * possibility of getty --help somehow triggered
+	 * inadvertently before we reach this. Oh well. */
+	close(0);
+	close(1);
+	close(2);
+#ifdef __linux__
+	setsid();
+#endif
+	/* We want special flavor of error_msg_and_die */
+	die_sleep = 10;		
+	msg_eol = "\r\n";
+	/* Was "/dev/console". Why should we spam *system console*
+	 * if there is a problem with getty on /dev/ttyS15?... */
+	nullfd = xopen(bb_dev_null, O_RDWR); 
+	dup2(nullfd, 0);
+	dup2(nullfd, 1);
+	dup2(nullfd, 2);
+	if(nullfd > 2)
+		close(nullfd);
+	openlog(bb_applet_name, LOG_PID, LOG_AUTH);
+	logmode = LOGMODE_BOTH;
+
 #ifdef DEBUGGING
 	dbf = xfopen(DEBUGTERM, "w");
 
@@ -859,18 +839,11 @@
 #endif
 
 	/* Parse command-line arguments. */
-
 	parse_args(argc, argv, &options);
 
-#ifdef __linux__
-	setsid();
-#endif
-
-	/* Update the utmp file. */
-
-
-#ifdef  SYSV_STYLE
+#ifdef SYSV_STYLE
 #ifdef CONFIG_FEATURE_UTMP
+	/* Update the utmp file. */
 	update_utmp(options.tty);
 #endif
 #endif
@@ -931,8 +904,9 @@
 		/* Read the login name. */
 		debug("reading login name\n");
 		/* while ((logname = get_logname(&options, &chardata, &termio)) == 0) */
-		while ((logname = get_logname(&options, &chardata, &termio)) ==
-			   NULL) next_speed(&termio, &options);
+		logname = get_logname(&options, &chardata, &termio);
+		while (logname == NULL)
+			next_speed(&termio, &options);
 	}
 
 	/* Disable timer. */
@@ -951,6 +925,6 @@
 	/* Let the login program take care of password validation. */
 
 	(void) execl(options.login, options.login, "--", logname, (char *) 0);
-	error("%s: can't exec %s: %m", options.tty, options.login);
+	bb_error_msg_and_die("%s: can't exec %s", options.tty, options.login);
 }
 

Modified: trunk/busybox/loginutils/login.c
===================================================================
--- trunk/busybox/loginutils/login.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/loginutils/login.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -444,7 +444,7 @@
 		}
 		if (strncmp(line, "/dev/", 5) == 0)
 			line += 5;
-		memset((void *) &utent, 0, sizeof utent);
+		memset(&utent, 0, sizeof utent);
 		utent.ut_type = LOGIN_PROCESS;
 		utent.ut_pid = pid;
 		strncpy(utent.ut_line, line, sizeof utent.ut_line);

Modified: trunk/busybox/loginutils/su.c
===================================================================
--- trunk/busybox/loginutils/su.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/loginutils/su.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -8,7 +8,7 @@
 #include "busybox.h"
 #include <syslog.h>
 
-int su_main ( int argc, char **argv )
+int su_main(int argc, char **argv)
 {
 	unsigned long flags;
 	char *opt_shell = 0;
@@ -27,7 +27,7 @@
 	if (optind < argc  && argv[optind][0] == '-' && argv[optind][1] == 0) {
 		flags |= SU_OPT_l;
 		++optind;
-    }
+	}
 
 	/* get user if specified */
 	if (optind < argc) opt_username = argv [optind++];
@@ -81,7 +81,7 @@
 
 	change_identity(pw);
 	setup_environment(opt_shell, flags & SU_OPT_l, !(flags & SU_OPT_mp), pw);
-    USE_SELINUX(set_current_security_context(NULL);)
+	USE_SELINUX(set_current_security_context(NULL);)
 
 	/* Never returns */
 	run_shell(opt_shell, flags & SU_OPT_l, opt_command, (const char**)opt_args);

Modified: trunk/busybox/loginutils/sulogin.c
===================================================================
--- trunk/busybox/loginutils/sulogin.c	2006-09-07 16:03:45 UTC (rev 16064)
+++ trunk/busybox/loginutils/sulogin.c	2006-09-07 16:20:03 UTC (rev 16065)
@@ -65,7 +65,8 @@
 	struct spwd *spwd = NULL;
 #endif
 
-	openlog("sulogin", LOG_PID | LOG_CONS | LOG_NOWAIT, LOG_AUTH);
+	openlog("sulogin", LOG_PID | LOG_NOWAIT, LOG_AUTH);
+	logmode = LOGMODE_BOTH;
 	if (argc > 1) {
 		if (strncmp(argv[1], "-t", 2) == 0) {
 			if (argv[1][2] == '\0') { /* -t NN */
@@ -92,28 +93,24 @@
 				dup(0);
 				dup(0);
 			} else {
-				syslog(LOG_WARNING, "cannot open %s\n", device);
-				exit(EXIT_FAILURE);
+				/* Well, it will go only to syslog :) */
+				bb_perror_msg_and_die("Cannot open %s", device);
 			}
 		}
 	}
-	if (access(bb_path_passwd_file, 0) == -1) {
-		syslog(LOG_WARNING, "No password file\n");
-		bb_error_msg_and_die("No password file");
-	}
 	if (!isatty(0) || !isatty(1) || !isatty(2)) {
 		exit(EXIT_FAILURE);
 	}
+	if (access(bb_path_passwd_file, 0) == -1) {
+		bb_error_msg_and_die("No password file");
+	}
 
-
 	/* Clear out anything dangerous from the environment */
 	for (p = forbid; *p; p++)
 		unsetenv(*p);
 
-
 	signal(SIGALRM, catchalarm);
 	if (!(pwd = getpwnam(name))) {
-		syslog(LOG_WARNING, "No password entry for `root'");
 		bb_error_msg_and_die("No password entry for `root'");
 	}
 	pwent = *pwd;
@@ -131,9 +128,10 @@
 	while (1) {
 		cp = bb_askpass(timeout, SULOGIN_PROMPT);
 		if (!cp || !*cp) {
-			puts("\n");
+			puts("\n"); /* Why only on error path? */
 			fflush(stdout);
-			syslog(LOG_INFO, "Normal startup\n");
+			/* Why only to syslog? */
+			syslog(LOG_INFO, "Normal startup");
 			exit(EXIT_SUCCESS);
 		} else {
 			safe_strncpy(pass, cp, sizeof(pass));
@@ -143,15 +141,11 @@
 			break;
 		}
 		bb_do_delay(FAIL_DELAY);
-		puts("Login incorrect");
-		fflush(stdout);
-		syslog(LOG_WARNING, "Incorrect root password\n");
+		bb_error_msg("Incorrect root password");
 	}
 	memset(pass, 0, strlen(pass));
 	signal(SIGALRM, SIG_DFL);
-	puts("Entering System Maintenance Mode\n");
-	fflush(stdout);
-	syslog(LOG_INFO, "System Maintenance Mode\n");
+	bb_info_msg("Entering System Maintenance Mode");
 
 #if ENABLE_SELINUX
 	renew_current_security_context();
@@ -159,5 +153,5 @@
 
 	run_shell(pwent.pw_shell, 1, 0, 0);
 
-	return (0);
+	return 0;
 }




More information about the busybox-cvs mailing list