getty, sulogin: convert to using bb_msg for syslog output
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 7 Sep 2006 16:20:03 +0000 (16:20 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 7 Sep 2006 16:20:03 +0000 (16:20 -0000)
14 files changed:
coreutils/nohup.c
include/libbb.h
libbb/error_msg_and_die.c
libbb/fflush_stdout_and_exit.c
libbb/herror_msg_and_die.c
libbb/perror_msg_and_die.c
libbb/verror_msg.c
libbb/vinfo_msg.c
libbb/warn_ignoring_args.c
libbb/xfuncs.c
loginutils/getty.c
loginutils/login.c
loginutils/su.c
loginutils/sulogin.c

index 86d78868322279baec9aaf5c421ac660a9f28109..5dd90adcc67a887082ae06a960d95922dcd645f1 100644 (file)
@@ -47,7 +47,7 @@ int nohup_main(int argc, char *argv[])
        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.
 
index c6a9ae577e312ded033f928909368a7fca68e653..6bea048a3002e1bb1a02f74066856b3ef147fb49 100644 (file)
@@ -118,7 +118,9 @@ enum {
        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)));
index f25a1da32e008a4f0b5fb21cb12971bb4c2e6406..29a260bdee8fc0b28008c265d640084c68a5caf7 100644 (file)
@@ -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 @@ void bb_error_msg_and_die(const char *s, ...)
        va_start(p, s);
        bb_verror_msg(s, p, NULL);
        va_end(p);
+       if (die_sleep)
+               sleep(die_sleep);
        exit(bb_default_error_retval);
 }
index 7e8152dd6dd38e0cc3845d1f8f79a7dc79cfe515..245f50864ed93594038786a8f2104e2474f8f1da 100644 (file)
@@ -20,5 +20,7 @@ void bb_fflush_stdout_and_exit(int retval)
        if (fflush(stdout)) {
                retval = bb_default_error_retval;
        }
+       if (die_sleep)
+               sleep(die_sleep);
        exit(retval);
 }
index 285b195ef01e4aa7ce43c11aefb531504b070f24..f115c8e0afacd0c98efae7bcd10b2139943d9666 100644 (file)
@@ -19,5 +19,7 @@ void bb_herror_msg_and_die(const char *s, ...)
        va_start(p, s);
        bb_vherror_msg(s, p);
        va_end(p);
+       if (die_sleep)
+               sleep(die_sleep);
        exit(bb_default_error_retval);
 }
index 5b0464077cf4fa49026d42b3febcaa1da34fa51d..c1cfb956f34a552a349041fa5c46d7933588bc80 100644 (file)
@@ -20,5 +20,7 @@ void bb_perror_msg_and_die(const char *s, ...)
        va_start(p, s);
        bb_vperror_msg(s, p);
        va_end(p);
+       if (die_sleep)
+               sleep(die_sleep);
        exit(bb_default_error_retval);
 }
index d55da73ff3a958624995537cf06146504f543c96..988a7a29338f9390479199b2c62aeb96eeb4750c 100644 (file)
@@ -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 @@ void bb_verror_msg(const char *s, va_list p, const char* strerr)
                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)
index 82fbda2212b068573810191999665c50f0529328..613b013cd629875bb2883c2ef3f1a898a04aed18 100644 (file)
@@ -22,7 +22,7 @@ void bb_vinfo_msg(const char *s, va_list p)
        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);
index af82a6b5bb559a30ff0b82cac9044c79ffe8c5bb..6405ff82645a3c41062dfa7a299256e244a98f7e 100644 (file)
@@ -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");
        }
 }
index 435379de293e5827a63e3c57adfdbeb7bc47669c..4bb05f248b60d148215790fb730d8aa13f2f984d 100644 (file)
@@ -408,7 +408,8 @@ char *xasprintf(const char *format, ...)
 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);
 }
index 3da7c560ae658d305ab64ccd247c4e43cb55846a..71f6b245854c19a3d957cea1f4484a26f2cecfac 100644 (file)
@@ -223,51 +223,6 @@ FILE *dbf;
 #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 @@ static void parse_speeds(struct options *op, char *arg)
        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 @@ static void parse_args(int argc, char **argv, struct options *op)
        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 @@ static void parse_args(int argc, char **argv, struct options *op)
        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 @@ static void open_tty(char *tty, struct termio *tp, int local)
 
                /* 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 @@ static void open_tty(char *tty, struct termio *tp, int local)
         */
 
        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 @@ static void open_tty(char *tty, struct termio *tp, int local)
                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 @@ static void open_tty(char *tty, struct termio *tp, int local)
        (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 @@ static char *get_logname(struct options *op, struct chardata *cp, struct termio
                        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 @@ static char *get_logname(struct options *op, struct chardata *cp, struct termio
                                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 @@ static void termio_final(struct options *op, struct termio *tp, struct chardata
        /* 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 @@ static void update_utmp(char *line)
 #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 @@ int getty_main(int argc, char **argv)
                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 @@ int getty_main(int argc, char **argv)
 #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 @@ int getty_main(int argc, char **argv)
                /* 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 @@ int getty_main(int argc, char **argv)
        /* 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);
 }
 
index f3c7e70f4b38d9b174e12bcc8930ef8d9df48a46..5b4edd8deaea715ba2d263cf4d372e3d6531471d 100644 (file)
@@ -444,7 +444,7 @@ static void checkutmp(int picky)
                }
                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);
index 6410e748f79572f38c060122dc90cacb5997b537..2e0aed6b15df9dfb01675bcf1c062d6b41a2386d 100644 (file)
@@ -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 @@ int su_main ( int argc, char **argv )
        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 @@ int su_main ( int argc, char **argv )
 
        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);
index 1c49d324dc94bcb885afa7216c0e07e36943b278..763a9913a95b67178877fe9b51d0e4d55faa81fb 100644 (file)
@@ -65,7 +65,8 @@ int sulogin_main(int argc, char **argv)
        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 @@ int sulogin_main(int argc, char **argv)
                                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 @@ int sulogin_main(int argc, char **argv)
        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 @@ int sulogin_main(int argc, char **argv)
                        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 @@ int sulogin_main(int argc, char **argv)
 
        run_shell(pwent.pw_shell, 1, 0, 0);
 
-       return (0);
+       return 0;
 }