more ANSI fixes
[unix-history] / usr / src / libexec / getty / main.c
index 537a7ee..09ba98f 100644 (file)
@@ -1,34 +1,37 @@
-/*
- * 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.3 (Berkeley) %G%";
-#endif not lint
+static char sccsid[] = "@(#)main.c     5.14 (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 <sys/param.h>
+#include <sys/stat.h>
 #include <signal.h>
 #include <signal.h>
+#include <fcntl.h>
+#include <sgtty.h>
+#include <time.h>
 #include <ctype.h>
 #include <setjmp.h>
 #include <syslog.h>
 #include <ctype.h>
 #include <setjmp.h>
 #include <syslog.h>
-#include <sys/file.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
 #include "gettytab.h"
 #include "gettytab.h"
-
-extern char **environ;
+#include "pathnames.h"
 
 struct sgttyb tmode = {
        0, 0, CERASE, CKILL, 0
 
 struct sgttyb tmode = {
        0, 0, CERASE, CKILL, 0
@@ -42,15 +45,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();
@@ -90,6 +89,7 @@ char partab[] = {
 
 jmp_buf timeout;
 
 
 jmp_buf timeout;
 
+static void
 dingdong()
 {
 
 dingdong()
 {
 
@@ -100,6 +100,7 @@ dingdong()
 
 jmp_buf        intrupt;
 
 
 jmp_buf        intrupt;
 
+static void
 interrupt()
 {
 
 interrupt()
 {
 
@@ -108,8 +109,10 @@ interrupt()
 }
 
 main(argc, argv)
 }
 
 main(argc, argv)
-       char *argv[];
+       int argc;
+       char **argv;
 {
 {
+       extern  char **environ;
        char *tname;
        long allflags;
        int repcnt = 0;
        char *tname;
        long allflags;
        int repcnt = 0;
@@ -130,13 +133,21 @@ 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) {
                                syslog(LOG_ERR, "%s: %m", ttyn);
                                closelog();
                        if (repcnt % 10 == 0) {
                                syslog(LOG_ERR, "%s: %m", ttyn);
                                closelog();
@@ -144,13 +155,8 @@ main(argc, argv)
                        repcnt++;
                        sleep(60);
                }
                        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, defstrs);
@@ -160,12 +166,15 @@ main(argc, argv)
                tname = argv[1];
        for (;;) {
                int ldisp = OTTYDISC;
                tname = argv[1];
        for (;;) {
                int ldisp = OTTYDISC;
+               int off = 0;
 
                gettable(tname, tabent, tabstrs);
                if (OPset || EPset || APset)
                        APset++, OPset++, EPset++;
                setdefaults();
                ioctl(0, TIOCFLUSH, 0);         /* clear out the crap */
 
                gettable(tname, tabent, tabstrs);
                if (OPset || EPset || APset)
                        APset++, OPset++, EPset++;
                setdefaults();
                ioctl(0, TIOCFLUSH, 0);         /* 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 +187,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 +219,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 +241,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);
@@ -242,8 +261,8 @@ main(argc, argv)
 
 getname()
 {
 
 getname()
 {
+       register int c;
        register char *np;
        register char *np;
-       register c;
        char cs;
 
        /*
        char cs;
 
        /*
@@ -264,14 +283,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 +297,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 +321,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 +331,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))
@@ -358,11 +374,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;
@@ -373,7 +388,6 @@ putpad(s)
 puts(s)
        register char *s;
 {
 puts(s)
        register char *s;
 {
-
        while (*s)
                putchr(*s++);
 }
        while (*s)
                putchr(*s++);
 }
@@ -394,13 +408,13 @@ putchr(cc)
                if (obufcnt >= OBUFSIZ)
                        oflush();
        } else
                if (obufcnt >= OBUFSIZ)
                        oflush();
        } else
-               write(1, &c, 1);
+               write(STDOUT_FILENO, &c, 1);
 }
 
 oflush()
 {
        if (obufcnt)
 }
 
 oflush()
 {
        if (obufcnt)
-               write(1, outbuf, obufcnt);
+               write(STDOUT_FILENO, outbuf, obufcnt);
        obufcnt = 0;
 }
 
        obufcnt = 0;
 }
 
@@ -415,10 +429,9 @@ prompt()
 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,7 +441,6 @@ putf(cp)
                switch (*++cp) {
 
                case 't':
                switch (*++cp) {
 
                case 't':
-                       ttyn = ttyname(0);
                        slash = rindex(ttyn, '/');
                        if (slash == (char *) 0)
                                puts(ttyn);
                        slash = rindex(ttyn, '/');
                        if (slash == (char *) 0)
                                puts(ttyn);
@@ -440,10 +452,15 @@ putf(cp)
                        puts(editedhost);
                        break;
 
                        puts(editedhost);
                        break;
 
-               case 'd':
-                       get_date(datebuffer);
-                       puts(datebuffer);
+               case 'd': {
+                       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('%');