date and time created 83/02/11 15:44:08 by rrh
[unix-history] / usr / src / usr.bin / login / login.c.1
index 81a0893..dd7b33f 100644 (file)
@@ -1,4 +1,4 @@
-static char *sccsid = "@(#)login.c.1   4.13 (Berkeley) 4.13";
+static char *sccsid = "@(#)login.c.1   4.20 82/12/21";
 /*
  * login [ name ]
  * login -r
 /*
  * login [ name ]
  * login -r
@@ -12,15 +12,11 @@ static      char *sccsid = "@(#)login.c.1   4.13 (Berkeley) 4.13";
 #include <stdio.h>
 #include <sys/stat.h>
 #include <lastlog.h>
 #include <stdio.h>
 #include <sys/stat.h>
 #include <lastlog.h>
-#include <whoami.h>
-#ifdef UNAME
-#include <sys/utsname.h>
-#endif
 
 #define        SCPYN(a, b)     strncpy(a, b, sizeof(a))
 
 
 #define        SCPYN(a, b)     strncpy(a, b, sizeof(a))
 
-#define NMAX sizeof(utmp.ut_name)
-#define LMAX sizeof(utmp.ut_line)
+#define NMAX   sizeof(utmp.ut_name)
+#define LMAX   sizeof(utmp.ut_line)
 
 #define        FALSE   0
 #define        TRUE    -1
 
 #define        FALSE   0
 #define        TRUE    -1
@@ -30,7 +26,7 @@ char  qlog[]  =       ".hushlogin";
 char   securetty[] =   "/etc/securetty";
 char   maildir[30] =   "/usr/spool/mail/";
 char   lastlog[] =     "/usr/adm/lastlog";
 char   securetty[] =   "/etc/securetty";
 char   maildir[30] =   "/usr/spool/mail/";
 char   lastlog[] =     "/usr/adm/lastlog";
-struct passwd nouser = {"", "nope"};
+struct passwd nouser = {"", "nope", -1, -1, -1, "", "", "", "" };
 struct sgttyb ttyb;
 struct utmp utmp;
 char   minusnam[16] = "-";
 struct sgttyb ttyb;
 struct utmp utmp;
 char   minusnam[16] = "-";
@@ -58,27 +54,17 @@ char        *rindex();
 char   *stypeof();
 extern char **environ;
 
 char   *stypeof();
 extern char **environ;
 
-#define        CTRL(c) ('c'&037)
-#define        CERASE  '#'
-#define        CEOT    CTRL(d)
-#define        CKILL   '@'
-#define        CQUIT   034             /* FS, cntl shift L */
-#define        CINTR   0177            /* DEL */
-#define        CSTOP   CTRL(s)
-#define        CSTART  CTRL(q)
-#define        CBRK    0377
-struct tchars tc = {
-       CINTR, CQUIT, CSTART, CSTOP, CEOT, CBRK
+struct ttychars tc = {
+       CERASE, CKILL,  CINTR,  CQUIT,  CSTART,
+       CSTOP,  CEOF,   CBRK,   CSUSP,  CDSUSP,
+       CRPRNT, CFLUSH, CWERASE,CLNEXT
 };
 };
-#ifdef TIOCLSET
-struct ltchars ltc = {
-       CTRL(z), CTRL(y), CTRL(r), CTRL(o), CTRL(w), CTRL(v)
-};
-#endif
 
 int    rflag;
 
 int    rflag;
-char   rusername[NMAX+1];
+char   rusername[NMAX+1], lusername[NMAX+1];
 char   rpassword[NMAX+1];
 char   rpassword[NMAX+1];
+char   name[NMAX+1];
+char   *rhost;
 
 main(argc, argv)
 char **argv;
 
 main(argc, argv)
 char **argv;
@@ -90,10 +76,8 @@ char **argv;
        int i;
        FILE *nlfd;
        char *ttyn;
        int i;
        FILE *nlfd;
        char *ttyn;
-       int     ldisc = 0;
-#ifdef UNAME
-       struct utsname uts;
-#endif
+       int ldisc = 0, zero = 0;
+       FILE *hostf; int first = 1;
 
        alarm(60);
        signal(SIGQUIT, SIG_IGN);
 
        alarm(60);
        signal(SIGQUIT, SIG_IGN);
@@ -101,17 +85,59 @@ char **argv;
        nice(-100);
        nice(20);
        nice(0);
        nice(-100);
        nice(20);
        nice(0);
