|
|
1.1 root 1: /*
2: * RLOGIN
3: * Connect terminal to TCP/IP network
4: * Operation is line-at-a-time with remote echo.
5: */
6: #include <stdio.h>
7: #include <sys/param.h>
8: #include <sys/types.h>
9: #include <sgtty.h>
10: #include <signal.h>
11: #include <errno.h>
12: #include <pwd.h>
13:
14: #define CEOT 04
15: #define NULL 0
16:
17:
18: struct sgttyb locvec, savloc;
19: struct tchars savechars;
20: struct ltchars lsavechars;
21: struct ltchars nlchars = { -1, -1, -1, -1, -1, -1 };
22:
23: int rem; /* remote descriptor */
24: int rembit; /* 1<<rem; for select */
25:
26: fd_set rdfd_set;
27: #define NSELFD (rem+1)
28:
29: int sigint();
30:
31: char *mytty;
32: SIG_TYP savint, savquit;
33: char term[64] = "network";
34:
35: intcatch(){ /* catch interrupts, turn them into rubouts */
36: signal(SIGINT, intcatch);
37: ioctl(rem, TIOCFLUSH, 0);
38: write(rem, &savechars.t_intrc, 1);
39: ioctl(rem, TIOCFLUSH, 0);
40: ioctl(0, TIOCFLUSH, 0);
41: FD_ZERO(rdfd_set);
42: }
43:
44: quitcatch(){ /* catch quits, turn them into FS's */
45: ioctl(0, TIOCFLUSH, 0);
46: signal(SIGQUIT, quitcatch);
47: write(rem, &savechars.t_quitc, 1);
48: }
49:
50: main(argc,argv)
51: char **argv;
52: {
53: char *name=0, *host, *cp;
54: struct passwd *pwd;
55: extern struct passwd *getpwuid();
56:
57: ioctl(0, TIOCGETC, &savechars);
58: ioctl(0, TIOCGLTC, &lsavechars);
59: ioctl(0, TIOCGETP, &savloc);
60: locvec = savloc;
61:
62: argv++, --argc;
63: host = *argv++, --argc;
64: another:
65: if (argc > 0 && !strcmp(*argv, "-l")) {
66: argv++, argc--;
67: if (argc == 0)
68: goto usage;
69: name = *argv++; argc--;
70: goto another;
71: }
72: if (host == 0)
73: goto usage;
74: if (argc > 0)
75: goto usage;
76: pwd = getpwuid(getuid());
77: if (pwd == 0) {
78: fprintf(stderr, "Who are you?\n");
79: exit(1);
80: }
81: cp = (char *)getenv("TERM");
82: if (cp)
83: strcpy(term, cp);
84:
85:
86: /*
87: * request circuit to host.
88: */
89: rem = tcp_rcmd(host, "login", pwd->pw_name,
90: name ? name : pwd->pw_name, term, 0);
91: if (rem < 0)
92: exit(1);
93: if(setuid(getuid()) < 0){
94: perror("setuid");
95: exit(1);
96: }
97:
98: savint = signal(SIGINT, intcatch);
99: savquit = signal(SIGQUIT, quitcatch);
100:
101: locvec.sg_flags &= ~(CRMOD|ECHO|XTABS);
102: locvec.sg_flags |= CBREAK;
103: ioctl(0, TIOCSETP, &locvec);
104: ioctl(0, TIOCSLTC, &nlchars);
105:
106:
107: /*
108: * main loop.
109: */
110: do; while(scan() != -1);
111: quit("select failed");
112: /*NOTREACHED*/
113: usage:
114: fprintf(stderr, "Usage: rogin host [-l user]\n");
115: exit(1);
116: }
117: scan()
118: {
119: extern errno;
120:
121: FD_ZERO(rdfd_set);
122: Loop:
123: FD_SET(0, rdfd_set);
124: FD_SET(rem, rdfd_set);
125: if(select(NSELFD, &rdfd_set, (fd_set *)0, 2000) == -1)
126: if(errno == EINTR)
127: goto Loop;
128: else
129: return -1;
130: if(FD_ISSET(0, rdfd_set))
131: keyboard();
132: if(FD_ISSET(rem, rdfd_set))
133: remote();
134: return 0;
135: }
136:
137: quit(s)
138: char *s;
139: {
140: printf("rogin: %s\n\r", s);
141: ioctl(0, TIOCSETP, &savloc);
142: ioctl(0, TIOCSLTC, &lsavechars);
143: signal(SIGINT, SIG_DFL);
144: ioctl(rem, TIOCFLUSH, 0);
145: savloc.sg_ispeed = savloc.sg_ospeed = 0; /* hangup */
146: ioctl(rem, TIOCSETP, &savloc);
147: close(rem);
148: exit(strcmp(s, "eof"));
149: }
150:
151: /*
152: * Scan data from keyboard, looking for escape lines.
153: */
154: keyboard()
155: {
156: register c;
157: register cc;
158: register char *bp;
159: register char *be, *obp;
160: char buf[1024];
161: static char line[128];
162: static char *linep = &line[0];
163: static col = 0;
164: long time();
165:
166: cc = read(0, buf, sizeof buf);
167: if(cc <0){
168: if(errno == EINTR)
169: return;
170: }
171: if(cc <= 0)
172: quit("read error on file descriptor 0");
173: be = buf+cc;
174: bp = obp = buf;
175: while(bp < be) {
176: c = *bp++;
177: if (col==0 && c=='~') {
178: *linep++ = c;
179: col = 1;
180: locvec.sg_flags |= savloc.sg_flags&(CRMOD|ECHO);
181: ioctl(0, TIOCSETP, &locvec);
182: write(1, linep-1, 1);
183: continue;
184: }
185: col++;
186: if (c=='\r')
187: c = '\n';
188: if (linep>line) {
189: *linep++ = c;
190: if (c==savloc.sg_kill)
191: write(1, "\n", 1);
192: if (c==savloc.sg_erase)
193: linep -= 2;
194: if (c==savloc.sg_kill || linep<=line) {
195: linep = line;
196: locvec.sg_flags &= ~(CRMOD|ECHO);
197: ioctl(0, TIOCSETP, &locvec);
198: col = 0;
199: obp = bp;
200: }
201: }
202: if (c=='\n') {
203: col = 0;
204: if (linep > line) {
205: *linep = '\0';
206: if (escape(line+1))
207: write(rem, line+1, linep-line-1);
208: obp = bp;
209: linep = line;
210: locvec.sg_flags &= ~(CRMOD|ECHO);
211: ioctl(0, TIOCSETP, &locvec);
212: }
213: }
214: }
215: if (bp>obp && linep==line)
216: if(write(rem, obp, bp-obp) <= 0)
217: quit("Eof");
218: }
219:
220: /*
221: * Send data from remote machine to standard output (trivial)
222: */
223: remote(){
224: char buf[1024];
225: register n;
226:
227: n = read(rem, buf, sizeof buf);
228: if(n < 0 && errno == EINTR)
229: return;
230: if(n <= 0)
231: quit("Eof");
232: write(1, buf, n);
233: }
234:
235: escape(line)
236: register char *line;
237: {
238:
239: switch(*line++) {
240: case '!':
241: cunix(line);
242: return(0);
243:
244: case '.':
245: case CEOT:
246: quit("eof");
247:
248: case 'b':
249: ioctl(rem, TIOCSBRK, 0);
250: return(0);
251: default:
252: return(1);
253: }
254: }
255:
256: cunix(prog)
257: char *prog;
258: {
259: register int upid;
260: int retcode;
261:
262: if ((upid = fork()) == 0) {
263: signal(SIGINT, savint);
264: signal(SIGQUIT, savquit);
265: ioctl(0, TIOCSETN, &savloc);
266: ioctl(0, TIOCSLTC, &lsavechars);
267: if (*prog == '\n')
268: execl("/bin/sh", "sh", "-i", 0);
269: else
270: execl("/bin/sh","sh","-c",prog,0);
271: exit(0100);
272: }
273: if (upid < 0) {
274: printf("can't fork\n");
275: } else {
276: while((wait(&retcode) !=upid))
277: ;
278: }
279: signal(SIGINT, intcatch);
280: signal(SIGQUIT, quitcatch);
281: ioctl(0, TIOCSETN, &locvec);
282: ioctl(0, TIOCSLTC, &nlchars);
283: printf("!!\n");
284: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.