getty: fix -i (was ignored)
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 9 Jan 2011 20:44:51 +0000 (21:44 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 9 Jan 2011 20:44:51 +0000 (21:44 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
include/usage.src.h
loginutils/getty.c

index ea0e6a45207c60f73b294f0fa51a69491f1b83f5..ef2bebd8b3c1ca1fad02944e36ade0f896e3ce19 100644 (file)
@@ -1394,23 +1394,6 @@ INSERT
 #define getsebool_full_usage "\n\n" \
        "       -a      Show all selinux booleans"
 
-#define getty_trivial_usage \
-       "[OPTIONS] BAUD_RATE TTY [TERMTYPE]"
-#define getty_full_usage "\n\n" \
-       "Open a tty, prompt for a login name, then invoke /bin/login\n" \
-     "\nOptions:" \
-     "\n       -h              Enable hardware (RTS/CTS) flow control" \
-     "\n       -i              Don't display /etc/issue before running login" \
-     "\n       -L              Local line, don't do carrier detect" \
-     "\n       -m              Get baud rate from modem's CONNECT status message" \
-     "\n       -w              Wait for a CR or LF before sending /etc/issue" \
-     "\n       -n              Don't prompt the user for a login name" \
-     "\n       -f ISSUE_FILE   Display ISSUE_FILE instead of /etc/issue" \
-     "\n       -l LOGIN        Invoke LOGIN instead of /bin/login" \
-     "\n       -t SEC          Terminate after SEC if no username is read" \
-     "\n       -I INITSTR      Send INITSTR before anything else" \
-     "\n       -H HOST         Log HOST into the utmp file as the hostname" \
-
 #define gunzip_trivial_usage \
        "[-cft] [FILE]..."
 #define gunzip_full_usage "\n\n" \
index 76b0de4499b176561b85cd171133a298763320c2..0f5e333a76122030259a05a884a14d4bc41d04f5 100644 (file)
  * System V, assume it is SunOS 4.
  */
 #ifdef LOGIN_PROCESS                    /* defined in System V utmp.h */
-#include <sys/utsname.h>
+# include <sys/utsname.h>
 #else /* if !sysV style, wtmp/utmp code is off */
-#undef ENABLE_FEATURE_UTMP
-#undef ENABLE_FEATURE_WTMP
-#define ENABLE_FEATURE_UTMP 0
-#define ENABLE_FEATURE_WTMP 0
+# undef ENABLE_FEATURE_UTMP
+# undef ENABLE_FEATURE_WTMP
+# define ENABLE_FEATURE_UTMP 0
+# define ENABLE_FEATURE_WTMP 0
 #endif  /* LOGIN_PROCESS */
 
+
+/* The following is used for understandable diagnostics. */
+#ifdef DEBUGGING
+static FILE *dbf;
+# define DEBUGTERM "/dev/ttyp0"
+# define debug(...) do { fprintf(dbf, __VA_ARGS__); fflush(dbf); } while (0)
+#else
+# define debug(...) ((void)0)
+#endif
+
+
 /*
  * Things you may want to modify.
  *
 #undef HANDLE_ALLCAPS
 #undef ANCIENT_BS_KILL_CHARS
 
+#undef  _PATH_LOGIN
 #define _PATH_LOGIN "/bin/login"
 
-/* If ISSUE is not defined, getty will never display the contents of the
+/* Displayed before the login prompt.
+ * 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 */
+#define ISSUE "/etc/issue"
 
 /* Some shorthands for control characters. */
 #define CTL(x)          ((x) ^ 0100)    /* Assumes ASCII dialect */
@@ -83,7 +96,6 @@
 
 /* Storage for command-line options. */
 struct options {
-       int flags;                      /* toggle switches, see below */
        unsigned timeout;               /* time-out period */
        const char *login;              /* login program */
        const char *tty;                /* name of tty */
@@ -111,7 +123,6 @@ struct chardata {
 #endif
 };
 
-
 /* Initial values for the above. */
 static const struct chardata init_chardata = {
        DEF_ERASE,                              /* default erase character */
@@ -123,30 +134,37 @@ static const struct chardata init_chardata = {
 #endif
 };
 
-static const char opt_string[] ALIGN1 = "I:LH:f:hil:mt:wn";
-#define F_INITSTRING    (1 << 0)        /* -I initstring is set */
-#define F_LOCAL         (1 << 1)        /* -L force local */
-#define F_FAKEHOST      (1 << 2)        /* -H fake hostname */
-#define F_CUSTISSUE     (1 << 3)        /* -f give alternative issue file */
-#define F_RTSCTS        (1 << 4)        /* -h enable RTS/CTS flow control */
-#define F_ISSUE         (1 << 5)        /* -i display /etc/issue */
-#define F_LOGIN         (1 << 6)        /* -l non-default login program */
-#define F_PARSE         (1 << 7)        /* -m process modem status messages */
-#define F_TIMEOUT       (1 << 8)        /* -t time out */
-#define F_WAITCRLF      (1 << 9)        /* -w wait for CR or LF */
-#define F_NOPROMPT      (1 << 10)       /* -n don't ask for login name */
-
-
 #define line_buf bb_common_bufsiz1
 
-/* The following is used for understandable diagnostics. */
-#ifdef DEBUGGING
-static FILE *dbf;
-#define DEBUGTERM "/dev/ttyp0"
-#define debug(...) do { fprintf(dbf, __VA_ARGS__); fflush(dbf); } while (0)
-#else
-#define debug(...) ((void)0)
-#endif
+//usage:#define getty_trivial_usage
+//usage:       "[OPTIONS] BAUD_RATE TTY [TERMTYPE]"
+//usage:#define getty_full_usage "\n\n"
+//usage:       "Open a tty, prompt for a login name, then invoke /bin/login\n"
+//usage:     "\nOptions:"
+//usage:     "\n       -h              Enable hardware (RTS/CTS) flow control"
+//usage:     "\n       -i              Don't display /etc/issue"
+//usage:     "\n       -L              Local line, don't do carrier detect"
+//usage:     "\n       -m              Get baud rate from modem's CONNECT status message"
+//usage:     "\n       -w              Wait for a CR or LF before sending /etc/issue"
+//usage:     "\n       -n              Don't prompt the user for a login name"
+//usage:     "\n       -f ISSUE_FILE   Display ISSUE_FILE instead of /etc/issue"
+//usage:     "\n       -l LOGIN        Invoke LOGIN instead of /bin/login"
+//usage:     "\n       -t SEC          Terminate after SEC if no username is read"
+//usage:     "\n       -I INITSTR      Send INITSTR before anything else"
+//usage:     "\n       -H HOST         Log HOST into the utmp file as the hostname"
+
+static const char opt_string[] ALIGN1 = "I:LH:f:hil:mt:wn";
+#define F_INITSTRING    (1 << 0)   /* -I */
+#define F_LOCAL         (1 << 1)   /* -L */
+#define F_FAKEHOST      (1 << 2)   /* -H */
+#define F_CUSTISSUE     (1 << 3)   /* -f */
+#define F_RTSCTS        (1 << 4)   /* -h */
+#define F_NOISSUE       (1 << 5)   /* -i */
+#define F_LOGIN         (1 << 6)   /* -l */
+#define F_PARSE         (1 << 7)   /* -m */
+#define F_TIMEOUT       (1 << 8)   /* -t */
+#define F_WAITCRLF      (1 << 9)   /* -w */
+#define F_NOPROMPT      (1 << 10)  /* -n */
 
 
 /* bcode - convert speed string to speed code; return <= 0 on failure */
@@ -181,18 +199,18 @@ static void parse_speeds(struct options *op, char *arg)
 static void parse_args(char **argv, struct options *op, char **fakehost_p)
 {
        char *ts;
+       int flags;
 
        opt_complementary = "-2:t+"; /* at least 2 args; -t N */
-       op->flags = getopt32(argv, opt_string,
+       flags = getopt32(argv, opt_string,
                &(op->initstring), fakehost_p, &(op->issue),
                &(op->login), &op->timeout);
-       argv += optind;
-       if (op->flags & F_INITSTRING) {
+       if (flags & F_INITSTRING) {
                op->initstring = xstrdup(op->initstring);
                /* decode \ddd octal codes into chars */
                strcpy_and_process_escape_sequences((char*)op->initstring, op->initstring);
        }
-       op->flags ^= F_ISSUE;           /* invert flag "show /etc/issue" */
+       argv += optind;
        debug("after getopt\n");
 
        /* we loosen up a bit and accept both "baudrate tty" and "tty baudrate" */
@@ -217,17 +235,6 @@ static void open_tty(const char *tty)
 {
        /* Set up new standard input, unless we are given an already opened port. */
        if (NOT_LONE_DASH(tty)) {
-//             struct stat st;
-//             int cur_dir_fd;
-//             int fd;
-
-               /* Sanity checks... */
-//             cur_dir_fd = xopen(".", O_DIRECTORY | O_NONBLOCK);
-//             xchdir("/dev");
-//             xstat(tty, &st);
-//             if (!S_ISCHR(st.st_mode))
-//                     bb_error_msg_and_die("not a character device");
-
                if (tty[0] != '/')
                        tty = xasprintf("/dev/%s", tty); /* will leak it */
 
@@ -236,15 +243,6 @@ static void open_tty(const char *tty)
                close(0);
                /*fd =*/ xopen(tty, O_RDWR | O_NONBLOCK); /* uses fd 0 */
 
-//             /* Restore current directory */
-//             fchdir(cur_dir_fd);
-
-               /* Open the tty as standard input, continued */
-//             xmove_fd(fd, 0);
-//             /* fd is >= cur_dir_fd, and cur_dir_fd gets closed too here: */
-//             while (fd > 2)
-//                     close(fd--);
-
                /* Set proper protections and ownership. */
                fchown(0, 0, 0);        /* 0:0 */
                fchmod(0, 0620);        /* crw--w---- */
@@ -259,7 +257,7 @@ static void open_tty(const char *tty)
 }
 
 /* termios_init - initialize termios settings */
-static void termios_init(struct termios *tp, int speed, struct options *op)
+static void termios_init(struct termios *tp, int speed)
 {
        speed_t ispeed, ospeed;
        /*
@@ -278,7 +276,7 @@ static void termios_init(struct termios *tp, int speed, struct options *op)
                ospeed = cfgetospeed(tp);
        }
        tp->c_cflag = CS8 | HUPCL | CREAD;
-       if (op->flags & F_LOCAL)
+       if (option_mask32 & F_LOCAL)
                tp->c_cflag |= CLOCAL;
        cfsetispeed(tp, ispeed);
        cfsetospeed(tp, ospeed);
@@ -293,7 +291,7 @@ static void termios_init(struct termios *tp, int speed, struct options *op)
 
        /* Optionally enable hardware flow control */
 #ifdef CRTSCTS
-       if (op->flags & F_RTSCTS)
+       if (option_mask32 & F_RTSCTS)
                tp->c_cflag |= CRTSCTS;
 #endif
 
@@ -364,7 +362,8 @@ static void auto_baud(char *buf, unsigned size_buf, struct termios *tp)
 static void do_prompt(struct options *op)
 {
 #ifdef ISSUE
-       print_login_issue(op->issue, op->tty);
+       if (!(option_mask32 & F_NOISSUE))
+               print_login_issue(op->issue, op->tty);
 #endif
        print_login_prompt();
 }
@@ -429,7 +428,7 @@ static char *get_logname(char *logname, unsigned size_logname,
                                return NULL;
 
                        /* Do parity bit handling. */
-                       if (!(op->flags & F_LOCAL) && (c & 0x80)) {       /* "parity" bit on? */
+                       if (!(option_mask32 & F_LOCAL) && (c & 0x80)) {       /* "parity" bit on? */
                                bits = 1;
                                mask = 1;
                                while (mask & 0x7f) {
@@ -499,7 +498,7 @@ static char *get_logname(char *logname, unsigned size_logname,
 }
 
 /* termios_final - set the final tty mode bits */
-static void termios_final(struct options *op, struct termios *tp, struct chardata *cp)
+static void termios_final(struct termios *tp, struct chardata *cp)
 {
        /* General terminal-independent stuff. */
        tp->c_iflag |= IXON | IXOFF;    /* 2-way flow control */
@@ -554,7 +553,7 @@ static void termios_final(struct options *op, struct termios *tp, struct chardat
 #endif
        /* Optionally enable hardware flow control */
 #ifdef CRTSCTS
-       if (op->flags & F_RTSCTS)
+       if (option_mask32 & F_RTSCTS)
                tp->c_cflag |= CRTSCTS;
 #endif
 
@@ -655,24 +654,24 @@ int getty_main(int argc UNUSED_PARAM, char **argv)
 
        /* Initialize the termios settings (raw mode, eight-bit, blocking i/o). */
        debug("calling termios_init\n");
-       termios_init(&termios, options.speeds[0], &options);
+       termios_init(&termios, options.speeds[0]);
 
        /* Write the modem init string and DON'T flush the buffers */
-       if (options.flags & F_INITSTRING) {
+       if (option_mask32 & F_INITSTRING) {
                debug("writing init string\n");
                full_write1_str(options.initstring);
        }
 
        /* Optionally detect the baud rate from the modem status message */
        debug("before autobaud\n");
-       if (options.flags & F_PARSE)
+       if (option_mask32 & F_PARSE)
                auto_baud(line_buf, sizeof(line_buf), &termios);
 
        /* Set the optional timer */
        alarm(options.timeout); /* if 0, alarm is not set */
 
        /* Optionally wait for CR or LF before writing /etc/issue */
-       if (options.flags & F_WAITCRLF) {
+       if (option_mask32 & F_WAITCRLF) {
                char ch;
 
                debug("waiting for cr-lf\n");
@@ -685,7 +684,7 @@ int getty_main(int argc UNUSED_PARAM, char **argv)
        }
 
        logname = NULL;
-       if (!(options.flags & F_NOPROMPT)) {
+       if (!(option_mask32 & F_NOPROMPT)) {
                /* NB:termios_init already set line speed
                 * to options.speeds[0] */
                int baud_index = 0;
@@ -709,7 +708,7 @@ int getty_main(int argc UNUSED_PARAM, char **argv)
        alarm(0);
 
        /* Finalize the termios settings. */
-       termios_final(&options, &termios, &chardata);
+       termios_final(&termios, &chardata);
 
        /* Now the newline character should be properly written. */
        full_write(STDOUT_FILENO, "\n", 1);