Annotation of researchv10no/cmd/server/server.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.