#ifndef lint static char sccsid[] = "@(#)rsh.c 4.1 82/04/02"; #endif #include #include #include #include #include #include #include #include #include /* * rsh - remote shell */ /* VARARGS */ int error(); char *index(), *rindex(), *malloc(), *getpass(), *sprintf(), *strcpy(); struct passwd *getpwuid(); int errno; int options; int rfd2; int sendsig(); main(argc, argv0) int argc; char **argv0; { int rem, pid; char *host, *cp, **ap, buf[BUFSIZ], *args, **argv = argv0, *user = 0; register int cc; int asrsh = 0; struct passwd *pwd; long readfrom; long ready; int one = 1; host = rindex(argv[0], '/'); if (host) host++; else host = argv[0]; argv++, --argc; if (!strcmp(host, "rsh")) { host = *argv++, --argc; asrsh = 1; } another: if (!strcmp(*argv, "-l")) { argv++, argc--; if (argc > 0) user = *argv++, argc--; goto another; } if (!strcmp(*argv, "-n")) { argv++, argc--; (void) close(0); (void) open("/dev/null", 0); goto another; } if (!strcmp(*argv, "-d")) { argv++, argc--; options |= SO_DEBUG; goto another; } if (host == 0) goto usage; if (argv[0] == 0) { if (asrsh) *argv0 = "rlogin"; execv("/usr/ucb/rlogin", argv0); perror("/usr/ucb/rlogin"); exit(1); } pwd = getpwuid(getuid()); if (pwd == 0) { fprintf(stderr, "who are you?\n"); exit(1); } cc = 0; for (ap = argv; *ap; ap++) cc += strlen(*ap) + 1; cp = args = malloc(cc); for (ap = argv; *ap; ap++) { (void) strcpy(cp, *ap); while (*cp) cp++; if (ap[1]) *cp++ = ' '; } rem = rcmd(&host, IPPORT_CMDSERVER, pwd->pw_name, user ? user : pwd->pw_name, args, &rfd2); if (rem < 0) exit(1); (void) setuid(getuid()); sigacts(SIG_HOLD); pid = fork(); if (pid < 0) { perror("fork"); exit(1); } ioctl(rfd2, FIONBIO, &one); ioctl(rem, FIONBIO, &one); if (pid == 0) { char *bp; long rembits; int wc; (void) close(rfd2); reread: cc = read(0, buf, sizeof buf); if (cc <= 0) goto done; bp = buf; rewrite: rembits = 1<