Status field is now Comment field
[unix-history] / usr / src / libexec / getty / main.c
index e36734b..b1b26a4 100644 (file)
@@ -1,6 +1,18 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)main.c     4.4 (Berkeley) 83/07/09";
-#endif
+char copyright[] =
+"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif not lint
+
+#ifndef lint
+static char sccsid[] = "@(#)main.c     5.5 (Berkeley) %G%";
+#endif not lint
 
 /*
  * getty -- adapt to terminal speed on dialup, and call login
 
 /*
  * getty -- adapt to terminal speed on dialup, and call login
@@ -12,8 +24,12 @@ static char sccsid[] = "@(#)main.c   4.4 (Berkeley) 83/07/09";
 #include <signal.h>
 #include <ctype.h>
 #include <setjmp.h>
 #include <signal.h>
 #include <ctype.h>
 #include <setjmp.h>
+#include <syslog.h>
+#include <sys/file.h>
 #include "gettytab.h"
 
 #include "gettytab.h"
 
+extern char **environ;
+
 struct sgttyb tmode = {
        0, 0, CERASE, CKILL, 0
 };
 struct sgttyb tmode = {
        0, 0, CERASE, CKILL, 0
 };
@@ -33,7 +49,11 @@ int  digit;
 
 char   hostname[32];
 char   name[16];
 
 char   hostname[32];
 char   name[16];
+char   dev[] = "/dev/";
+char   ctty[] = "/dev/console";
+char   ttyn[32];
 char   *portselector();
 char   *portselector();
+char   *ttyname();
 
 #define        OBUFSIZ         128
 #define        TABBUFSIZ       512
 
 #define        OBUFSIZ         128
 #define        TABBUFSIZ       512
@@ -92,14 +112,53 @@ main(argc, argv)
 {
        char *tname;
        long allflags;
 {
        char *tname;
        long allflags;
+       int repcnt = 0;
 
        signal(SIGINT, SIG_IGN);
 /*
        signal(SIGQUIT, SIG_DFL);
 */
 
        signal(SIGINT, SIG_IGN);
 /*
        signal(SIGQUIT, SIG_DFL);
 */
+       openlog("getty", LOG_ODELAY|LOG_CONS, LOG_AUTH);
        gethostname(hostname, sizeof(hostname));
        if (hostname[0] == '\0')
                strcpy(hostname, "Amnesiac");
        gethostname(hostname, sizeof(hostname));
        if (hostname[0] == '\0')
                strcpy(hostname, "Amnesiac");
+       /*
+        * The following is a work around for vhangup interactions
+        * which cause great problems getting window systems started.
+        * If the tty line is "-", we do the old style getty presuming
+        * that the file descriptors are already set up for us. 
+        * J. Gettys - MIT Project Athena.
+        */
+       if (argc <= 2 || strcmp(argv[2], "-") == 0)
+           strcpy(ttyn, ttyname(0));
+       else {
+           strcpy(ttyn, dev);
+           strncat(ttyn, argv[2], sizeof(ttyn)-sizeof(dev));
+           if (strcmp(argv[0], "+") != 0) {
+               chown(ttyn, 0, 0);
+               chmod(ttyn, 0622);
+               /*
+                * Delay the open so DTR stays down long enough to be detected.
+                */
+               sleep(2);
+               while (open(ttyn, O_RDWR) != 0) {
+                       if (repcnt % 10 == 0) {
+                               syslog(LOG_ERR, "%s: %m", ttyn);
+                               closelog();
+                       }
+                       repcnt++;
+                       sleep(60);
+               }
+               signal(SIGHUP, SIG_IGN);
+               vhangup();
+               (void) open(ttyn, O_RDWR);
+               close(0);
+               dup(1);
+               dup(0);
+               signal(SIGHUP, SIG_DFL);
+           }
+       }
+
        gettable("default", defent, defstrs);
        gendefaults();
        tname = "default";
        gettable("default", defent, defstrs);
        gendefaults();
        tname = "default";
@@ -128,6 +187,12 @@ main(argc, argv)
                ioctl(0, TIOCSETD, &ldisp);
                if (HC)
                        ioctl(0, TIOCHPCL, 0);
                ioctl(0, TIOCSETD, &ldisp);
                if (HC)
                        ioctl(0, TIOCHPCL, 0);
