Ahem: add new faq entry to list at top of FAQ.html
[oweals/busybox.git] / loginutils / getty.c
index 9950988f40a328a77cad949fee89d74857954e8c..9bad008c60bbabe7c0f40cda71d57730ab017841 100644 (file)
 #include <fcntl.h>
 #include <stdarg.h>
 #include <ctype.h>
-#include <utmp.h>
 #include <getopt.h>
 #include <termios.h>
 #include "busybox.h"
 
+#ifdef CONFIG_FEATURE_UTMP
+#include <utmp.h>
+#endif
+
 #define _PATH_LOGIN     "/bin/login"
 
  /* If USE_SYSLOG is undefined all diagnostics go directly to /dev/console. */
@@ -55,21 +58,22 @@ extern void updwtmp(const char *filename, const struct utmp *ut);
  /*
   * Things you may want to modify.
   *
-  * If ISSUE is not defined, agetty will never display the contents of the
-  * /etc/issue file. You will not want to spit out large "issue" files at the
-  * wrong baud rate. Relevant for System V only.
-  *
   * You may disagree with the default line-editing etc. characters defined
   * below. Note, however, that DEL cannot be used for interrupt generation
   * and for line editing at the same time.
   */
 
 #ifdef SYSV_STYLE
-#define        ISSUE "/etc/issue"              /* displayed before the login prompt */
 #include <sys/utsname.h>
 #include <time.h>
 #endif
 
+ /* If ISSUE is not defined, agetty will never display the contents of the
+  * /etc/issue file. You will not want to spit out large "issue" files at the
+  * wrong baud rate.
+  */
+#define        ISSUE "/etc/issue"              /* displayed before the login prompt */
+
 /* Some shorthands for control characters. */
 
 #define CTL(x)         (x ^ 0100)      /* Assumes ASCII dialect */
@@ -151,7 +155,7 @@ struct options {
 
 /* Storage for things detected while the login name was read. */
 
-static struct chardata {
+struct chardata {
        int erase;                                      /* erase character */
        int kill;                                       /* kill character */
        int eol;                                        /* end-of-line character */
@@ -231,9 +235,11 @@ static int caps_lock(const char *s);
 static int bcode(char *s);
 static void error(const char *fmt, ...) __attribute__ ((noreturn));
 
+#ifdef SYSV_STYLE
 #ifdef CONFIG_FEATURE_UTMP
 static void update_utmp(char *line);
 #endif
+#endif
 
 /* The following is used for understandable diagnostics. */
 
@@ -260,7 +266,11 @@ int getty_main(int argc, char **argv)
                _PATH_LOGIN,                    /* default login program */
                "tty1",                                 /* default tty line */
                "",                                             /* modem init string */
+#ifdef ISSUE
                ISSUE,                                  /* default issue file */
+#else
+               NULL,
+#endif
                0,                                              /* no baud rates known yet */
        };
 
@@ -546,16 +556,11 @@ static void update_utmp(char *line)
 /* open_tty - set up tty as standard { input, output, error } */
 static void open_tty(char *tty, struct termio *tp, int local)
 {
-       /* Get rid of the present standard { output, error} if any. */
-
-       (void) close(1);
-       (void) close(2);
-       errno = 0;                                      /* ignore above errors */
-
        /* Set up new standard input, unless we are given an already opened port. */
 
        if (strcmp(tty, "-")) {
                struct stat st;
+               int fd;
 
                /* Sanity checks... */
 
@@ -568,12 +573,11 @@ static void open_tty(char *tty, struct termio *tp, int local)
 
                /* Open the tty as standard input. */
 
-               (void) close(0);
-               errno = 0;                              /* ignore close(2) errors */
-
                debug("open(2)\n");
-               if (open(tty, O_RDWR | O_NONBLOCK, 0) != 0)
+               fd = open(tty, O_RDWR | O_NONBLOCK, 0);
+               if (dup2(fd, STDIN_FILENO) == -1)
                        error("/dev/%s: cannot open as standard input: %m", tty);
+               close(fd);
 
        } else {
 
@@ -586,9 +590,10 @@ static void open_tty(char *tty, struct termio *tp, int local)
                        error("%s: not open for read/write", tty);
        }
 
-       /* Set up standard output and standard error file descriptors. */
+       /* Replace current standard output/error fd's with new ones */
        debug("duping\n");
-       if (dup(0) != 1 || dup(0) != 2) /* set up stdout and stderr */
+       if (dup2(STDIN_FILENO, STDOUT_FILENO) == -1 ||
+           dup2(STDIN_FILENO, STDERR_FILENO) == -1)
                error("%s: dup problem: %m", tty);      /* we have a problem */
 
        /*