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: }