Patch to getty (WARNS=6)

Kevin M. Kilbride kmk at ssl.org
Thu Feb 24 20:49:11 PST 2005


This patch brings getty into WARNS=6 compliance under both GCC 2.95 and 
GCC 3.4. It depends upon the patch posted prior to 'constify' the getcap 
facility.

diff -u libexec/getty_orig/chat.c libexec/getty/chat.c
--- libexec/getty_orig/chat.c    2004-03-25 16:30:12.000000000 -0800
+++ libexec/getty/chat.c    2005-02-23 12:15:05.000000000 -0800
@@ -32,6 +32,8 @@
#include <sys/resource.h>
#include <sys/ttydefaults.h>
#include <sys/utsname.h>
+#include <sys/socket.h>
+
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
@@ -42,10 +44,9 @@
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
-#include <time.h>
#include <termios.h>
+#include <time.h>
#include <unistd.h>
-#include <sys/socket.h>
#include "extern.h"

@@ -71,7 +72,7 @@
static int    getdigit (unsigned char **, int, int);
static char   **read_chat (char **);
static char   *cleanchr (char **, unsigned char);
-static char   *cleanstr (const unsigned char *, int);
+static const char *cleanstr (const unsigned char *, int);
static const char *result (int);
static int    chat_expect (const char *);
static int    chat_send (char const *);
@@ -85,7 +86,7 @@
 */
