|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <dk.h> ! 3: #include <string.h> ! 4: #include <sys/types.h> ! 5: #include <libc.h> ! 6: #include <ipc.h> ! 7: ! 8: /* ! 9: * program to run a command ! 10: * on another cpu on Datakit ! 11: */ ! 12: ! 13: #define MAXCHARS 8192 ! 14: char args[MAXCHARS]; ! 15: char buf[4096]; ! 16: char *bldargs(), *malloc(); ! 17: extern errno; ! 18: fd_set rbits, bits; ! 19: ! 20: #define MAXEOF 10 ! 21: ! 22: main(argc, argv) ! 23: char **argv; ! 24: { ! 25: char *host, *av0; ! 26: register int rem, n; ! 27: register int neof; ! 28: ! 29: rem = -1; ! 30: av0 = host = argv[0]; ! 31: if (strrchr(av0, '/')) ! 32: av0 = host = strrchr(av0, '/')+1; ! 33: if(strcmp(host, "rx")==0 || strcmp(host, "rsh")==0){ ! 34: host = argv[1]; ! 35: argv++; ! 36: argc--; ! 37: } ! 38: else if(argc<=1){ ! 39: execl("/usr/ipc/bin/con", "con", host, 0); ! 40: execl("/bin/dcon", "dcon", host, 0); ! 41: fprintf(stderr, "rx: cannot exec dcon\n"); ! 42: exit(1); ! 43: } ! 44: if (strcmp(av0, "rsh")!=0) ! 45: rem = ipcexec(host, "heavy", bldargs(argc-1, &argv[1])); ! 46: if (rem<0) ! 47: rem = ipcrexec(host, "heavy", bldargs(argc-1, &argv[1])); ! 48: if (rem<0) { ! 49: fprintf(stderr, "%s: call to %s failed: %s\n", av0, host, errstr); ! 50: exit(1); ! 51: } ! 52: FD_SET(0, bits); ! 53: FD_SET(rem, bits); ! 54: neof = 0; ! 55: for (;;) { ! 56: rbits = bits; ! 57: if (select(rem+1, &rbits, (fd_set *)NULL, 20000) < 0) ! 58: exit(1); ! 59: if (FD_ISSET(0, rbits)) { ! 60: n = read(0, buf, sizeof(buf)); ! 61: if (n > 0) { ! 62: if (write(rem, buf, n) != n) ! 63: exit(1); ! 64: neof = 0; ! 65: } ! 66: else { ! 67: if (++neof >= MAXEOF) ! 68: FD_CLR(0, bits); ! 69: write(rem, buf, 0); ! 70: } ! 71: } ! 72: if (FD_ISSET(rem, rbits)) { ! 73: n = read(rem, buf, sizeof(buf)); ! 74: if (n <= 0) ! 75: exit(0); ! 76: if (write(1, buf, n) != n) ! 77: exit(1); ! 78: } ! 79: } ! 80: } ! 81: ! 82: char * ! 83: bldargs(argc, argv) ! 84: register char **argv; ! 85: { ! 86: register char *s = args, *t; ! 87: ! 88: while(argc--) { ! 89: *s++ = ' '; ! 90: t = *argv++; ! 91: while(*s = *t++) { ! 92: if(s++ >= &args[MAXCHARS-2]){ ! 93: fprintf(stderr, "rx: arg list too long\n"); ! 94: exit(1); ! 95: } ! 96: } ! 97: } ! 98: *s = '\0'; ! 99: return(args+1); ! 100: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.