4.4BSD snapshot (revision 8.1); add 1993 to copyright
[unix-history] / usr / src / libexec / getty / main.c
index b9fcd3c..486f44b 100644 (file)
@@ -1,34 +1,40 @@
-/*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
  */
 
 #ifndef lint
 char copyright[] =
  */
 
 #ifndef lint
 char copyright[] =
-"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+"@(#) Copyright (c) 1980 The Regents of the University of California.\n\
  All rights reserved.\n";
  All rights reserved.\n";
-#endif not lint
+#endif /* not lint */
 
 #ifndef lint
 
 #ifndef lint
-static char sccsid[] = "@(#)main.c     5.2 (Berkeley) %G%";
-#endif not lint
+static char sccsid[] = "@(#)main.c     8.1 (Berkeley) %G%";
+#endif /* not lint */
 
 
-/*
- * getty -- adapt to terminal speed on dialup, and call login
- *
- * Melbourne getty, June 83, kre.
- */
+#define USE_OLD_TTY
 
 
-#include <sgtty.h>
-#include <signal.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
 #include <ctype.h>
 #include <ctype.h>
+#include <fcntl.h>
 #include <setjmp.h>
 #include <setjmp.h>
+#include <sgtty.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
 #include <syslog.h>
 #include <syslog.h>
-#include <sys/file.h>
-#include "gettytab.h"
+#include <time.h>
+#include <unistd.h>
 
 
-extern char **environ;
+#include "gettytab.h"
+#include "pathnames.h"
+#include "extern.h"
 
 struct sgttyb tmode = {
        0, 0, CERASE, CKILL, 0
 
 struct sgttyb tmode = {
        0, 0, CERASE, CKILL, 0
@@ -42,15 +48,11 @@ struct      ltchars ltc = {
        CFLUSH, CWERASE, CLNEXT
 };
 
        CFLUSH, CWERASE, CLNEXT
 };
 
-int    crmod;
-int    upper;
-int    lower;
-int    digit;
+int crmod, digit, lower, upper;
 
 
-char   hostname[32];
+char   hostname[MAXHOSTNAMELEN];
 char   name[16];
 char   name[16];
-char   dev[] = "/dev/";
-char   ctty[] = "/dev/console";
+char   dev[] = _PATH_DEV;
 char   ttyn[32];
 char   *portselector();
 char   *ttyname();
 char   ttyn[32];
 char   *portselector();
 char   *ttyname();
@@ -59,9 +61,7 @@ char  *ttyname();
 #define        TABBUFSIZ       512
 
 char   defent[TABBUFSIZ];
 #define        TABBUFSIZ       512
 
 char   defent[TABBUFSIZ];
-char   defstrs[TABBUFSIZ];
 char   tabent[TABBUFSIZ];
 char   tabent[TABBUFSIZ];
-char   tabstrs[TABBUFSIZ];
 
 char   *env[128];
 
 
 char   *env[128];
 
@@ -90,6 +90,7 @@ char partab[] = {
 
 jmp_buf timeout;
 
 
 jmp_buf timeout;
 
+static void
 dingdong()
 {
 
 dingdong()
 {
 
@@ -100,6 +101,7 @@ dingdong()
 
 jmp_buf        intrupt;
 
 
 jmp_buf        intrupt;
 
+static void
 interrupt()
 {
 
 interrupt()
 {
 
@@ -107,9 +109,20 @@ interrupt()
        longjmp(intrupt, 1);
 }
 
        longjmp(intrupt, 1);
 }
 
+static int     getname __P((void));
+static void    oflush __P((void));
+static void    prompt __P((void));
+static void    putchr __P((int));
+static void    putf __P((char *));
+static void    putpad __P((char *));
+static void    puts __P((char *));
+
+int
 main(argc, argv)
 main(argc, argv)
+       int argc;
        char *argv[];
 {
        char *argv[];
 {
+       extern char **environ;
        char *tname;
        long allflags;
        int repcnt = 0;
        char *tname;
        long allflags;
        int repcnt = 0;
@@ -130,42 +143,48 @@ main(argc, argv)
         * J. Gettys - MIT Project Athena.
         */
        if (argc <= 2 || strcmp(argv[2], "-") == 0)
         * J. Gettys - MIT Project Athena.
         */
        if (argc <= 2 || strcmp(argv[2], "-") == 0)
-               strcpy(ttyn, ttyname(0));
+           strcpy(ttyn, ttyname(0));
        else {
        else {
-               strcpy(ttyn, dev);
-               strncat(ttyn, argv[2], sizeof(ttyn)-sizeof(dev));
+           int i;
+
+           strcpy(ttyn, dev);
+           strncat(ttyn, argv[2], sizeof(ttyn)-sizeof(dev));
+           if (strcmp(argv[0], "+") != 0) {
                chown(ttyn, 0, 0);
                chown(ttyn, 0, 0);
-               chmod(ttyn, 0622);
-               while (open(ttyn, O_RDWR) != 0) {
+               chmod(ttyn, 0600);
+               revoke(ttyn);
+               /*
+                * Delay the open so DTR stays down long enough to be detected.
+                */
+               sleep(2);
+               while ((i = open(ttyn, O_RDWR)) == -1) {
                        if (repcnt % 10 == 0) {
                        if (repcnt % 10 == 0) {
-                               syslog(LOG_FAIL, "%s: %m", ttyn);
+                               syslog(LOG_ERR, "%s: %m", ttyn);
                                closelog();
                        }
                        repcnt++;
                        sleep(60);
                }
                                closelog();
                        }
                        repcnt++;
                        sleep(60);
                }
-               signal(SIGHUP, SIG_IGN);
-               vhangup();
-               (void) open(ttyn, O_RDWR);
-               close(0);
-               dup(1);
-               dup(0);
-               signal(SIGHUP, SIG_DFL);
+               login_tty(i);
+           }
        }
 
        }
 
-       gettable("default", defent, defstrs);
+       gettable("default", defent);
        gendefaults();
        tname = "default";
        if (argc > 1)
                tname = argv[1];
        for (;;) {
        gendefaults();
        tname = "default";
        if (argc > 1)
                tname = argv[1];
        for (;;) {
-               int ldisp = OTTYDISC;
+               int off;
 
 
-               gettable(tname, tabent, tabstrs);
+               gettable(tname, tabent);
                if (OPset || EPset || APset)
                        APset++, OPset++, EPset++;
                setdefaults();
                if (OPset || EPset || APset)
                        APset++, OPset++, EPset++;
                setdefaults();
-               ioctl(0, TIOCFLUSH, 0);         /* clear out the crap */
+               off = 0;
+               ioctl(0, TIOCFLUSH, &off);      /* clear out the crap */
+               ioctl(0, FIONBIO, &off);        /* turn off non-blocking mode */
+               ioctl(0, FIOASYNC, &off);       /* ditto for async mode */
                if (IS)
                        tmode.sg_ispeed = speed(IS);
                else if (SP)
                if (IS)
                        tmode.sg_ispeed = speed(IS);
                else if (SP)
@@ -178,7 +197,6 @@ main(argc, argv)
                ioctl(0, TIOCSETP, &tmode);
                setchars();
                ioctl(0, TIOCSETC, &tc);
                ioctl(0, TIOCSETP, &tmode);
                setchars();
                ioctl(0, TIOCSETC, &tc);
-               ioctl(0, TIOCSETD, &ldisp);
                if (HC)
                        ioctl(0, TIOCHPCL, 0);
                if (AB) {
                if (HC)
                        ioctl(0, TIOCHPCL, 0);
                if (AB) {
@@ -211,6 +229,10 @@ main(argc, argv)
                        oflush();
                        alarm(0);
                        signal(SIGALRM, SIG_DFL);
                        oflush();
                        alarm(0);
                        signal(SIGALRM, SIG_DFL);
+                       if (name[0] == '-') {
+                               puts("user names may not start with '-'.");
+                               continue;
+                       }
                        if (!(upper || lower || digit))
                                continue;
                        allflags = setflags(2);
                        if (!(upper || lower || digit))
                                continue;
                        allflags = setflags(2);
@@ -229,7 +251,14 @@ main(argc, argv)
                        for (i = 0; environ[i] != (char *)0; i++)
                                env[i] = environ[i];
                        makeenv(&env[i]);
                        for (i = 0; environ[i] != (char *)0; i++)
                                env[i] = environ[i];
                        makeenv(&env[i]);
+
+                       /* 
+                        * this is what login was doing anyway.
+                        * soon we rewrite getty completely.
+                        */
+                       set_ttydefaults(0);
                        execle(LO, "login", "-p", name, (char *) 0, env);
                        execle(LO, "login", "-p", name, (char *) 0, env);
+                       syslog(LOG_ERR, "%s: %m", LO);
                        exit(1);
                }
                alarm(0);
                        exit(1);
                }
                alarm(0);
@@ -240,10 +269,11 @@ main(argc, argv)
        }
 }
 
        }
 }
 
+static int
 getname()
 {
 getname()
 {
+       register int c;
        register char *np;
        register char *np;
-       register c;
        char cs;
 
        /*
        char cs;
 
        /*
@@ -264,14 +294,11 @@ getname()
                PF = 0;
        }
        ioctl(0, TIOCSETP, &tmode);
                PF = 0;
        }
        ioctl(0, TIOCSETP, &tmode);
-       crmod = 0;
-       upper = 0;
-       lower = 0;
-       digit = 0;
+       crmod = digit = lower = upper = 0;
        np = name;
        for (;;) {
                oflush();
        np = name;
        for (;;) {
                oflush();
-               if (read(0, &cs, 1) <= 0)
+               if (read(STDIN_FILENO, &cs, 1) <= 0)
                        exit(0);
                if ((c = cs&0177) == 0)
                        return (0);
                        exit(0);
                if ((c = cs&0177) == 0)
                        return (0);
@@ -281,10 +308,10 @@ getname()
                        putf("\r\n");
                        break;
                }
                        putf("\r\n");
                        break;
                }
-               if (c >= 'a' && c <= 'z')
-                       lower++;
-               else if (c >= 'A' && c <= 'Z')
-                       upper++;
+               if (islower(c))
+                       lower = 1;
+               else if (isupper(c))
+                       upper = 1;
                else if (c == ERASE || c == '#' || c == '\b') {
                        if (np > name) {
                                np--;
                else if (c == ERASE || c == '#' || c == '\b') {
                        if (np > name) {
                                np--;
@@ -305,7 +332,7 @@ getname()
                        prompt();
                        np = name;
                        continue;
                        prompt();
                        np = name;
                        continue;
-               } else if (c >= '0' && c <= '9')
+               } else if (isdigit(c))
                        digit++;
                if (IG && (c <= ' ' || c > 0176))
                        continue;
                        digit++;
                if (IG && (c <= ' ' || c > 0176))
                        continue;
@@ -315,7 +342,7 @@ getname()
        signal(SIGINT, SIG_IGN);
        *np = 0;
        if (c == '\r')
        signal(SIGINT, SIG_IGN);
        *np = 0;
        if (c == '\r')
-               crmod++;
+               crmod = 1;
        if (upper && !lower && !LC || UC)
                for (np = name; *np; np++)
                        if (isupper(*np))
        if (upper && !lower && !LC || UC)
                for (np = name; *np; np++)
                        if (isupper(*np))
@@ -328,6 +355,7 @@ short       tmspc10[] = {
        0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5, 15
 };
 
        0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5, 15
 };
 
+static void
 putpad(s)
        register char *s;
 {
 putpad(s)
        register char *s;
 {
@@ -358,11 +386,10 @@ putpad(s)
                return;
 
        /*
                return;
 
        /*
-        * Round up by a half a character frame,
-        * and then do the delay.
+        * Round up by a half a character frame, and then do the delay.
         * Too bad there are no user program accessible programmed delays.
         * Too bad there are no user program accessible programmed delays.
-        * Transmitting pad characters slows many
-        * terminals down and also loads the system.
+        * Transmitting pad characters slows many terminals down and also
+        * loads the system.
         */
        mspc10 = tmspc10[tmode.sg_ospeed];
        pad += mspc10 / 2;
         */
        mspc10 = tmspc10[tmode.sg_ospeed];
        pad += mspc10 / 2;
@@ -370,10 +397,10 @@ putpad(s)
                putchr(*PC);
 }
 
                putchr(*PC);
 }
 
+static void
 puts(s)
        register char *s;
 {
 puts(s)
        register char *s;
 {
-
        while (*s)
                putchr(*s++);
 }
        while (*s)
                putchr(*s++);
 }
@@ -381,29 +408,35 @@ puts(s)
 char   outbuf[OBUFSIZ];
 int    obufcnt = 0;
 
 char   outbuf[OBUFSIZ];
 int    obufcnt = 0;
 
+static void
 putchr(cc)
 putchr(cc)
+       int cc;
 {
        char c;
 
        c = cc;
 {
        char c;
 
        c = cc;
-       c |= partab[c&0177] & 0200;
-       if (OP)
-               c ^= 0200;
+       if (!NP) {
+               c |= partab[c&0177] & 0200;
+               if (OP)
+                       c ^= 0200;
+       }
        if (!UB) {
                outbuf[obufcnt++] = c;
                if (obufcnt >= OBUFSIZ)
                        oflush();
        } else
        if (!UB) {
                outbuf[obufcnt++] = c;
                if (obufcnt >= OBUFSIZ)
                        oflush();
        } else
-               write(1, &c, 1);
+               write(STDOUT_FILENO, &c, 1);
 }
 
 }
 
+static void
 oflush()
 {
        if (obufcnt)
 oflush()
 {
        if (obufcnt)
-               write(1, outbuf, obufcnt);
+               write(STDOUT_FILENO, outbuf, obufcnt);
        obufcnt = 0;
 }
 
        obufcnt = 0;
 }
 
+static void
 prompt()
 {
 
 prompt()
 {
 
@@ -412,13 +445,13 @@ prompt()
                putchr('\n');
 }
 
                putchr('\n');
 }
 
+static void
 putf(cp)
        register char *cp;
 {
 putf(cp)
        register char *cp;
 {
-       char *ttyn, *slash;
-       char datebuffer[60];
        extern char editedhost[];
        extern char editedhost[];
-       extern char *ttyname(), *rindex();
+       time_t t;
+       char *slash, db[100];
 
        while (*cp) {
                if (*cp != '%') {
 
        while (*cp) {
                if (*cp != '%') {
@@ -428,8 +461,7 @@ putf(cp)
                switch (*++cp) {
 
                case 't':
                switch (*++cp) {
 
                case 't':
-                       ttyn = ttyname(0);
-                       slash = rindex(ttyn, '/');
+                       slash = strrchr(ttyn, '/');
                        if (slash == (char *) 0)
                                puts(ttyn);
                        else
                        if (slash == (char *) 0)
                                puts(ttyn);
                        else
@@ -440,10 +472,15 @@ putf(cp)
                        puts(editedhost);
                        break;
 
                        puts(editedhost);
                        break;
 
-               case 'd':
-                       get_date(datebuffer);
-                       puts(datebuffer);
+               case 'd': {
+                       static char fmt[] = "%l:% %P on %A, %d %B %Y";
+
+                       fmt[4] = 'M';           /* I *hate* SCCS... */
+                       (void)time(&t);
+                       (void)strftime(db, sizeof(db), fmt, localtime(&t));
+                       puts(db);
                        break;
                        break;
+               }
 
                case '%':
                        putchr('%');
 
                case '%':
                        putchr('%');