static void
-chat_alrm(int signo)
+chat_alrm(__attribute__((unused)) int signo)
{
    int on = 1;
@@ -280,18 +281,18 @@
 * clean a string for display (ctrl/meta characters)
 */
-static char *
+static const char *
cleanstr(const unsigned char *s, int l)
{
    static unsigned char * tmp = NULL;
    static int tmplen = 0;
-    if (tmplen < l * 4 + 1)
-        tmp = realloc(tmp, tmplen = l * 4 + 1);
+    if (tmplen < l * 4 + 3)
+        tmp = realloc(tmp, tmplen = l * 4 + 3);
    if (tmp == NULL) {
        tmplen = 0;
-        return (char *)"(mem alloc error)";
+        return "(mem alloc error)";
    } else {
        int i = 0;
        char * p = tmp;
diff -u libexec/getty_orig/init.c libexec/getty/init.c
--- libexec/getty_orig/init.c    2003-06-16 21:27:07.000000000 -0700
+++ libexec/getty/init.c    2005-02-23 08:44:43.000000000 -0800
@@ -41,6 +41,7 @@
 * Melbourne getty.
 */
#include <termios.h>
+
#include "extern.h"
#include "gettytab.h"
#include "pathnames.h"
@@ -51,100 +52,100 @@
static char datefmt[] = "%+";
struct    gettystrs gettystrs[] = {
-    { "nx" },            /* next table */
-    { "cl" },            /* screen clear characters */
-    { "im" },            /* initial message */
-    { "lm", loginmsg },        /* login message */
-    { "er", &tmode.c_cc[VERASE] },    /* erase character */
-    { "kl", &tmode.c_cc[VKILL] },    /* kill character */
-    { "et", &tmode.c_cc[VEOF] },    /* eof chatacter (eot) */
-    { "pc", nullstr },        /* pad character */
-    { "tt" },            /* terminal type */
-    { "ev" },            /* enviroment */
-    { "lo", loginprg },        /* login program */
-    { "hn", hostname },        /* host name */
-    { "he" },            /* host name edit */
-    { "in", &tmode.c_cc[VINTR] },    /* interrupt char */
-    { "qu", &tmode.c_cc[VQUIT] },    /* quit char */
-    { "xn", &tmode.c_cc[VSTART] },    /* XON (start) char */
-    { "xf", &tmode.c_cc[VSTOP] },    /* XOFF (stop) char */
-    { "bk", &tmode.c_cc[VEOL] },    /* brk char (alt \n) */
-    { "su", &tmode.c_cc[VSUSP] },    /* suspend char */
-    { "ds", &tmode.c_cc[VDSUSP] },    /* delayed suspend */
-    { "rp", &tmode.c_cc[VREPRINT] },/* reprint char */
-    { "fl", &tmode.c_cc[VDISCARD] },/* flush output */
-    { "we", &tmode.c_cc[VWERASE] },    /* word erase */
-    { "ln", &tmode.c_cc[VLNEXT] },    /* literal next */
-    { "Lo" },            /* locale for strftime() */
-    { "pp" },            /* ppp login program */
-    { "if" },            /* sysv-like 'issue' filename */
-    { "ic" },            /* modem init-chat */
-    { "ac" },            /* modem answer-chat */
-    { "al" },            /* user to auto-login */
-    { "df", datefmt},        /* format for strftime() */
-    { 0 }
+    { "nx", 0, 0 },                /* next table */
+    { "cl", 0, 0 },                /* screen clear characters */
+    { "im", 0, 0 },                /* initial message */
+    { "lm", loginmsg, 0 },            /* login message */
+    { "er", &tmode.c_cc[VERASE], 0 },    /* erase character */
+    { "kl", &tmode.c_cc[VKILL], 0 },    /* kill character */
+    { "et", &tmode.c_cc[VEOF], 0 },        /* eof chatacter (eot) */
+    { "pc", nullstr, 0 },            /* pad character */
+    { "tt", 0, 0 },                /* terminal type */
+    { "ev", 0, 0 },                /* enviroment */
+    { "lo", loginprg, 0 },            /* login program */
+    { "hn", hostname, 0 },            /* host name */
+    { "he", 0, 0 },                /* host name edit */
+    { "in", &tmode.c_cc[VINTR], 0 },    /* interrupt char */
+    { "qu", &tmode.c_cc[VQUIT], 0 },    /* quit char */
+    { "xn", &tmode.c_cc[VSTART], 0 },    /* XON (start) char */
+    { "xf", &tmode.c_cc[VSTOP], 0 },    /* XOFF (stop) char */
+    { "bk", &tmode.c_cc[VEOL], 0 },        /* brk char (alt \n) */
+    { "su", &tmode.c_cc[VSUSP], 0 },    /* suspend char */
+    { "ds", &tmode.c_cc[VDSUSP], 0 },    /* delayed suspend */
+    { "rp", &tmode.c_cc[VREPRINT], 0 },    /* reprint char */
+    { "fl", &tmode.c_cc[VDISCARD], 0 },    /* flush output */
+    { "we", &tmode.c_cc[VWERASE], 0 },    /* word erase */
+    { "ln", &tmode.c_cc[VLNEXT], 0 },    /* literal next */
+    { "Lo", 0, 0 },                /* locale for strftime() */
+    { "pp", 0, 0 },                /* ppp login program */
+    { "if", 0, 0 },                /* sysv-like 'issue' filename */
+    { "ic", 0, 0 },                /* modem init-chat */
+    { "ac", 0, 0 },                /* modem answer-chat */
+    { "al", 0, 0 },                /* user to auto-login */
+    { "df", datefmt, 0},            /* format for strftime() */
+    { 0, 0, 0 }
};
struct    gettynums gettynums[] = {
-    { "is" },            /* input speed */
-    { "os" },            /* output speed */
-    { "sp" },            /* both speeds */
-    { "nd" },            /* newline delay */
-    { "cd" },            /* carriage-return delay */
-    { "td" },            /* tab delay */
-    { "fd" },            /* form-feed delay */
-    { "bd" },            /* backspace delay */
-    { "to" },            /* timeout */
-    { "f0" },            /* output flags */
-    { "f1" },            /* input flags */
-    { "f2" },            /* user mode flags */
-    { "pf" },            /* delay before flush at 1st prompt */
-    { "c0" },            /* output c_flags */
-    { "c1" },            /* input c_flags */
-    { "c2" },            /* user mode c_flags */
-    { "i0" },            /* output i_flags */
-    { "i1" },            /* input i_flags */
-    { "i2" },            /* user mode i_flags */
-    { "l0" },            /* output l_flags */
-    { "l1" },            /* input l_flags */
-    { "l2" },            /* user mode l_flags */
-    { "o0" },            /* output o_flags */
-    { "o1" },            /* input o_flags */
-    { "o2" },            /* user mode o_flags */
-     { "de" },                       /* delay before sending 1st prompt */
-    { "rt" },            /* reset timeout */
-    { "ct" },            /* chat script timeout */
-    { "dc" },            /* debug chat script value */
-      { 0 }
+    { "is", 0, 0, 0 },            /* input speed */
+    { "os", 0, 0, 0 },            /* output speed */
+    { "sp", 0, 0, 0 },            /* both speeds */
+    { "nd", 0, 0, 0 },            /* newline delay */
+    { "cd", 0, 0, 0 },            /* carriage-return delay */
+    { "td", 0, 0, 0 },            /* tab delay */
+    { "fd", 0, 0, 0 },            /* form-feed delay */
+    { "bd", 0, 0, 0 },            /* backspace delay */
+    { "to", 0, 0, 0 },            /* timeout */
+    { "f0", 0, 0, 0 },            /* output flags */
+    { "f1", 0, 0, 0 },            /* input flags */
+    { "f2", 0, 0, 0 },            /* user mode flags */
+    { "pf", 0, 0, 0 },            /* delay before flush at 1st prompt */
+    { "c0", 0, 0, 0 },            /* output c_flags */
+    { "c1", 0, 0, 0 },            /* input c_flags */
+    { "c2", 0, 0, 0 },            /* user mode c_flags */
+    { "i0", 0, 0, 0 },            /* output i_flags */
+    { "i1", 0, 0, 0 },            /* input i_flags */
+    { "i2", 0, 0, 0 },            /* user mode i_flags */
+    { "l0", 0, 0, 0 },            /* output l_flags */
+    { "l1", 0, 0, 0 },            /* input l_flags */
+    { "l2", 0, 0, 0 },            /* user mode l_flags */
+    { "o0", 0, 0, 0 },            /* output o_flags */
+    { "o1", 0, 0, 0 },            /* input o_flags */
+    { "o2", 0, 0, 0 },            /* user mode o_flags */
+     { "de", 0, 0, 0 },                       /* delay before sending 
1st prompt */
+    { "rt", 0, 0, 0 },            /* reset timeout */
+    { "ct", 0, 0, 0 },            /* chat script timeout */
+    { "dc", 0, 0, 0 },            /* debug chat script value */
+      { 0, 0, 0, 0 }
};
 

struct    gettyflags gettyflags[] = {
-    { "ht",    0 },            /* has tabs */
-    { "nl",    1 },            /* has newline char */
-    { "ep",    0 },            /* even parity */
-    { "op",    0 },            /* odd parity */
-    { "ap",    0 },            /* any parity */
-    { "ec",    1 },            /* no echo */
-    { "co",    0 },            /* console special */
-    { "cb",    0 },            /* crt backspace */
-    { "ck",    0 },            /* crt kill */
-    { "ce",    0 },            /* crt erase */
-    { "pe",    0 },            /* printer erase */
-    { "rw",    1 },            /* don't use raw */
-    { "xc",    1 },            /* don't ^X ctl chars */
-    { "lc",    0 },            /* terminal las lower case */
-    { "uc",    0 },            /* terminal has no lower case */
-    { "ig",    0 },            /* ignore garbage */
-    { "ps",    0 },            /* do port selector speed select */
-    { "hc",    1 },            /* don't set hangup on close */
-    { "ub", 0 },            /* unbuffered output */
-    { "ab", 0 },            /* auto-baud detect with '\r' */
-    { "dx", 0 },            /* set decctlq */
-    { "np", 0 },            /* no parity at all (8bit chars) */
-    { "mb", 0 },            /* do MDMBUF flow control */
-    { "hw", 0 },            /* do CTSRTS flow control */
-    { "nc", 0 },            /* set clocal (no carrier) */
-    { "pl", 0 },            /* use PPP instead of login(1) */
-    { 0 }
+    { "ht",    0, 0, 0, 0 },            /* has tabs */
+    { "nl",    1, 0, 0, 0 },            /* has newline char */
+    { "ep",    0, 0, 0, 0 },            /* even parity */
+    { "op",    0, 0, 0, 0 },            /* odd parity */
+    { "ap",    0, 0, 0, 0 },            /* any parity */
+    { "ec",    1, 0, 0, 0 },            /* no echo */
+    { "co",    0, 0, 0, 0 },            /* console special */
+    { "cb",    0, 0, 0, 0 },            /* crt backspace */
+    { "ck",    0, 0, 0, 0 },            /* crt kill */
+    { "ce",    0, 0, 0, 0 },            /* crt erase */
+    { "pe",    0, 0, 0, 0 },            /* printer erase */
+    { "rw",    1, 0, 0, 0 },            /* don't use raw */
+    { "xc",    1, 0, 0, 0 },            /* don't ^X ctl chars */
+    { "lc",    0, 0, 0, 0 },            /* terminal las lower case */
+    { "uc",    0, 0, 0, 0 },            /* terminal has no lower case */
+    { "ig",    0, 0, 0, 0 },            /* ignore garbage */
+    { "ps",    0, 0, 0, 0 },            /* do port selector speed select */
+    { "hc",    1, 0, 0, 0 },            /* don't set hangup on close */
+    { "ub", 0, 0, 0, 0 },            /* unbuffered output */
+    { "ab", 0, 0, 0, 0 },            /* auto-baud detect with '\r' */
+    { "dx", 0, 0, 0, 0 },            /* set decctlq */
+    { "np", 0, 0, 0, 0 },            /* no parity at all (8bit chars) */
+    { "mb", 0, 0, 0, 0 },            /* do MDMBUF flow control */
+    { "hw", 0, 0, 0, 0 },            /* do CTSRTS flow control */
+    { "nc", 0, 0, 0, 0 },            /* set clocal (no carrier) */
+    { "pl", 0, 0, 0, 0 },            /* use PPP instead of login(1) */
+    { 0, 0, 0, 0, 0 }
};
diff -u libexec/getty_orig/main.c libexec/getty/main.c
--- libexec/getty_orig/main.c    2004-03-25 16:30:12.000000000 -0800
+++ libexec/getty/main.c    2005-02-23 12:15:45.000000000 -0800
@@ -42,6 +42,7 @@
#include <sys/resource.h>
#include <sys/ttydefaults.h>
#include <sys/utsname.h>
+
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
@@ -136,13 +137,15 @@
static void    setttymode (const char *, int);
static void    setdefttymode (const char *);
static int    opentty (const char *, int);
+extern char    **environ;
+extern char    editedhost[];
int        main (int, char **);

jmp_buf timeout;

static void
-dingdong(int signo)
+dingdong(__attribute__((unused)) int signo)
{
    alarm(0);
    longjmp(timeout, 1);
@@ -151,7 +154,7 @@
jmp_buf    intrupt;
static void
-interrupt(int signo)
+interrupt(__attribute__((unused)) int signo)
{
    longjmp(intrupt, 1);
}
@@ -160,7 +163,7 @@
 * Action to take when getty is running too long.
 */
static void
-timeoverrun(int signo)
+timeoverrun(__attribute__((unused)) int signo)
{
    syslog(LOG_ERR, "getty exiting due to excessive running time");
    exit(1);
@@ -169,11 +172,10 @@
int
main(int argc, char **argv)
{
-    extern    char **environ;
-    const char *tname;
-    int first_sleep = 1, first_time = 1;
+    const char * volatile tname = "default";
+    volatile int first_sleep = 1, first_time = 1;
    struct rlimit limit;
-    int rval;
+    volatile int rval = 0;
    signal(SIGINT, SIG_IGN);
    signal(SIGQUIT, SIG_IGN);
@@ -182,7 +184,7 @@
    gethostname(hostname, sizeof(hostname) - 1);
    hostname[sizeof(hostname) - 1] = '\0';
    if (hostname[0] == '\0')
-        strcpy(hostname, "Amnesiac");
+        strncpy(hostname, "Amnesiac", MAXHOSTNAMELEN);
    /*
     * Limit running time to deal with broken or dead lines.
@@ -194,7 +196,6 @@
    gettable("default", defent);
    gendefaults();
-    tname = "default";
    if (argc > 1)
        tname = argv[1];
@@ -206,9 +207,9 @@
     * J. Gettys - MIT Project Athena.
     */
    if (argc <= 2 || strcmp(argv[2], "-") == 0)
-        strcpy(ttyn, ttyname(STDIN_FILENO));
+        strncpy(ttyn, ttyname(STDIN_FILENO), sizeof(ttyn));
    else {
-        strcpy(ttyn, dev);
+        strncpy(ttyn, dev, sizeof(ttyn));
        strncat(ttyn, argv[2], sizeof(ttyn)-sizeof(dev));
        if (strcmp(argv[0], "+") != 0) {
        chown(ttyn, 0, 0);
@@ -231,17 +232,17 @@
        }
        if (AC) {
-            int i, rfds;
-            struct timeval timeout;
+            int i;
+            fd_set rfds;
+            struct timeval timeout_val;
            if (!opentty(ttyn, O_RDWR|O_NONBLOCK))
                exit(1);
                setdefttymode(tname);
-                rfds = 1 << 0;    /* FD_SET */
-                timeout.tv_sec = RT;
-                timeout.tv_usec = 0;
-                i = select(32, (fd_set*)&rfds, (fd_set*)NULL,
-                           (fd_set*)NULL, RT ? &timeout : NULL);
+            FD_SET(1, &rfds);
+                timeout_val.tv_sec = RT;
+                timeout_val.tv_usec = 0;
+                i = select(32, &rfds, 0, 0, (RT ? &timeout_val : 0));
                if (i < 0) {
                syslog(LOG_ERR, "select %s: %m", ttyn);
            } else if (i == 0) {
@@ -338,7 +339,6 @@
        if (AL) {
            const char *p = AL;
            char *q = name;
-            int n = sizeof name;
            while (*p && q < &name[sizeof name - 1]) {
                if (isupper(*p))
@@ -409,22 +409,22 @@
}
static int
-opentty(const char *ttyn, int flags)
+opentty(const char *ttynm, int flags)
{
-    int i, j = 0;
+    int i = 0, j = 0;
    int failopenlogged = 0;
-    while (j < 10 && (i = open(ttyn, flags)) == -1)
+    while (j < 10 && (i = open(ttynm, flags)) == -1)
    {
        if (((j % 10) == 0) && (errno != ENXIO || !failopenlogged)) {
-            syslog(LOG_ERR, "open %s: %m", ttyn);
+            syslog(LOG_ERR, "open %s: %m", ttynm);
            failopenlogged = 1;
        }
        j++;
        sleep(60);
    }
    if (i == -1) {
-        syslog(LOG_ERR, "open %s: %m", ttyn);
+        syslog(LOG_ERR, "open %s: %m", ttynm);
        return 0;
    }
    else {
@@ -435,7 +435,7 @@
                return 0;
            }
            if (login_tty(i) < 0) {
-                syslog(LOG_ERR, "login_tty %s: %m", ttyn);
+                syslog(LOG_ERR, "login_tty %s: %m", ttynm);
                close(i);
                return 0;
            }
@@ -497,8 +497,8 @@
    int c;
    char *np;
    unsigned char cs;
-    int ppp_state = 0;
-    int ppp_connection = 0;
+    volatile int ppp_state = 0;
+    volatile int ppp_connection = 0;
    /*
     * Interrupt may happen if we use CBREAK mode
@@ -690,7 +690,7 @@
static char *
getline(int fd)
{
-    int i = 0;
+    unsigned i = 0;
    static char linebuf[512];
    /*
@@ -714,7 +714,6 @@
static void
putf(const char *cp)
{
-    extern char editedhost[];
    time_t t;
    char *slash, db[100];
diff -u libexec/getty_orig/subr.c libexec/getty/subr.c
--- libexec/getty_orig/subr.c    2004-03-25 16:30:12.000000000 -0800
+++ libexec/getty/subr.c    2005-02-23 12:25:13.000000000 -0800
@@ -39,17 +39,19 @@
 * Melbourne getty.
 */
#define COMPAT_43
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+
#ifdef DEBUG
#include <stdio.h>
#endif
#include <stdlib.h>
#include <string.h>
+#include <syslog.h>
#include <termios.h>
#include <unistd.h>
-#include <sys/ioctl.h>
-#include <sys/param.h>
-#include <sys/time.h>
-#include <syslog.h>
#include "gettytab.h"
#include "pathnames.h"
@@ -72,7 +74,7 @@
    long n;
    int l;
    char *p;
-    char *msg = NULL;
+    const char *msg = NULL;
    const char *dba[2];
    static int firsttime = 1;
@@ -105,7 +107,7 @@
        firsttime = 0;
    }
-    switch (cgetent(&buf, (char **)dba, (char *)name)) {
+    switch (cgetent(&buf, dba, name)) {
    case 1:
        msg = "%s: couldn't resolve 'tc=' in gettytab '%s'";
    case 0:
@@ -130,7 +132,7 @@
    }
    for (sp = gettystrs; sp->field; sp++) {
-        if ((l = cgetstr(buf, (char*)sp->field, &p)) >= 0) {
+        if ((l = cgetstr(buf, sp->field, &p)) >= 0) {
            if (sp->value) {
                /* prefer existing value */
                if (strcmp(p, sp->value) != 0)
@@ -148,7 +150,7 @@
    }
    for (np = gettynums; np->field; np++) {
-        if (cgetnum(buf, (char*)np->field, &n) == -1)
+        if (cgetnum(buf, np->field, &n) == -1)
            np->set = 0;
        else {
            np->set = 1;
@@ -157,7 +159,7 @@
    }
    for (fp = gettyflags; fp->field; fp++) {
-        if (cgetcap(buf, (char *)fp->field, ':') == NULL)
+        if (cgetcap(buf, fp->field, ':') == NULL)
            fp->set = 0;
        else {
            fp->set = 1;
@@ -694,7 +696,7 @@
    { 57600, B57600 },
    { 115200, B115200 },
    { 230400, B230400 },
-    { 0 }
+    { 0, 0 }
};
int
@@ -757,7 +759,7 @@
    { "B4800",    "std.4800" },
    { "B9600",    "std.9600" },
    { "B19200",    "std.19200" },
-    { 0 }
+    { 0, 0 }
};
const char *
@@ -766,7 +768,7 @@
    char c, baud[20];
    const char *type = "default";
    struct portselect *ps;
-    int len;
+    unsigned len;
    alarm(5*60);
    for (len = 0; len < sizeof (baud) - 1; len++) {
@@ -797,17 +799,16 @@
const char *
autobaud(void)
{
-    int rfds;
+    fd_set rfds;
    struct timeval timeout;
    char c;
    const char *type = "9600-baud";
    (void)tcflush(0, TCIOFLUSH);
-    rfds = 1 << 0;
+    FD_SET(1, &rfds);
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
-    if (select(32, (fd_set *)&rfds, (fd_set *)NULL,
-        (fd_set *)NULL, &timeout) <= 0)
+    if (select(32, &rfds, 0, 0, &timeout) <= 0)
        return (type);
    if (read(STDIN_FILENO, &c, sizeof(char)) != sizeof(char))
        return (type);





More information about the Submit mailing list