+               if (AB) {
+                       extern char *autobaud();
+
+                       tname = autobaud();
+                       continue;
+               }
                if (PS) {
                        tname = portselector();
                        continue;
                if (PS) {
                        tname = portselector();
                        continue;
@@ -147,6 +212,9 @@ main(argc, argv)
                        alarm(TO);
                }
                if (getname()) {
                        alarm(TO);
                }
                if (getname()) {
+                       register int i;
+
+                       oflush();
                        alarm(0);
                        signal(SIGALRM, SIG_DFL);
                        if (!(upper || lower || digit))
                        alarm(0);
                        signal(SIGALRM, SIG_DFL);
                        if (!(upper || lower || digit))
@@ -163,11 +231,11 @@ main(argc, argv)
                        ioctl(0, TIOCSETP, &tmode);
                        ioctl(0, TIOCSLTC, &ltc);
                        ioctl(0, TIOCLSET, &allflags);
                        ioctl(0, TIOCSETP, &tmode);
                        ioctl(0, TIOCSLTC, &ltc);
                        ioctl(0, TIOCLSET, &allflags);
-                       putchr('\n');
-                       oflush();
-                       makeenv(env);
                        signal(SIGINT, SIG_DFL);
                        signal(SIGINT, SIG_DFL);
-                       execle(LO, "login", name, (char *)0, env);
+                       for (i = 0; environ[i] != (char *)0; i++)
+                               env[i] = environ[i];
+                       makeenv(&env[i]);
+                       execle(LO, "login", "-p", name, (char *) 0, env);
                        exit(1);
                }
                alarm(0);
                        exit(1);
                }
                alarm(0);
@@ -197,6 +265,7 @@ getname()
        tmode.sg_flags = setflags(1);
        prompt();
        if (PF > 0) {
        tmode.sg_flags = setflags(1);
        prompt();
        if (PF > 0) {
+               oflush();
                sleep(PF);
                PF = 0;
        }
                sleep(PF);
                PF = 0;
        }
@@ -214,14 +283,15 @@ getname()
                        return (0);
                if (c == EOT)
                        exit(1);
                        return (0);
                if (c == EOT)
                        exit(1);
-               if (c == '\r' || c == '\n' || np >= &name[16])
+               if (c == '\r' || c == '\n' || np >= &name[sizeof name]) {
+                       putf("\r\n");
                        break;
                        break;
-
+               }
                if (c >= 'a' && c <= 'z')
                        lower++;
                if (c >= 'a' && c <= 'z')
                        lower++;
-               else if (c >= 'A' && c <= 'Z') {
+               else if (c >= 'A' && c <= 'Z')
                        upper++;
                        upper++;
-               else if (c == ERASE || c == '#' || c == '\b') {
+               else if (c == ERASE || c == '#' || c == '\b') {
                        if (np > name) {
                                np--;
                                if (tmode.sg_ospeed >= B1200)
                        if (np > name) {
                                np--;
                                if (tmode.sg_ospeed >= B1200)
@@ -241,11 +311,9 @@ getname()
                        prompt();
                        np = name;
                        continue;
                        prompt();
                        np = name;
                        continue;
-               } else if (c == ' ')
-                       c = '_';
-               else if (c >= '0' && c <= '9')
+               } else if (c >= '0' && c <= '9')
                        digit++;
                        digit++;
-               if (IG && (c < ' ' || c > 0176))
+               if (IG && (c <= ' ' || c > 0176))
                        continue;
                *np++ = c;
                putchr(cs);
                        continue;
                *np++ = c;
                putchr(cs);
@@ -353,7 +421,10 @@ 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();
 
        while (*cp) {
                if (*cp != '%') {
 
        while (*cp) {
                if (*cp != '%') {
@@ -362,10 +433,24 @@ putf(cp)
                }
                switch (*++cp) {
 
                }
                switch (*++cp) {
 
+               case 't':
+                       ttyn = ttyname(0);
+                       slash = rindex(ttyn, '/');
+                       if (slash == (char *) 0)
+                               puts(ttyn);
+                       else
+                               puts(&slash[1]);
+                       break;
+
                case 'h':
                        puts(editedhost);
                        break;
 
                case 'h':
                        puts(editedhost);
                        break;
 
+               case 'd':
+                       get_date(datebuffer);
+                       puts(datebuffer);
+                       break;
+
                case '%':
                        putchr('%');
                        break;
                case '%':
                        putchr('%');
                        break;