|
|
1.1 ! root 1: /* ! 2: * log a user into a remote system via datakit ! 3: * ! 4: * first attempt at a valid userid came from tdkdial(), ! 5: * who sent it as part of the setup request. Remote ! 6: * system responds to that with either "OK" or "NO". ! 7: * If the latter, we must send a string containing ! 8: * "userid,password<newline>" until either we receive ! 9: * the OK response or our user here gives up. ! 10: */ ! 11: ! 12: #include <sgtty.h> ! 13: #include <stdio.h> ! 14: extern char *dkerror; ! 15: ! 16: /* this better be larger than either login names or passwords */ ! 17: #define PWDSIZE 16 ! 18: ! 19: char *_tdkgetpass(); ! 20: ! 21: tdklogin(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: FILE *tty; ! 29: ! 30: cc = read(fd, buf, 2) ; ! 31: if (cc <= 0) { ! 32: dkerror = "tdklogin can't read remote system"; ! 33: return(-1); ! 34: } ! 35: if (buf[0] == 'O' && buf[1] == 'K') ! 36: return fd ; ! 37: tty = fopen("/dev/tty", "r+"); ! 38: if (tty == NULL) { ! 39: dkerror = "tdklogin can't open /dev/tty"; ! 40: return -1; ! 41: } ! 42: if (ioctl(fileno(tty), TIOCGETP, &echo) < 0) { ! 43: dkerror = "tdklogin can't log in"; ! 44: return(-1); ! 45: } ! 46: noecho = echo; ! 47: noecho.sg_flags &= ~ECHO; ! 48: write (fileno(tty), "please ", 7) ; ! 49: while (1) { ! 50: rbuf = _tdkgetpass (tty, "login: "); ! 51: if (rbuf == 0) { ! 52: cc = -1; ! 53: break; ! 54: } ! 55: strcpy (buf, rbuf); ! 56: strcat (buf, ","); ! 57: ! 58: ioctl(fileno(tty), TIOCSETP, &noecho) ; ! 59: rbuf = _tdkgetpass (tty, "Password:"); ! 60: ioctl(fileno(tty), TIOCSETP, &echo) ; ! 61: write(fileno(tty), "\n", 1); ! 62: if (rbuf == 0) { ! 63: cc = -2; ! 64: break; ! 65: } ! 66: strcat (buf, rbuf); ! 67: strcat (buf, "\n"); ! 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: dkerror = "tdklogin can't log in"; ! 80: return -1; ! 81: } ! 82: return fd; ! 83: } ! 84: ! 85: ! 86: char * ! 87: _tdkgetpass(tty, prompt) ! 88: FILE *tty; ! 89: char * prompt; ! 90: { ! 91: char c; ! 92: char *cp; ! 93: static char buf[PWDSIZE + 1]; ! 94: ! 95: write (fileno(tty), prompt, strlen (prompt)); ! 96: ! 97: cp = buf; ! 98: while ((c = getc(tty)) != '\n' && c != EOF && c != '\04') { ! 99: if (cp < &buf[PWDSIZE]) ! 100: *cp++ = c; ! 101: } ! 102: *cp = '\0'; ! 103: ! 104: if (buf[0] == '\0' && (c == EOF || c== '\04')) ! 105: return ((char *)0); ! 106: if (buf[0] == '~' && buf[1] == '.') ! 107: return ((char *)0); ! 108: ! 109: return (buf); ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.