getty: do not clear all c_cflag's (we were clearing baud bits!)
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 26 Jan 2011 14:56:51 +0000 (15:56 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 26 Jan 2011 14:56:51 +0000 (15:56 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
loginutils/getty.c

index 0355341..3cf296e 100644 (file)
@@ -258,13 +258,34 @@ static void termios_init(int speed)
        if (speed != B0)
                cfsetspeed(&G.termios, speed);
 
-       /* Initial termios 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.
+        * reads will be done in raw mode anyway.
         */
-       /* 8 bits; hang up (drop DTR) on last close; enable receive */
-       G.termios.c_cflag = CS8 | HUPCL | CREAD;
+       /* Clear all bits except: */
+       G.termios.c_cflag &= (0
+               /* 2 stop bits (1 otherwise)
+                * Enable parity bit (both on input and output)
+                * Odd parity (else even)
+                */
+               | CSTOPB | PARENB | PARODD
+#ifdef CBAUDEX
+               | CMSPAR  /* mark or space parity */
+#endif
+               | CBAUD   /* (output) baud rate */
+#ifdef CBAUDEX
+               | CBAUDEX /* (output) baud rate */
+#endif
+#ifdef CIBAUD
+               | CIBAUD   /* input baud rate */
+#endif
+#ifdef CRTSCTS
+               | CRTSCTS /* flow control using RTS/CTS pins */
+#endif
+               | CLOCAL
+       );
+       /* Set: 8 bits; hang up (drop DTR) on last close; enable receive */
+       G.termios.c_cflag |= CS8 | HUPCL | CREAD;
        if (option_mask32 & F_LOCAL) {
                /* ignore Carrier Detect pin:
                 * opens don't block when CD is low,
@@ -274,13 +295,8 @@ static void termios_init(int speed)
        }
 #ifdef CRTSCTS
        if (option_mask32 & F_RTSCTS)
-               G.termios.c_cflag |= CRTSCTS; /* flow control using RTS/CTS pins */
+               G.termios.c_cflag |= CRTSCTS;
 #endif
-       /* Other bits in c_cflag:
-        * CSTOPB 2 stop bits (1 otherwise)
-        * PARENB Enable parity bit (both on input and output)
-        * PARODD Odd parity (else even)
-        */
        G.termios.c_iflag = 0;
        G.termios.c_lflag = 0;
        /* non-raw output; add CR to each NL */
@@ -415,7 +431,7 @@ static void auto_baud(void)
                }
        }
 
-       /* Restore terminal settings. Errors will be dealt with later on */
+       /* Restore terminal settings */
        G.termios.c_cc[VMIN] = 1; /* restore to value set by termios_init */
        set_termios();
 }