-       if (argc > 0 && !strcmp(argv[1], "-r")) {
+       if (argc > 1 && !strcmp(argv[1], "-r")) {
                rflag++;
                rflag++;
-               getstr(rusername, sizeof (rusername), "Username");
-               getstr(rpassword, sizeof (rpassword), "Password");
+               rhost = argv[2];
+               argc = 1;
+               getstr(rusername, sizeof (rusername), "remuser");
+               getstr(lusername, sizeof (lusername), "locuser");
                getstr(term+5, sizeof(term)-5, "Terminal type");
                getstr(term+5, sizeof(term)-5, "Terminal type");
+               if (getuid())
+                       goto abnormal;
+               setpwent();
+               pwd = getpwnam(lusername);
+               endpwent();
+               if (pwd == NULL) {
+                       if (strcmp(rusername, lusername))
+                               printf("%s: No such user\r\n", lusername);
+                       goto abnormal;
+               }
+               hostf = pwd->pw_uid ? fopen("/etc/hosts.equiv", "r") : 0;
+       again:
+               if (hostf) {
+                 char ahost[32];
+                 while (fgets(ahost, sizeof (ahost), hostf)) {
+                       char *user;
+                       if (index(ahost, '\n'))
+                               *index(ahost, '\n') = 0;
+                       user = index(ahost, ' ');
+                       if (user)
+                               *user++ = 0;
+                       if (!strcmp(rhost, ahost) &&
+                           !strcmp(rusername, user ? user : lusername)) {
+                               fclose(hostf);
+                               goto normal;
+                       }
+                 }
+                 fclose(hostf);
+               }
+               if (first == 1) {
+                       first = 0;
+                       if (chdir(pwd->pw_dir) < 0)
+                               goto again;
+                       hostf = fopen(".rhosts", "r");
+                       goto again;
+               }
+abnormal:
+               rhost = 0;
+               rflag = -1;
        }
        }
-#ifdef TIOCLSET
-       ioctl(0, TIOCLSET, 0);
-#endif
+normal:
+       ioctl(0, TIOCLSET, &zero);      /* XXX */
        ioctl(0, TIOCNXCL, 0);
        ioctl(0, TIOCNXCL, 0);
-       gtty(0, &ttyb);
+       ioctl(0, FIONBIO, &zero);
+       ioctl(0, FIOASYNC, &zero);
+       ioctl(0, TIOCGETP, &ttyb);      /* XXX */
        if (rflag) {
                char *cp = index(term, '/');
                if (cp) {
        if (rflag) {
                char *cp = index(term, '/');
                if (cp) {
@@ -125,13 +151,8 @@ char **argv;
                }
                ttyb.sg_flags = ECHO|CRMOD|ANYP|XTABS;
        }
                }
                ttyb.sg_flags = ECHO|CRMOD|ANYP|XTABS;
        }
-       ttyb.sg_erase = CERASE;
-       ttyb.sg_kill = CKILL;
-       stty(0, &ttyb);
-       ioctl(0, TIOCSETC, &tc);
-#ifdef TIOCLSET
-       ioctl(0, TIOCSLTC, &ltc);
-#endif
+       ioctl(0, TIOCSETP, &ttyb);      /* XXX */
+       ioctl(0, TIOCCSET, &tc);
        for (t=3; t<20; t++)
                close(t);
        ttyn = ttyname(0);
        for (t=3; t<20; t++)
                close(t);
        ttyn = ttyname(0);
@@ -146,40 +167,48 @@ char **argv;
                        SCPYN(utmp.ut_name, argv[1]);
                        argc = 0;
                }
                        SCPYN(utmp.ut_name, argv[1]);
                        argc = 0;
                }
-               if (rflag)
-                       strcpy(utmp.ut_name, rusername);
-               else
-               while (utmp.ut_name[0] == '\0') {
-                       namep = utmp.ut_name;
-                       printf("%s login: ", sysname);
-                       while ((c = getchar()) != '\n') {
-                               if (c == ' ')
-                                       c = '_';
-                               if (c == EOF)
-                                       exit(0);
-                               if (namep < utmp.ut_name+NMAX)
-                                       *namep++ = c;
+               if (rflag) {
+                       SCPYN(utmp.ut_name, lusername);
+                       if (rflag == -1)
+                               rflag = 0;
+               } else
+                       while (utmp.ut_name[0] == '\0') {
+                               namep = utmp.ut_name;
+                               { char hostname[32];
+                                 gethostname(hostname, sizeof (hostname));
+                                 printf("%s login: ", hostname); }
+                               while ((c = getchar()) != '\n') {
+                                       if (c == ' ')
+                                               c = '_';
+                                       if (c == EOF)
+                                               exit(0);
+                                       if (namep < utmp.ut_name+NMAX)
+                                               *namep++ = c;
+                               }
                        }
                        }
+               if (rhost == 0) {
+                       setpwent();
+                       if ((pwd = getpwnam(utmp.ut_name)) == NULL)
+                               pwd = &nouser;
+                       endpwent();
                }
                }
