getty: remove ancient termio support (was using termois anyway)
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 7 Nov 2006 01:52:10 +0000 (01:52 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 7 Nov 2006 01:52:10 +0000 (01:52 -0000)
loginutils/getty.c

index e9b4f07..0c269de 100644 (file)
 #include "busybox.h"
 #include <syslog.h>
 
-#ifdef CONFIG_FEATURE_UTMP
+#if ENABLE_FEATURE_UTMP
 #include <utmp.h>
 #endif
 
- /*
-  * Some heuristics to find out what environment we are in: if it is not
-  * System V, assume it is SunOS 4.
-  */
-
+/*
+ * Some heuristics to find out what environment we are in: if it is not
+ * System V, assume it is SunOS 4.
+ */
 #ifdef LOGIN_PROCESS                    /* defined in System V utmp.h */
 #define SYSV_STYLE                      /* select System V style getty */
-#ifdef CONFIG_FEATURE_WTMP
-extern void updwtmp(const char *filename, const struct utmp *ut);
-#endif
-#endif  /* LOGIN_PROCESS */
-
-#ifdef SYSV_STYLE
 #include <sys/utsname.h>
 #include <time.h>
+#if ENABLE_FEATURE_WTMP
+extern void updwtmp(const char *filename, const struct utmp *ut);
+static void update_utmp(char *line);
 #endif
+#endif  /* LOGIN_PROCESS */
 
- /*
 * Things you may want to modify.
 *
 * 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.
 */
+/*
+ * Things you may want to modify.
+ *
+ * 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.
+ */
 
 /* I doubt there are systems which still need this */
 #undef HANDLE_ALLCAPS
 
-#define _PATH_LOGIN     "/bin/login"
+#define _PATH_LOGIN "/bin/login"
 
- /* 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.
 */
+/* If ISSUE is not defined, getty 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 */
 #define CR              CTL('M')        /* carriage return */
 #define NL              CTL('J')        /* line feed */
@@ -68,7 +64,6 @@ extern void updwtmp(const char *filename, const struct utmp *ut);
 #define DEL             CTL('?')        /* delete */
 
 /* Defaults for line-editing etc. characters; you may want to change this. */
-
 #define DEF_ERASE       DEL             /* default erase character */
 #define DEF_INTR        CTL('C')        /* default interrupt character */
 #define DEF_QUIT        CTL('\\')       /* default quit char */
@@ -77,32 +72,10 @@ extern void updwtmp(const char *filename, const struct utmp *ut);
 #define DEF_EOL         '\n'
 #define DEF_SWITCH      0               /* default switch char */
 
- /*
-  * SunOS 4.1.1 termio is broken. We must use the termios stuff instead,
-  * because the termio -> termios translation does not clear the termios
-  * CIBAUD bits. Therefore, the tty driver would sometimes report that input
-  * baud rate != output baud rate. I did not notice that problem with SunOS
-  * 4.1. We will use termios where available, and termio otherwise.
-  */
-
-/* linux 0.12 termio is broken too, if we use it c_cc[VERASE] isn't set
-   properly, but all is well if we use termios?! */
-
-#ifdef  TCGETS
-#undef  TCGETA
-#undef  TCSETA
-#undef  TCSETAW
-#define termio  termios
-#define TCGETA  TCGETS
-#define TCSETA  TCSETS
-#define TCSETAW TCSETSW
-#endif
-
- /*
-  * When multiple baud rates are specified on the command line, the first one
-  * we will try is the first one specified.
-  */
-
+/*
+ * When multiple baud rates are specified on the command line, the first one
+ * we will try is the first one specified.
+ */
 #define FIRST_SPEED     0
 
 /* Storage for command-line options. */
@@ -134,7 +107,6 @@ static const char opt_string[] = "I:LH:f:hil:mt:wn";
 #define F_NOPROMPT      (1<<10)         /* don't ask for login name! */
 
 /* Storage for things detected while the login name was read. */
-
 struct chardata {
        unsigned char erase;    /* erase character */
        unsigned char kill;     /* kill character */
@@ -146,7 +118,6 @@ struct chardata {
 };
 
 /* Initial values for the above. */
-
 static const struct chardata init_chardata = {
        DEF_ERASE,                              /* default erase character */
        DEF_KILL,                               /* default kill character */
@@ -157,12 +128,6 @@ static const struct chardata init_chardata = {
 #endif
 };
 
-#ifdef SYSV_STYLE
-#ifdef CONFIG_FEATURE_UTMP
-static void update_utmp(char *line);
-#endif
-#endif
-
 /* The following is used for understandable diagnostics. */
 
 /* Fake hostname for ut_host specified on command line. */
@@ -268,7 +233,7 @@ static void xdup2(int srcfd, int dstfd, const char *tty)
 }
 
 /* open_tty - set up tty as standard { input, output, error } */
-static void open_tty(char *tty, struct termio *tp, int local)
+static void open_tty(char *tty, struct termios *tp, int local)
 {
        int chdir_to_root = 0;
 
@@ -318,8 +283,8 @@ static void open_tty(char *tty, struct termio *tp, int local)
         * 5 seconds seems to be a good value.
         */
 
-       if (ioctl(0, TCGETA, tp) < 0)
-               bb_perror_msg_and_die("%s: ioctl(TCGETA)", tty);
+       if (ioctl(0, TCGETS, tp) < 0)
+               bb_perror_msg_and_die("%s: ioctl(TCGETS)", tty);
 
        /*
         * It seems to be a terminal. Set proper protections and ownership. Mode
@@ -369,11 +334,11 @@ static void open_tty(char *tty, struct termio *tp, int local)
                xchdir("/");
 }
 
-/* termio_init - initialize termio settings */
-static void termio_init(struct termio *tp, int speed, struct options *op)
+/* termios_init - initialize termios settings */
+static void termios_init(struct termios *tp, int speed, struct options *op)
 {
        /*
-        * Initial termio settings: 8-bit characters, raw-mode, blocking i/o.
+        * Initial termios settings: 8-bit characters, raw-mode, blocking i/o.
         * Special characters are set after we have read the login name; all
         * reads will be done in raw mode anyway. Errors will be dealt with
         * later on.
@@ -400,7 +365,7 @@ static void termio_init(struct termio *tp, int speed, struct options *op)
                tp->c_cflag |= CRTSCTS;
 #endif
 
-       ioctl(0, TCSETA, tp);
+       ioctl(0, TCSETS, tp);
 
        /* go to blocking input even in local mode */
        fcntl(0, F_SETFL, fcntl(0, F_GETFL, 0) & ~O_NONBLOCK);
@@ -409,7 +374,7 @@ static void termio_init(struct termio *tp, int speed, struct options *op)
 }
 
 /* auto_baud - extract baud rate from modem status message */
-static void auto_baud(char *buf, unsigned size_buf, struct termio *tp)
+static void auto_baud(char *buf, unsigned size_buf, struct termios *tp)
 {
        int speed;
        int vmin;
@@ -441,7 +406,7 @@ static void auto_baud(char *buf, unsigned size_buf, struct termio *tp)
        tp->c_iflag |= ISTRIP;          /* enable 8th-bit stripping */
        vmin = tp->c_cc[VMIN];
        tp->c_cc[VMIN] = 0;                     /* don't block if queue empty */
-       ioctl(0, TCSETA, tp);
+       ioctl(0, TCSETS, tp);
 
        /*
         * Wait for a while, then read everything the modem has said so far and
@@ -467,23 +432,23 @@ static void auto_baud(char *buf, unsigned size_buf, struct termio *tp)
 
        tp->c_iflag = iflag;
        tp->c_cc[VMIN] = vmin;
-       ioctl(0, TCSETA, tp);
+       ioctl(0, TCSETS, tp);
 }
 
 /* next_speed - select next baud rate */
-static void next_speed(struct termio *tp, struct options *op)
+static void next_speed(struct termios *tp, struct options *op)
 {
        static int baud_index = FIRST_SPEED;    /* current speed index */
 
        baud_index = (baud_index + 1) % op->numspeed;
        tp->c_cflag &= ~CBAUD;
        tp->c_cflag |= op->speeds[baud_index];
-       ioctl(0, TCSETA, tp);
+       ioctl(0, TCSETS, tp);
 }
 
 
 /* do_prompt - show login prompt, optionally preceded by /etc/issue contents */
-static void do_prompt(struct options *op, struct termio *tp)
+static void do_prompt(struct options *op, struct termios *tp)
 {
 #ifdef ISSUE
        print_login_issue(op->issue, op->tty);
@@ -506,7 +471,7 @@ static int caps_lock(const char *s)
 /* get_logname - get user name, establish parity, speed, erase, kill, eol */
 /* return NULL on failure, logname on success */
 static char *get_logname(char *logname, unsigned size_logname,
-               struct options *op, struct chardata *cp, struct termio *tp)
+               struct options *op, struct chardata *cp, struct termios *tp)
 {
        char *bp;
        char c;                         /* input character, full eight bits */
@@ -621,8 +586,8 @@ static char *get_logname(char *logname, unsigned size_logname,
        return logname;
 }
 
-/* termio_final - set the final tty mode bits */
-static void termio_final(struct options *op, struct termio *tp, struct chardata *cp)
+/* termios_final - set the final tty mode bits */
+static void termios_final(struct options *op, struct termios *tp, struct chardata *cp)
 {
        /* General terminal-independent stuff. */
 
@@ -681,13 +646,13 @@ static void termio_final(struct options *op, struct termio *tp, struct chardata
 
        /* Finally, make the new settings effective */
 
-       if (ioctl(0, TCSETA, tp) < 0)
-               bb_perror_msg_and_die("%s: ioctl(TCSETA)", op->tty);
+       if (ioctl(0, TCSETS, tp) < 0)
+               bb_perror_msg_and_die("%s: ioctl(TCSETS)", op->tty);
 }
 
 
-#ifdef  SYSV_STYLE
-#ifdef CONFIG_FEATURE_UTMP
+#ifdef SYSV_STYLE
+#if ENABLE_FEATURE_UTMP
 /* update_utmp - update our utmp entry */
 static void update_utmp(char *line)
 {
@@ -695,9 +660,6 @@ static void update_utmp(char *line)
        struct utmp *utp;
        time_t t;
        int mypid = getpid();
-#if ! (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1))
-       struct flock lock;
-#endif
 
        /*
         * The utmp file holds miscellaneous information about things started by
@@ -737,7 +699,7 @@ static void update_utmp(char *line)
        pututline(&ut);
        endutent();
 
-#ifdef CONFIG_FEATURE_WTMP
+#if ENABLE_FEATURE_WTMP
        if (access(bb_path_wtmp_file, R_OK|W_OK) == -1)
                close(creat(bb_path_wtmp_file, 0664));
        updwtmp(bb_path_wtmp_file, &ut);
@@ -752,10 +714,11 @@ int getty_main(int argc, char **argv)
 {
        int nullfd;
        char *logname = NULL;           /* login name, given to /bin/login */
-       // TODO: we can merge these into "struct local"
-       // (will reduce parameter passing)
+       /* Merging these into "struct local" may _seem_ to reduce
+        * parameter passing, but today's gcc will inline
+        * statics which are called once anyway, so don't do that */
        struct chardata chardata;       /* set by get_logname() */
-       struct termio termio;           /* terminal mode bits */
+       struct termios termios;           /* terminal mode bits */
        struct options options = {
                0,                      /* show /etc/issue (SYSV_STYLE) */
                0,                      /* no timeout */
@@ -783,11 +746,12 @@ int getty_main(int argc, char **argv)
        /* 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)
+       if (nullfd) {
+               dup2(nullfd, 0);
                close(nullfd);
+       }
+       dup2(0, 1);
+       dup2(0, 2);
        /* We want special flavor of error_msg_and_die */
        die_sleep = 10;
        msg_eol = "\r\n";
@@ -811,7 +775,7 @@ int getty_main(int argc, char **argv)
        parse_args(argc, argv, &options);
 
 #ifdef SYSV_STYLE
-#ifdef CONFIG_FEATURE_UTMP
+#if ENABLE_FEATURE_UTMP
        /* Update the utmp file. */
        update_utmp(options.tty);
 #endif
@@ -819,7 +783,7 @@ int getty_main(int argc, char **argv)
 
        debug("calling open_tty\n");
        /* Open the tty as standard { input, output, error }. */
-       open_tty(options.tty, &termio, options.flags & F_LOCAL);
+       open_tty(options.tty, &termios, options.flags & F_LOCAL);
 
 #ifdef __linux__
        {
@@ -829,9 +793,9 @@ int getty_main(int argc, char **argv)
                ioctl(0, TIOCSPGRP, &iv);
        }
 #endif
-       /* Initialize the termio settings (raw mode, eight-bit, blocking i/o). */
-       debug("calling termio_init\n");
-       termio_init(&termio, options.speeds[FIRST_SPEED], &options);
+       /* Initialize the termios settings (raw mode, eight-bit, blocking i/o). */
+       debug("calling termios_init\n");
+       termios_init(&termios, options.speeds[FIRST_SPEED], &options);
 
        /* write the modem init string and DON'T flush the buffers */
        if (options.flags & F_INITSTRING) {
@@ -847,7 +811,7 @@ int getty_main(int argc, char **argv)
        /* Optionally detect the baud rate from the modem status message. */
        debug("before autobaud\n");
        if (options.flags & F_PARSE)
-               auto_baud(bb_common_bufsiz1, sizeof(bb_common_bufsiz1), &termio);
+               auto_baud(bb_common_bufsiz1, sizeof(bb_common_bufsiz1), &termios);
 
        /* Set the optional timer. */
        if (options.timeout)
@@ -873,9 +837,9 @@ int getty_main(int argc, char **argv)
                /* Read the login name. */
                debug("reading login name\n");
                logname = get_logname(bb_common_bufsiz1, sizeof(bb_common_bufsiz1),
-                               &options, &chardata, &termio);
+                               &options, &chardata, &termios);
                while (logname == NULL)
-                       next_speed(&termio, &options);
+                       next_speed(&termios, &options);
        }
 
        /* Disable timer. */
@@ -883,9 +847,9 @@ int getty_main(int argc, char **argv)
        if (options.timeout)
                alarm(0);
 
-       /* Finalize the termio settings. */
+       /* Finalize the termios settings. */
 
-       termio_final(&options, &termio, &chardata);
+       termios_final(&options, &termios, &chardata);
 
        /* Now the newline character should be properly written. */