getty: add sleep before initial tcdrain; reduce another sleep from 1 to 0.1s
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 23 Jan 2011 23:28:43 +0000 (00:28 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 23 Jan 2011 23:28:43 +0000 (00:28 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
loginutils/getty.c

index e60af3aa3674d0bcdcfc09a7c456497e39d87852..13b341db58236f1c1d5366b6c4935af03f1a37a9 100644 (file)
@@ -275,10 +275,13 @@ static void open_tty(const char *tty)
 /* initialize termios settings */
 static void termios_init(struct termios *tp, int speed)
 {
-       /* Flush input and output queues, important for modems! */
-       /* TODO: sleep(1)? Users report lost chars, and I hesitate
-        * to use tcdrain here instead of tcflush */
-       tcflush(0, TCIOFLUSH);
+       /* Flush input and output queues, important for modems!
+        * Users report losing previously queued output chars, and I hesitate
+        * to use tcdrain here instead of tcflush - I imagine it can block.
+        * Using small sleep instead.
+        */
+       usleep(100*1000); /* 0.1 sec */
+       tcflush(STDIN_FILENO, TCIOFLUSH);
 
        /* Set speed if it wasn't specified as "0" on command line. */
        if (speed != B0)
@@ -402,8 +405,8 @@ static char *get_logname(char *logname, unsigned size_logname,
        /* NB: *cp is pre-initialized with init_chardata */
 
        /* Flush pending input (esp. after parsing or switching the baud rate). */
-       sleep(1);
-       tcflush(0, TCIOFLUSH);
+       usleep(100*1000); /* 0.1 sec */
+       tcflush(STDIN_FILENO, TCIOFLUSH);
 
        /* Prompt for and read a login name. */
        logname[0] = '\0';
@@ -659,7 +662,7 @@ int getty_main(int argc UNUSED_PARAM, char **argv)
         * by patching the SunOS kernel variable "zsadtrlow" to a larger value;
         * 5 seconds seems to be a good value.
         */
-       if (tcgetattr(0, &termios) < 0)
+       if (tcgetattr(STDIN_FILENO, &termios) < 0)
                bb_perror_msg_and_die("tcgetattr");
 
        pid = getpid();
@@ -667,9 +670,9 @@ int getty_main(int argc UNUSED_PARAM, char **argv)
 // FIXME: do we need this? Otherwise "-" case seems to be broken...
        // /* Forcibly make fd 0 our controlling tty, even if another session
        //  * has it as a ctty. (Another session loses ctty). */
-       // ioctl(0, TIOCSCTTY, (void*)1);
+       // ioctl(STDIN_FILENO, TIOCSCTTY, (void*)1);
        /* Make ourself a foreground process group within our session */
-       tcsetpgrp(0, pid);
+       tcsetpgrp(STDIN_FILENO, pid);
 #endif
 
        /* Update the utmp file. This tty is ours now! */