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