|
|
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: host = (char *)rindex(argv[0], '/'); ! 63: if (host) ! 64: host++; ! 65: else ! 66: host = argv[0]; ! 67: argv++, --argc; ! 68: if (!strcmp(host, "rogin")) ! 69: host = *argv++, --argc; ! 70: another: ! 71: if (argc > 0 && !strcmp(*argv, "-l")) { ! 72: argv++, argc--; ! 73: if (argc == 0) ! 74: goto usage; ! 75: name = *argv++; argc--; ! 76: goto another; ! 77: } ! 78: if (host == 0) ! 79: goto usage; ! 80: if (argc > 0) ! 81: goto usage; ! 82: pwd = getpwuid(getuid()); ! 83: if (pwd == 0) { ! 84: fprintf(stderr, "Who are you?\n"); ! 85: exit(1); ! 86: } ! 87: cp = (char *)getenv("TERM"); ! 88: if (cp) ! 89: strcpy(term, cp); ! 90: ! 91: ! 92: /* ! 93: * request circuit to host. ! 94: */ ! 95: rem = tcp_rcmd(host, "login", pwd->pw_name, ! 96: name ? name : pwd->pw_name, term, 0); ! 97: if (rem < 0) ! 98: exit(1); ! 99: if(setuid(getuid()) < 0){ ! 100: perror("setuid"); ! 101: exit(1); ! 102: } ! 103: ! 104: savint = signal(SIGINT, intcatch); ! 105: savquit = signal(SIGQUIT, quitcatch); ! 106: ! 107: locvec.sg_flags &= ~(CRMOD|ECHO|XTABS); ! 108: locvec.sg_flags |= CBREAK; ! 109: ioctl(0, TIOCSETP, &locvec); ! 110: ioctl(0, TIOCSLTC, &nlchars); ! 111: ! 112: ! 113: /* ! 114: * main loop. ! 115: */ ! 116: do; while(scan() != -1); ! 117: quit("select failed"); ! 118: /*NOTREACHED*/ ! 119: usage: ! 120: fprintf(stderr, "Usage: rogin host [-l user]\n"); ! 121: exit(1); ! 122: } ! 123: scan() ! 124: { ! 125: extern errno; ! 126: ! 127: FD_ZERO(rdfd_set); ! 128: Loop: ! 129: FD_SET(0, rdfd_set); ! 130: FD_SET(rem, rdfd_set); ! 131: if(select(NSELFD, &rdfd_set, (fd_set *)0, 2000) == -1) ! 132: if(errno == EINTR) ! 133: goto Loop; ! 134: else ! 135: return -1; ! 136: if(FD_ISSET(0, rdfd_set)) ! 137: keyboard(); ! 138: if(FD_ISSET(rem, rdfd_set)) ! 139: remote(); ! 140: return 0; ! 141: } ! 142: ! 143: quit(s) ! 144: char *s; ! 145: { ! 146: printf("rogin: %s\n\r", s); ! 147: ioctl(0, TIOCSETP, &savloc); ! 148: ioctl(0, TIOCSLTC, &lsavechars); ! 149: signal(SIGINT, SIG_DFL); ! 150: ioctl(rem, TIOCFLUSH, 0); ! 151: savloc.sg_ispeed = savloc.sg_ospeed = 0; /* hangup */ ! 152: ioctl(rem, TIOCSETP, &savloc); ! 153: close(rem); ! 154: exit(strcmp(s, "eof")); ! 155: } ! 156: ! 157: /* ! 158: * Scan data from keyboard, looking for escape lines. ! 159: */ ! 160: keyboard() ! 161: { ! 162: register c; ! 163: register cc; ! 164: register char *bp; ! 165: register char *be, *obp; ! 166: char buf[1024]; ! 167: static char line[128]; ! 168: static char *linep = &line[0]; ! 169: static col = 0; ! 170: long time(); ! 171: ! 172: cc = read(0, buf, sizeof buf); ! 173: if(cc <0){ ! 174: if(errno == EINTR) ! 175: return; ! 176: } ! 177: if(cc <= 0) ! 178: quit("read error on file descriptor 0"); ! 179: be = buf+cc; ! 180: bp = obp = buf; ! 181: while(bp < be) { ! 182: c = *bp++; ! 183: if (col==0 && c=='~') { ! 184: *linep++ = c; ! 185: col = 1; ! 186: locvec.sg_flags |= savloc.sg_flags&(CRMOD|ECHO); ! 187: ioctl(0, TIOCSETP, &locvec); ! 188: write(1, linep-1, 1); ! 189: continue; ! 190: } ! 191: col++; ! 192: if (c=='\r') ! 193: c = '\n'; ! 194: if (linep>line) { ! 195: *linep++ = c; ! 196: if (c==savloc.sg_kill) ! 197: write(1, "\n", 1); ! 198: if (c==savloc.sg_erase) ! 199: linep -= 2; ! 200: if (c==savloc.sg_kill || linep<=line) { ! 201: linep = line; ! 202: locvec.sg_flags &= ~(CRMOD|ECHO); ! 203: ioctl(0, TIOCSETP, &locvec); ! 204: col = 0; ! 205: obp = bp; ! 206: } ! 207: } ! 208: if (c=='\n') { ! 209: col = 0; ! 210: if (linep > line) { ! 211: *linep = '\0'; ! 212: if (escape(line+1)) ! 213: write(rem, line+1, linep-line-1); ! 214: obp = bp; ! 215: linep = line; ! 216: locvec.sg_flags &= ~(CRMOD|ECHO); ! 217: ioctl(0, TIOCSETP, &locvec); ! 218: } ! 219: } ! 220: } ! 221: if (bp>obp && linep==line) ! 222: if(write(rem, obp, bp-obp) <= 0) ! 223: quit("Eof"); ! 224: } ! 225: ! 226: /* ! 227: * Send data from remote machine to standard output (trivial) ! 228: */ ! 229: remote(){ ! 230: char buf[1024]; ! 231: register n; ! 232: ! 233: n = read(rem, buf, sizeof buf); ! 234: if(n < 0 && errno == EINTR) ! 235: return; ! 236: if(n <= 0) ! 237: quit("Eof"); ! 238: write(1, buf, n); ! 239: } ! 240: ! 241: escape(line) ! 242: register char *line; ! 243: { ! 244: ! 245: switch(*line++) { ! 246: case '!': ! 247: cunix(line); ! 248: return(0); ! 249: ! 250: case '.': ! 251: case CEOT: ! 252: quit("eof"); ! 253: ! 254: case 'b': ! 255: ioctl(rem, TIOCSBRK, 0); ! 256: return(0); ! 257: default: ! 258: return(1); ! 259: } ! 260: } ! 261: ! 262: cunix(prog) ! 263: char *prog; ! 264: { ! 265: register int upid; ! 266: int retcode; ! 267: ! 268: if ((upid = fork()) == 0) { ! 269: signal(SIGINT, savint); ! 270: signal(SIGQUIT, savquit); ! 271: ioctl(0, TIOCSETN, &savloc); ! 272: ioctl(0, TIOCSLTC, &lsavechars); ! 273: if (*prog == '\n') ! 274: execl("/bin/sh", "sh", "-i", 0); ! 275: else ! 276: execl("/bin/sh","sh","-c",prog,0); ! 277: exit(0100); ! 278: } ! 279: if (upid < 0) { ! 280: printf("can't fork\n"); ! 281: } else { ! 282: while((wait(&retcode) !=upid)) ! 283: ; ! 284: } ! 285: signal(SIGINT, intcatch); ! 286: signal(SIGQUIT, quitcatch); ! 287: ioctl(0, TIOCSETN, &locvec); ! 288: ioctl(0, TIOCSLTC, &nlchars); ! 289: printf("!!\n"); ! 290: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.