getty: conditionally disable handling of all-caps terminals.
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 23 Oct 2006 10:17:34 +0000 (10:17 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 23 Oct 2006 10:17:34 +0000 (10:17 -0000)
loginutils/getty.c

index ebca480bff9e95700c739569a1d5b83a33c07116..9e7cb7a10cb20d13c3a99fdaf8a6feb83ee2546c 100644 (file)
@@ -48,6 +48,9 @@ extern void updwtmp(const char *filename, const struct utmp *ut);
   * 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"
 
  /* If ISSUE is not defined, agetty will never display the contents of the
@@ -133,11 +136,13 @@ static const char opt_string[] = "I:LH:f:hil:mt:wn";
 /* Storage for things detected while the login name was read. */
 
 struct chardata {
-       int erase;                      /* erase character */
-       int kill;                       /* kill character */
-       int eol;                        /* end-of-line character */
-       int parity;                     /* what parity did we see */
-       int capslock;                   /* upper case without lower case */
+       unsigned char erase;    /* erase character */
+       unsigned char kill;     /* kill character */
+       unsigned char eol;      /* end-of-line character */
+       unsigned char parity;   /* what parity did we see */
+#ifdef HANDLE_ALLCAPS
+       unsigned char capslock; /* upper case without lower case */
+#endif
 };
 
 /* Initial values for the above. */
@@ -147,54 +152,10 @@ static const struct chardata init_chardata = {
        DEF_KILL,                               /* default kill character */
        13,                                     /* default eol char */
        0,                                      /* space parity */
+#ifdef HANDLE_ALLCAPS
        0,                                      /* no capslock */
-};
-
-#if 0
-struct Speedtab {
-       long speed;
-       int code;
-};
-
-static const struct Speedtab speedtab[] = {
-       {50, B50},
-       {75, B75},
-       {110, B110},
-       {134, B134},
-       {150, B150},
-       {200, B200},
-       {300, B300},
-       {600, B600},
-       {1200, B1200},
-       {1800, B1800},
-       {2400, B2400},
-       {4800, B4800},
-       {9600, B9600},
-#ifdef  B19200
-       {19200, B19200},
-#endif
-#ifdef  B38400
-       {38400, B38400},
-#endif
-#ifdef  EXTA
-       {19200, EXTA},
-#endif
-#ifdef  EXTB
-       {38400, EXTB},
 #endif
-#ifdef B57600
-       {57600, B57600},
-#endif
-#ifdef B115200
-       {115200, B115200},
-#endif
-#ifdef B230400
-       {230400, B230400},
-#endif
-       {0, 0},
 };
-#endif
-
 
 #ifdef SYSV_STYLE
 #ifdef CONFIG_FEATURE_UTMP
@@ -211,7 +172,7 @@ static char *fakehost = NULL;
 #ifdef DEBUGGING
 #define debug(s) fprintf(dbf,s); fflush(dbf)
 #define DEBUGTERM "/dev/ttyp0"
-FILE *dbf;
+static FILE *dbf;
 #else
 #define debug(s) /* nothing */
 #endif
@@ -415,7 +376,7 @@ static void termio_init(struct termio *tp, int speed, struct options *op)
         * Initial termio 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
-        * lateron.
+        * later on.
         */
 #ifdef __linux__
        /* flush input and output queues, important for modems! */
@@ -474,7 +435,7 @@ static void auto_baud(struct termio *tp)
 
        /*
         * Use 7-bit characters, don't block if input queue is empty. Errors will
-        * be dealt with lateron.
+        * be dealt with later on.
         */
 
        iflag = tp->c_iflag;
@@ -503,7 +464,7 @@ static void auto_baud(struct termio *tp)
                        }
                }
        }
-       /* Restore terminal settings. Errors will be dealt with lateron. */
+       /* Restore terminal settings. Errors will be dealt with later on. */
 
        tp->c_iflag = iflag;
        tp->c_cc[VMIN] = vmin;
@@ -525,12 +486,13 @@ static void next_speed(struct termio *tp, struct options *op)
 /* do_prompt - show login prompt, optionally preceded by /etc/issue contents */
 static void do_prompt(struct options *op, struct termio *tp)
 {
-#ifdef  ISSUE                                   /* optional: show /etc/issue */
+#ifdef ISSUE
        print_login_issue(op->issue, op->tty);
 #endif
        print_login_prompt();
 }
 
+#ifdef HANDLE_ALLCAPS
 /* caps_lock - string contains upper case without lower case */
 /* returns 1 if true, 0 if false */
 static int caps_lock(const char *s)
@@ -540,6 +502,7 @@ static int caps_lock(const char *s)
                        return 0;
        return 1;
 }
+#endif
 
 #define logname bb_common_bufsiz1
 /* get_logname - get user name, establish parity, speed, erase, kill, eol */
@@ -551,7 +514,7 @@ static char *get_logname(struct options *op, struct chardata *cp, struct termio
        char ascval;                    /* low 7 bits of input character */
        int bits;                       /* # of "1" bits per character */
        int mask;                       /* mask with 1 bit up */
-       static const char *const erase[] = {    /* backspace-space-backspace */
+       static const char erase[][3] = {    /* backspace-space-backspace */
                "\010\040\010",                 /* space parity */
                "\010\040\010",                 /* odd parity */
                "\210\240\210",                 /* even parity */
@@ -601,7 +564,8 @@ static char *get_logname(struct options *op, struct chardata *cp, struct termio
                                for (bits = 1, mask = 1; mask & 0177; mask <<= 1)
                                        if (mask & ascval)
                                                bits++; /* count "1" bits */
-                               cp->parity |= ((bits & 1) ? 1 : 2);
+                               /* ... |= 2 - even, 1 - odd */
+                               cp->parity |= 2 - (bits & 1);
                        }
                        /* Do erase, kill and end-of-line processing. */
 
@@ -645,12 +609,14 @@ static char *get_logname(struct options *op, struct chardata *cp, struct termio
        }
        /* Handle names with upper case and no lower case. */
 
+#ifdef HANDLE_ALLCAPS
        cp->capslock = caps_lock(logname);
        if (cp->capslock) {
                for (bp = logname; *bp; bp++)
                        if (isupper(*bp))
                                *bp = tolower(*bp);     /* map name to lower case */
        }
+#endif
        return logname;
 }
 
@@ -698,11 +664,13 @@ static void termio_final(struct options *op, struct termio *tp, struct chardata
        }
        /* Account for upper case without lower case. */
 
+#ifdef HANDLE_ALLCAPS
        if (cp->capslock) {
                tp->c_iflag |= IUCLC;
                tp->c_lflag |= XCASE;
                tp->c_oflag |= OLCUC;
        }
+#endif
        /* Optionally enable hardware flow control */
 
 #ifdef  CRTSCTS