|
|
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();
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:
26: if (argc < 3) {
27: fprintf(stderr, "usage: server <machine> <command>\n");
28: exit(1);
29: }
30: setuid(geteuid());
31: rem = tdkexec(argv[1], bldargs(argc-2, &argv[2]));
32: if (rem<0) {
33: extern char *dkerror;
34: fprintf(stderr, "server: %s: %s\n", argv[1], dkerror);
35: exit(1);
36: }
37: t = fork();
38: if (t < 0) {
39: fprintf(stderr,"server: can't fork\n");
40: exit(1);
41: }
42: if (t == 0)
43: to_proc();
44: else
45: from_proc();
46: exit(0);
47: }
48:
49: to_proc()
50: {
51: register cc;
52:
53: while ((cc = read(0, buf, sizeof buf)) > 0)
54: write(rem, buf, cc);
55: /*
56: * send some EOFs to
57: * make it go away.
58: */
59: write(rem, 0, 0);
60: write(rem, 0, 0);
61: write(rem, 0, 0);
62: }
63:
64: from_proc()
65: {
66: register cc;
67:
68: while ((cc = read(rem, buf, sizeof buf)) > 0)
69: write(1, buf, cc);
70: kill(t, 9);
71: }
72:
73: char *
74: bldargs(argc, argv)
75: register char *argv[];
76: {
77: register char *s, **t;
78: FILE *f;
79: char cmd[100];
80: int ok = 0;
81:
82: if ((f = fopen(cmdfile, "r")) == NULL) {
83: fprintf(stderr, "server can't open %s\n", cmdfile);
84: exit(1);
85: }
86: while (fscanf(f, "%s", cmd) != EOF)
87: if (strcmp(cmd, argv[0]) == 0) {
88: ok = 1;
89: break;
90: }
91: if (!ok) {
92: fprintf(stderr, "server: disallowed command %s\n", argv[0]);
93: exit(1);
94: }
95: while (argc) {
96: if (strlen(args)+strlen(*argv)+3 >= MAXCHARS) {
97: fprintf(stderr, "server: arg list too long\n");
98: exit(1);
99: }
100: for (s = frogs; *s; s++) {
101: if (index(*argv, *s)) {
102: fprintf(stderr, "server: disallowed char %c\n",
103: *s);
104: exit(1);
105: }
106: }
107: strcat(args, *argv);
108: strcat(args, " ");
109: argc--;
110: argv++;
111: }
112: return(args);
113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.