|
|
1.1 ! root 1: #include <sgtty.h> ! 2: #include <stdio.h> ! 3: #include <ipc.h> ! 4: #include "defs.h" ! 5: #include "libc.h" ! 6: ! 7: /* this better be larger than either login names or passwords */ ! 8: #define PWDSIZE 16 ! 9: ! 10: char *_ipcgetpass(); ! 11: ! 12: /* ! 13: * log a user into a remote system in the v9 style ! 14: * ! 15: * First attempt at a valid userid came from ipcopen(), ! 16: * who sent it as part of the setup request. Remote ! 17: * system responds to that with either "OK" or "NO". ! 18: * If the latter, we must send a string containing ! 19: * "userid,password<newline>" until either we receive ! 20: * the OK response or our user here gives up. ! 21: */ ! 22: ipclogin(fd) ! 23: { ! 24: # define BFS 2*PWDSIZE + 3 /* <log>,<pswd>\n\0 */ ! 25: int cc; ! 26: struct sgttyb echo, noecho; ! 27: char buf[BFS]; ! 28: char *rbuf; ! 29: FILE *tty; ! 30: ! 31: cc = read(fd, buf, 2) ; ! 32: if (cc <= 0) { ! 33: errstr = "ipclogin can't read remote system"; ! 34: return(-1); ! 35: } ! 36: if (buf[0] == 'O' && buf[1] == 'K') ! 37: return fd ; ! 38: tty = fopen("/dev/tty", "r+"); ! 39: if (tty == NULL) { ! 40: errstr = "ipclogin can't open /dev/tty"; ! 41: return -1; ! 42: } ! 43: if (ioctl(fileno(tty), TIOCGETP, &echo) < 0) { ! 44: errstr = "ipclogin can't log in"; ! 45: return(-1); ! 46: } ! 47: noecho = echo; ! 48: noecho.sg_flags &= ~ECHO; ! 49: write (fileno(tty), "please ", 7) ; ! 50: while (1) { ! 51: rbuf = _ipcgetpass (tty, "login: "); ! 52: if (rbuf == 0) { ! 53: cc = -1; ! 54: break; ! 55: } ! 56: strcpy (buf, rbuf); ! 57: strcat (buf, ","); ! 58: ! 59: ioctl(fileno(tty), TIOCSETP, &noecho) ; ! 60: rbuf = _ipcgetpass (tty, "Password:"); ! 61: ioctl(fileno(tty), TIOCSETP, &echo) ; ! 62: write(fileno(tty), "\n", 1); ! 63: if (rbuf == 0) { ! 64: cc = -2; ! 65: break; ! 66: } ! 67: strcat (buf, rbuf); ! 68: strcat (buf, "\n"); ! 69: ! 70: write(fd, buf, strlen (buf)) ; ! 71: cc = read(fd, buf, 2) ; ! 72: if (cc <= 0) ! 73: break ; ! 74: if (buf[0] == 'O' && buf[1] == 'K') ! 75: break ; ! 76: } ! 77: fclose(tty); ! 78: if (cc <= 0) { ! 79: close(fd); ! 80: errstr = "ipclogin can't log in"; ! 81: return -1; ! 82: } ! 83: return fd; ! 84: } ! 85: ! 86: /* ! 87: * log a user into a remote system in the Berkeley style ! 88: * ! 89: * Send a string to the other side of the form ! 90: * "<NULL>local_user_name<NULL>remote_user_name<NULL>terminal_type<NULL>" ! 91: * The response is either ! 92: * "<NULL>" to indicate success or ! 93: * "<non_0_byte>string" where `string' is the error message ! 94: */ ! 95: ipcrogin(fd, opt) ! 96: int fd; ! 97: char *opt; ! 98: { ! 99: char buf[32]; ! 100: char *me=getlogin(); ! 101: int len; ! 102: ! 103: len = me!=NULL ? strlen(me) : 0; ! 104: write(fd, "", 1); ! 105: write(fd, me, len+1); ! 106: write(fd, me, len+1); ! 107: write(fd, opt, strlen(opt)+1); ! 108: if(read(fd, buf, 1) != 1) ! 109: return -1; ! 110: if(buf[0] != 0){ ! 111: while(read(fd, buf, 1) == 1){ ! 112: write(2, buf, 1); ! 113: if(buf[0] == '\n') ! 114: break; ! 115: } ! 116: return -1; ! 117: } ! 118: return 0; ! 119: } ! 120: ! 121: char * ! 122: _ipcgetpass(tty, prompt) ! 123: FILE *tty; ! 124: char * prompt; ! 125: { ! 126: char c; ! 127: char *cp; ! 128: static char buf[PWDSIZE + 1]; ! 129: ! 130: write (fileno(tty), prompt, strlen (prompt)); ! 131: ! 132: cp = buf; ! 133: while ((c = getc(tty)) != '\n' && c != EOF && c != '\04') { ! 134: if (cp < &buf[PWDSIZE]) ! 135: *cp++ = c; ! 136: } ! 137: *cp = '\0'; ! 138: ! 139: if (buf[0] == '\0' && (c == EOF || c== '\04')) ! 140: return ((char *)0); ! 141: if (buf[0] == '~' && buf[1] == '.') ! 142: return ((char *)0); ! 143: ! 144: return (buf); ! 145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.