|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <dk.h> ! 3: ! 4: /* ! 5: * program to run a command ! 6: * on another cpu on Datakit. ! 7: * Suitable for setuid to daemon, and checks for argument frogs ! 8: * and a restricted list of commands ! 9: */ ! 10: ! 11: int rem; /* remote file descriptor */ ! 12: int t; ! 13: char *bldargs(), *getenv(); ! 14: char buf[BUFSIZ]; ! 15: char *cmdfile = "/etc/server"; /* legal commands here */ ! 16: ! 17: char frogs[] = "\n&;^|`<>()"; ! 18: ! 19: #define MAXCHARS 8192 ! 20: char args[MAXCHARS]; ! 21: ! 22: main(argc, argv) ! 23: char **argv; ! 24: { ! 25: char *machine; ! 26: if (getenv("REXEC")) { ! 27: checkcmd(argv[1]); ! 28: execvp(argv[1], &argv[1]); ! 29: fprintf(stderr, "%s: command not found\n", argv[1]); ! 30: exit(1); ! 31: } ! 32: if (argc < 3) { ! 33: fprintf(stderr, "usage: server <machine> <command>\n"); ! 34: exit(1); ! 35: } ! 36: setuid(geteuid()); ! 37: machine = argv[1]; ! 38: argv[1] = "/usr/bin/server"; ! 39: rem = tdkexec(machine, bldargs(argc-1, &argv[1])); ! 40: if (rem<0) { ! 41: extern char *dkerror; ! 42: fprintf(stderr, "server: %s: %s\n", machine, dkerror); ! 43: exit(1); ! 44: } ! 45: t = fork(); ! 46: if (t < 0) { ! 47: fprintf(stderr,"server: can't fork\n"); ! 48: exit(1); ! 49: } ! 50: if (t == 0) ! 51: to_proc(); ! 52: else ! 53: from_proc(); ! 54: exit(0); ! 55: } ! 56: ! 57: to_proc() ! 58: { ! 59: register cc; ! 60: ! 61: while ((cc = read(0, buf, sizeof buf)) > 0) ! 62: write(rem, buf, cc); ! 63: /* ! 64: * send some EOFs to ! 65: * make it go away. ! 66: */ ! 67: write(rem, 0, 0); ! 68: write(rem, 0, 0); ! 69: write(rem, 0, 0); ! 70: } ! 71: ! 72: from_proc() ! 73: { ! 74: register cc; ! 75: ! 76: while ((cc = read(rem, buf, sizeof buf)) > 0) ! 77: write(1, buf, cc); ! 78: kill(t, 9); ! 79: } ! 80: ! 81: checkcmd(arg) ! 82: register char *arg; ! 83: { ! 84: register FILE *f; ! 85: char cmd[100]; ! 86: ! 87: if ((f = fopen(cmdfile, "r")) == NULL) { ! 88: fprintf(stderr, "server can't open %s\n", cmdfile); ! 89: exit(1); ! 90: } ! 91: while (fscanf(f, "%s", cmd) != EOF) ! 92: if (strcmp(cmd, arg) == 0) ! 93: return fclose(f); ! 94: fprintf(stderr, "server: disallowed command %s\n", arg); ! 95: exit(1); ! 96: } ! 97: ! 98: char * ! 99: bldargs(argc, argv) ! 100: register char *argv[]; ! 101: { ! 102: register char *s; ! 103: ! 104: while (argc) { ! 105: if (strlen(args)+strlen(*argv)+3 >= MAXCHARS) { ! 106: fprintf(stderr, "server: arg list too long\n"); ! 107: exit(1); ! 108: } ! 109: for (s = frogs; *s; s++) { ! 110: if (index(*argv, *s)) { ! 111: fprintf(stderr, "server: disallowed char %c\n", ! 112: *s); ! 113: exit(1); ! 114: } ! 115: } ! 116: strcat(args, *argv); ! 117: strcat(args, " "); ! 118: argc--; ! 119: argv++; ! 120: } ! 121: return(args); ! 122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.