|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <dk.h> ! 3: #include <string.h> ! 4: #include <sys/types.h> ! 5: #include <signal.h> ! 6: #include <libc.h> ! 7: #include <ipc.h> ! 8: ! 9: /* ! 10: * program to run a command ! 11: * on another cpu on Datakit ! 12: */ ! 13: ! 14: #define MAXCHARS 8192 ! 15: char args[MAXCHARS]; ! 16: char buf[4096]; ! 17: char *bldargs(), *malloc(); ! 18: extern errno; ! 19: ! 20: #define MAXEOF 10 ! 21: ! 22: main(argc, argv) ! 23: char **argv; ! 24: { ! 25: char *host, *av0; ! 26: int ignore0=0; ! 27: int pid, rv; ! 28: register int rem; ! 29: ! 30: rem = -1; ! 31: av0 = host = argv[0]; ! 32: if (strrchr(av0, '/')) ! 33: av0 = host = strrchr(av0, '/')+1; ! 34: if(strcmp(host, "rx")==0 || strcmp(host, "rsh")==0){ ! 35: if(argc<2){ ! 36: fprintf(stderr, "usage: %s [-n] host cmd\n", av0); ! 37: exit(1); ! 38: } ! 39: if(strcmp(argv[1], "-n")==0){ ! 40: ignore0 = 1; ! 41: argv++, argc--; ! 42: } ! 43: if(argc<2){ ! 44: fprintf(stderr, "usage: %s [-n] host cmd\n", av0); ! 45: exit(1); ! 46: } ! 47: host = argv[1]; ! 48: argv++, argc--; ! 49: } else if(argc<=1){ ! 50: execl("/usr/bin/con", "con", host, 0); ! 51: fprintf(stderr, "rx: cannot exec con\n"); ! 52: exit(1); ! 53: } ! 54: if (strcmp(av0, "rsh")!=0) ! 55: rem = ipcexec(host, "heavy", bldargs(argc-1, &argv[1])); ! 56: if (rem<0) ! 57: rem = ipcrexec(host, "heavy", bldargs(argc-1, &argv[1])); ! 58: if (rem<0) { ! 59: fprintf(stderr, "%s: call to %s failed: %s\n", av0, host, errstr); ! 60: exit(1); ! 61: } ! 62: signal(SIGPIPE, SIG_IGN); /* sometimes happens unreasonably in EOF handling */ ! 63: ! 64: if(!ignore0){ ! 65: pid = getpid(); ! 66: switch(fork()){ ! 67: case -1: ! 68: perror("can't fork\n"); ! 69: exit(1); ! 70: case 0: ! 71: rv = fromnet(rem); ! 72: kill(pid, 9); ! 73: return rv; ! 74: default: ! 75: return fromstdin(rem); ! 76: } ! 77: } else ! 78: return fromnet(rem); ! 79: } ! 80: ! 81: fromstdin(rem) ! 82: { ! 83: register int neof, n; ! 84: ! 85: close(1); ! 86: close(2); ! 87: close(3); ! 88: neof = 0; ! 89: for (;;) { ! 90: n = read(0, buf, sizeof(buf)); ! 91: if (n > 0) { ! 92: if (write(rem, buf, n) != n) ! 93: return(1); ! 94: neof = 0; ! 95: } else { ! 96: if (++neof >= MAXEOF) ! 97: write(rem, buf, 0); ! 98: } ! 99: } ! 100: /* not reached */ ! 101: } ! 102: ! 103: fromnet(rem) ! 104: { ! 105: register int n; ! 106: ! 107: close(0); ! 108: close(2); ! 109: close(3); ! 110: for (;;) { ! 111: n = read(rem, buf, sizeof(buf)); ! 112: if (n <= 0) ! 113: return(0); ! 114: if (write(1, buf, n) != n) ! 115: return(1); ! 116: } ! 117: } ! 118: ! 119: char * ! 120: bldargs(argc, argv) ! 121: register char **argv; ! 122: { ! 123: register char *s = args, *t; ! 124: ! 125: while(argc--) { ! 126: *s++ = ' '; ! 127: t = *argv++; ! 128: while(*s = *t++) { ! 129: if(s++ >= &args[MAXCHARS-2]){ ! 130: fprintf(stderr, "rx: arg list too long\n"); ! 131: exit(1); ! 132: } ! 133: } ! 134: } ! 135: *s = '\0'; ! 136: return(args+1); ! 137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.