home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / s1 / login.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-05-13  |  2.9 KB  |  191 lines

  1. #
  2. /*
  3.  * login [ name ]
  4.  */
  5.  
  6. struct {
  7.     char    name[8];
  8.     char    tty;
  9.     char    ifill;
  10.     int    time[2];
  11.     int    ufill;
  12. } utmp;
  13.  
  14. struct {
  15.     int    speeds;
  16.     char    erase, kill;
  17.     int    tflags;
  18. } ttyb;
  19.  
  20. struct {
  21.     int    junk[5];
  22.     int    size;
  23.     int    more[12];
  24. } statb;
  25.  
  26. char    *ttyx;
  27.  
  28. #define    ECHO    010
  29.  
  30. main(argc, argv)
  31. char **argv;
  32. {
  33.     char pbuf[128];
  34.     register char *namep, *np;
  35.     char pwbuf[9];
  36.     int t, sflags, f, c, uid, gid;
  37.  
  38.     signal(3, 1);
  39.     signal(2, 1);
  40.     nice(0);
  41.     ttyx = "/dev/ttyx";
  42.     if ((utmp.tty=ttyn(0)) == 'x') {
  43.         write(1, "Sorry.\n", 7);
  44.         exit();
  45.     }
  46.     ttyx[8] = utmp.tty;
  47.     gtty(0, &ttyb);
  48.     ttyb.erase = '#';
  49.     ttyb.kill = '@';
  50.     stty(0, &ttyb);
  51.     loop:
  52.     namep = utmp.name;
  53.     if (argc>1) {
  54.         np = argv[1];
  55.         while (namep<utmp.name+8 && *np)
  56.             *namep++ = *np++;
  57.         argc = 0;
  58.     } else {
  59.         write(1, "Name: ", 7);
  60.         while ((c = getchar()) != '\n') {
  61.             if (c <= 0)
  62.                 exit();
  63.             if (namep < utmp.name+8)
  64.                 *namep++ = c;
  65.         }
  66.     }
  67.     while (namep < utmp.name+8)
  68.         *namep++ = ' ';
  69.     if (getpwentry(utmp.name, pbuf))
  70.         goto bad;
  71.     np = colon(pbuf);
  72.     if (*np!=':') {
  73.         sflags = ttyb.tflags;
  74.         ttyb.tflags =& ~ ECHO;
  75.         stty(0, &ttyb);
  76.         write(1, "Password: ", 10);
  77.         namep = pwbuf;
  78.         while ((c=getchar()) != '\n') {
  79.             if (c <= 0)
  80.                 exit();
  81.             if (namep<pwbuf+8)
  82.                 *namep++ = c;
  83.         }
  84.         *namep++ = '\0';
  85.         ttyb.tflags = sflags;
  86.         stty(0, &ttyb);
  87.         write(1, "\n", 1);
  88.         namep = crypt(pwbuf);
  89.         while (*namep++ == *np++);
  90.         if (*--namep!='\0' || *--np!=':')
  91.             goto bad;
  92.     }
  93.     np = colon(np);
  94.     uid = 0;
  95.     while (*np != ':')
  96.         uid = uid*10 + *np++ - '0';
  97.     np++;
  98.     gid = 0;
  99.     while (*np != ':')
  100.         gid = gid*10 + *np++ - '0';
  101.     np++;
  102.     np = colon(np);
  103.     namep = np;
  104.     np = colon(np);
  105.     if (chdir(namep)<0) {
  106.         write(1, "No directory\n", 13);
  107.         goto loop;
  108.     }
  109.     time(utmp.time);
  110.     if ((f = open("/etc/utmp", 1)) >= 0) {
  111.         t = utmp.tty;
  112.         if (t>='a')
  113.             t =- 'a' - (10+'0');
  114.         seek(f, (t-'0')*16, 0);
  115.         write(f, &utmp, 16);
  116.         close(f);
  117.     }
  118.     if ((f = open("/usr/adm/wtmp", 1)) >= 0) {
  119.         seek(f, 0, 2);
  120.         write(f, &utmp, 16);
  121.         close(f);
  122.     }
  123.     if ((f = open("/etc/motd", 0)) >= 0) {
  124.         while(read(f, &t, 1) > 0)
  125.             write(1, &t, 1);
  126.         close(f);
  127.     }
  128.     if(stat(".mail", &statb) >= 0 && statb.size)
  129.         write(1, "You have mail.\n", 15);
  130.     chown(ttyx, uid);
  131.     setgid(gid);
  132.     setuid(uid);
  133.     if (*np == '\0')
  134.         np = "/bin/sh";
  135.     execl(np, "-", 0);
  136.     write(1, "No shell.\n", 9);
  137.     exit();
  138. bad:
  139.     write(1, "Login incorrect.\n", 17);
  140.     goto loop;
  141. }
  142.  
  143. getpwentry(name, buf)
  144. char *name, *buf;
  145. {
  146.     extern fin;
  147.     int fi, r, c;
  148.     register char *gnp, *rnp;
  149.  
  150.     fi = fin;
  151.     r = 1;
  152.     if((fin = open("/etc/passwd", 0)) < 0)
  153.         goto ret;
  154. loop:
  155.     gnp = name;
  156.     rnp = buf;
  157.     while((c=getchar()) != '\n') {
  158.         if(c <= 0)
  159.             goto ret;
  160.         *rnp++ = c;
  161.     }
  162.     *rnp++ = '\0';
  163.     rnp = buf;
  164.     while (*gnp++ == *rnp++);
  165.     if ((*--gnp!=' ' && gnp<name+8) || *--rnp!=':')
  166.         goto loop;
  167.     r = 0;
  168. ret:
  169.     close(fin);
  170.     fin = 0;
  171.     (&fin)[1] = 0;
  172.     (&fin)[2] = 0;
  173.     return(r);
  174. }
  175.  
  176. colon(p)
  177. char *p;
  178. {
  179.     register char *rp;
  180.  
  181.     rp = p;
  182.     while (*rp != ':') {
  183.         if (*rp++ == '\0') {
  184.             write(1, "Bad /etc/passwd\n", 16);
  185.             exit();
  186.         }
  187.     }
  188.     *rp++ = '\0';
  189.     return(rp);
  190. }
  191.