-               setpwent();
-               if ((pwd = getpwnam(utmp.ut_name)) == NULL)
-                       pwd = &nouser;
-               endpwent();
                if (!strcmp(pwd->pw_shell, "/bin/csh")) {
                        ldisc = NTTYDISC;
                        ioctl(0, TIOCSETD, &ldisc);
                }
                if (!strcmp(pwd->pw_shell, "/bin/csh")) {
                        ldisc = NTTYDISC;
                        ioctl(0, TIOCSETD, &ldisc);
                }
-               if (*pwd->pw_passwd != '\0') {
-                       char *pp;
-                       nice(-4);
-                       if (rflag == 0)
-                               pp = getpass("Password:");
-                       else
-                               pp = rpassword;
-                       namep = crypt(pp,pwd->pw_passwd);
-                       nice(4);
-                       if (strcmp(namep, pwd->pw_passwd))
-                               invalid = TRUE;
+               if (rhost == 0) {
+                       if (*pwd->pw_passwd != '\0') {
+                               char *pp;
+                               nice(-4);
+                               if (rflag == 0)
+                                       pp = getpass("Password:");
+                               else
+                                       pp = rpassword;
+                               namep = crypt(pp,pwd->pw_passwd);
+                               nice(4);
+                               if (strcmp(namep, pwd->pw_passwd))
+                                       invalid = TRUE;
+                       }
                }
                if (pwd->pw_uid != 0 && (nlfd = fopen(nolog, "r")) > 0) {
                        /* logins are disabled except for root */
                }
                if (pwd->pw_uid != 0 && (nlfd = fopen(nolog, "r")) > 0) {
                        /* logins are disabled except for root */
@@ -191,26 +220,15 @@ char **argv;
                }
                if (!invalid && pwd->pw_uid == 0 &&
                    !rootterm(ttyn+sizeof("/dev/")-1)) {
                }
                if (!invalid && pwd->pw_uid == 0 &&
                    !rootterm(ttyn+sizeof("/dev/")-1)) {
-                       FILE *console = fopen("/dev/console", "w");
-                       if (console != NULL) {
-                               fprintf(console, "\r\nROOT LOGIN REFUSED %s\r\n"
-                                   , ttyn+sizeof("/dev/")-1
-                               );
-                               fclose(console);
-                       }
+                       logerr("ROOT LOGIN REFUSED %s",
+                           ttyn+sizeof("/dev/")-1);
                        invalid = TRUE;
                }
                if (invalid) {
                        printf("Login incorrect\n");
                        invalid = TRUE;
                }
                if (invalid) {
                        printf("Login incorrect\n");
-                       if (ttyn[sizeof("/dev/tty")-1] == 'd') {
-                               FILE *console = fopen("/dev/console", "w");
-                               if (console != NULL) {
-                                       fprintf(console, "\r\nBADDIALUP %s %s\r\n"
-                                           , ttyn+sizeof("/dev/")-1
-                                           , utmp.ut_name);
-                                       fclose(console);
-                               }
-                       }
+                       if (ttyn[sizeof("/dev/tty")-1] == 'd')
+                               logerr("BADDIALUP %s %s\n",
+                                   ttyn+sizeof("/dev/")-1, utmp.ut_name);
                }
                if (*pwd->pw_shell == '\0')
                        pwd->pw_shell = "/bin/sh";
                }
                if (*pwd->pw_shell == '\0')
                        pwd->pw_shell = "/bin/sh";
@@ -242,15 +260,16 @@ char **argv;
                write(f, (char *)&utmp, sizeof(utmp));
                close(f);
        }
                write(f, (char *)&utmp, sizeof(utmp));
                close(f);
        }
-       quietlog = FALSE;
+       quietlog = 0;
        if (access(qlog, 0) == 0)
        if (access(qlog, 0) == 0)
