|
|
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.