|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <ipc.h> ! 3: #include <sys/ttyio.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: ! 69: write(fd, buf, strlen(buf)+1) ; ! 70: cc = read(fd, buf, 2) ; ! 71: if (cc <= 0) ! 72: break ; ! 73: if (buf[0] == 'O' && buf[1] == 'K') ! 74: break ; ! 75: } ! 76: fclose(tty); ! 77: if (cc <= 0) { ! 78: close(fd); ! 79: errstr = "ipclogin can't log in"; ! 80: return -1; ! 81: } ! 82: return fd; ! 83: } ! 84: ! 85: /* ! 86: * log a user into a remote system in the Berkeley style ! 87: * ! 88: * Send a string to the other side of the form ! 89: * "terminal_type<NULL>" ! 90: * The response is either ! 91: * "<NULL>" to indicate success or ! 92: * "<non_0_byte>string" where `string' is the error message ! 93: */ ! 94: ipcrogin(fd, opt) ! 95: int fd; ! 96: char *opt; ! 97: { ! 98: char buf[32]; ! 99: ! 100: write(fd, opt, strlen(opt)+1); ! 101: if(read(fd, buf, 1) != 1) ! 102: return -1; ! 103: if(buf[0] != 0){ ! 104: while(read(fd, buf, 1) == 1){ ! 105: write(2, buf, 1); ! 106: if(buf[0] == '\n') ! 107: break; ! 108: } ! 109: return -1; ! 110: } ! 111: return 0; ! 112: } ! 113: ! 114: char * ! 115: _ipcgetpass(tty, prompt) ! 116: FILE *tty; ! 117: char * prompt; ! 118: { ! 119: char c; ! 120: char *cp; ! 121: static char buf[PWDSIZE + 1]; ! 122: ! 123: write (fileno(tty), prompt, strlen (prompt)); ! 124: ! 125: cp = buf; ! 126: while ((c = getc(tty)) != '\n' && c != EOF && c != '\04') { ! 127: if (cp < &buf[PWDSIZE]) ! 128: *cp++ = c; ! 129: } ! 130: *cp = '\0'; ! 131: ! 132: if (buf[0] == '\0' && (c == EOF || 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.