-               quietlog = TRUE;
-       if ( !quietlog && (f = open(lastlog, 2)) >= 0 ) {
+               quietlog = 1;
+       if ((f = open(lastlog, 2)) >= 0) {
                struct lastlog ll;
 
                lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);
                if (read(f, (char *) &ll, sizeof ll) == sizeof ll &&
                    ll.ll_time != 0) {
                struct lastlog ll;
 
                lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);
                if (read(f, (char *) &ll, sizeof ll) == sizeof ll &&
                    ll.ll_time != 0) {
+                       if (quietlog == 0)
                        printf("Last login: %.*s on %.*s\n"
                            , 24-5
                            , (char *) ctime(&ll.ll_time)
                        printf("Last login: %.*s on %.*s\n"
                            , 24-5
                            , (char *) ctime(&ll.ll_time)
@@ -265,13 +284,16 @@ char **argv;
                close(f);
        }
        chown(ttyn, pwd->pw_uid, pwd->pw_gid);
                close(f);
        }
        chown(ttyn, pwd->pw_uid, pwd->pw_gid);
+       chmod(ttyn, 0622);
        setgid(pwd->pw_gid);
        setgid(pwd->pw_gid);
-       inigrp(utmp.ut_name, pwd->pw_gid);
+       strncpy(name, utmp.ut_name, NMAX);
+       name[NMAX] = '\0';
+       initgroups(name, pwd->pw_gid);
        setuid(pwd->pw_uid);
        environ = envinit;
        strncat(homedir, pwd->pw_dir, sizeof(homedir)-6);
        strncat(shell, pwd->pw_shell, sizeof(shell)-7);
        setuid(pwd->pw_uid);
        environ = envinit;
        strncat(homedir, pwd->pw_dir, sizeof(homedir)-6);
        strncat(shell, pwd->pw_shell, sizeof(shell)-7);
-       if (rflag == 0)
+       if (term[strlen("TERM=")] == 0)
                strncat(term, stypeof(ttyn), sizeof(term)-6);
        strncat(user, pwd->pw_name, sizeof(user)-6);
        if ((namep = rindex(pwd->pw_shell, '/')) == NULL)
                strncat(term, stypeof(ttyn), sizeof(term)-6);
        strncat(user, pwd->pw_name, sizeof(user)-6);
        if ((namep = rindex(pwd->pw_shell, '/')) == NULL)
@@ -280,23 +302,10 @@ char **argv;
                namep++;
        strcat(minusnam, namep);
        alarm(0);
                namep++;
        strcat(minusnam, namep);
        alarm(0);
-#ifdef ARPAVAX
-       if (pwd->pw_gid == 27)                  /* UGLY ! */
-               umask(2);
-       else
-#endif
-               umask(022);
-       if (ttyn[sizeof("/dev/tty")-1] == 'd') {
-               FILE *console = fopen("/dev/console", "w");
-               if (console != NULL) {
-                       fprintf(console, "\r\nDIALUP %s %s\r\n"
-                           , ttyn+sizeof("/dev/")-1
-                           , pwd->pw_name
-                       );
-                       fclose(console);
-               }
-       }
-       if ( !quietlog ) {
+       umask(022);
+       if (ttyn[sizeof("/dev/tty")-1] == 'd')
+               logerr("DIALUP %s %s\n", ttyn+sizeof("/dev/")-1, pwd->pw_name);
+       if (!quietlog) {
                showmotd();
                strcat(maildir, pwd->pw_name);
                if (access(maildir,4)==0) {
                showmotd();
                strcat(maildir, pwd->pw_name);
                if (access(maildir,4)==0) {
@@ -319,19 +328,19 @@ char **argv;
 int    stopmotd;
 catch()
 {
 int    stopmotd;
 catch()
 {
+
        signal(SIGINT, SIG_IGN);
        stopmotd++;
 }
 
        signal(SIGINT, SIG_IGN);
        stopmotd++;
 }
 
-/*
- * return true if OK for root to login on this terminal
- */
 rootterm(tty)
 rootterm(tty)
-       char    *tty;
+       char *tty;
 {
        register FILE *fd;
 {
        register FILE *fd;
-       char    buf[100];
+       char buf[100];
 
 
+       if (rflag)
+               return(1);
        if ((fd = fopen(securetty, "r")) == NULL)
                return(1);
        while (fgets(buf, sizeof buf, fd) != NULL) {
        if ((fd = fopen(securetty, "r")) == NULL)
                return(1);
        while (fgets(buf, sizeof buf, fd) != NULL) {
@@ -419,3 +428,9 @@ getstr(buf, cnt, err)
                *buf++ = c;
        } while (c != 0);
 }
                *buf++ = c;
        } while (c != 0);
 }
+
+logerr(fmt, a1, a2, a3)
+       char *fmt, *a1, *a2, *a3;
+{
+
+}