|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)rsh.c 4.8 83/06/10"; ! 3: #endif ! 4: ! 5: #include <sys/param.h> ! 6: #include <sys/types.h> ! 7: #include <sys/ioctl.h> ! 8: #include <sys/file.h> ! 9: ! 10: #include <stdio.h> ! 11: #include <errno.h> ! 12: #include <signal.h> ! 13: #include <pwd.h> ! 14: #include "config.h" ! 15: ! 16: /* ! 17: * rsh - remote shell ! 18: */ ! 19: /* VARARGS */ ! 20: int error(); ! 21: char *index(), *rindex(), *malloc(), *getpass(), *sprintf(), *strcpy(); ! 22: ! 23: struct passwd *getpwuid(); ! 24: ! 25: int errno; ! 26: int sendsig(); ! 27: ! 28: #define mask(s) (1 << ((s) - 1)) ! 29: ! 30: main(argc, argv0) ! 31: int argc; ! 32: char **argv0; ! 33: { ! 34: fd_set rdfds, fds; ! 35: int rem; ! 36: char *host, *cp, **ap, buf[BUFSIZ], *args, **argv = argv0, *user = 0; ! 37: register int n, wn; ! 38: register int cc; ! 39: int asrsh = 0; ! 40: struct passwd *pwd; ! 41: ! 42: host = rindex(argv[0], '/'); ! 43: if (host) ! 44: host++; ! 45: else ! 46: host = argv[0]; ! 47: argv++, --argc; ! 48: if (!strcmp(host, "rsh")) { ! 49: host = *argv++, --argc; ! 50: asrsh = 1; ! 51: } ! 52: another: ! 53: if (argc > 0 && !strcmp(*argv, "-l")) { ! 54: argv++, argc--; ! 55: if (argc > 0) ! 56: user = *argv++, argc--; ! 57: goto another; ! 58: } ! 59: if (argc > 0 && !strcmp(*argv, "-n")) { ! 60: argv++, argc--; ! 61: (void) close(0); ! 62: (void) open("/dev/null", 0); ! 63: goto another; ! 64: } ! 65: /* ! 66: * Ignore the -e flag to allow aliases with rogin ! 67: * to work ! 68: */ ! 69: if (argc > 0 && !strncmp(*argv, "-e", 2)) { ! 70: argv++, argc--; ! 71: goto another; ! 72: } ! 73: if (host == 0) ! 74: goto usage; ! 75: if (argv[0] == 0) { ! 76: if (asrsh) ! 77: *argv0 = "rogin"; ! 78: execv(RLOGIN, argv0); ! 79: perror(RLOGIN); ! 80: exit(1); ! 81: } ! 82: pwd = getpwuid(getuid()); ! 83: if (pwd == 0) { ! 84: fprintf(stderr, "who are you?\n"); ! 85: exit(1); ! 86: } ! 87: cc = 0; ! 88: for (ap = argv; *ap; ap++) ! 89: cc += strlen(*ap) + 1; ! 90: cp = args = malloc(cc); ! 91: for (ap = argv; *ap; ap++) { ! 92: (void) strcpy(cp, *ap); ! 93: while (*cp) ! 94: cp++; ! 95: if (ap[1]) ! 96: *cp++ = ' '; ! 97: } ! 98: rem = tcp_rcmd(host, "shell", pwd->pw_name, ! 99: user ? user : pwd->pw_name, args, 0); ! 100: if (rem < 0) ! 101: exit(1); ! 102: setuid(getuid()); ! 103: FD_ZERO(fds); ! 104: FD_SET(0, fds); ! 105: FD_SET(rem, fds); ! 106: while(1){ ! 107: rdfds = fds; ! 108: if(select(NOFILE, &rdfds, 0, 20000) < 0){ ! 109: if(errno == EINTR) ! 110: continue; ! 111: else { ! 112: perror("select"); ! 113: exit(1); ! 114: } ! 115: } ! 116: if(FD_ISSET(0, rdfds)){ ! 117: n = read(0, buf, sizeof(buf)); ! 118: if(n < 0) ! 119: break; ! 120: if(n == 0){ ! 121: FD_CLR(0, fds); ! 122: write(rem, "", 0); ! 123: } else { ! 124: if(write(rem, buf, n) != n) ! 125: break; ! 126: } ! 127: } ! 128: if(FD_ISSET(rem, rdfds)){ ! 129: n = read(rem, buf, sizeof(buf)); ! 130: if(n <= 0) { ! 131: break; ! 132: } ! 133: wn = write(1, buf, n); ! 134: if (wn != n) { ! 135: break; ! 136: } ! 137: } ! 138: } ! 139: exit(0); ! 140: usage: ! 141: fprintf(stderr, ! 142: "usage: rsh host [ -l login ] [ -p passwd ] command\n"); ! 143: exit(1); ! 144: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.