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