|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)mysys.c 4.3 (Berkeley) 5/16/83";
3: #endif not lint
4:
5: #include "stdio.h"
6: #include "signal.h"
7:
8: #define EASY 1
9: #define MEDIUM 2
10: #define HARD 3
11: #define EMAX 256
12:
13: char *envp[EMAX+1];
14:
15: /*
16: * This routine edits the PATH environment variable so that
17: * special commands that learners may need will be found.
18: * EXINIT is modified so that the editor will always prompt,
19: * will not print \r's, and will be usable with open mode.
20: */
21:
22: chgenv()
23: {
24: register char **p;
25: register int i;
26: extern char **environ;
27: extern char *direct;
28: char path[BUFSIZ], exinit[BUFSIZ];
29: char *malloc();
30:
31: sprintf(path, "PATH=%s/bin:/usr/cc/bin:/usr/ucb/bin:", direct);
32: sprintf(exinit, "EXINIT=set prompt noopt open window=23");
33: #if vax
34: system("stty old");
35: for (p=environ,i=3; *p != 0 && i < EMAX; p++,i++) {
36: #else
37: for (p=environ,i=2; *p != 0 && i < EMAX; p++,i++) {
38: #endif
39: envp[i] = *p;
40: if (**p != 'P' && **p != 'E')
41: continue;
42: if (strncmp(*p, "PATH=", 5) == 0)
43: sprintf(path, "PATH=%s/bin:%s", direct, &envp[i--][5]);
44: else if (strncmp(*p, "EXINIT=", 7) == 0)
45: sprintf(exinit, "%s|set prompt noopt open window=23", envp[i--]);
46: #if vax
47: else if (strncmp(*p, "PS1=", 4) == 0);
48: i--;
49: }
50: envp[2] = malloc(7);
51: strcpy(envp[2], "PS1=% ");
52: #else
53: }
54: #endif
55: envp[0] = malloc(strlen(path) + 1);
56: strcpy(envp[0], path);
57: envp[1] = malloc(strlen(exinit) + 1);
58: strcpy(envp[1], exinit);
59: envp[i] = 0;
60: environ = envp;
61: }
62:
63: mysys(s)
64: char *s;
65: {
66: /* like "system" but rips off "mv", etc.*/
67: /* also tries to guess if can get away with exec cmd */
68: /* instead of sh cmd */
69: char p[300];
70: char *np[40];
71: register char *t;
72: int nv, type, stat;
73:
74: type = EASY; /* we hope */
75: for (t = s; *t && type != HARD; t++) {
76: switch (*t) {
77: case '*':
78: case '[':
79: case '?':
80: case '>':
81: case '<':
82: case '$':
83: case '\'':
84: case '"':
85: case '`':
86: case '{':
87: case '~':
88: type = MEDIUM;
89: break;
90: case '|':
91: case ';':
92: case '&':
93: type = HARD;
94: break;
95: }
96: }
97: switch (type) {
98: case HARD:
99: return(system(s));
100: case MEDIUM:
101: strcpy(p, "exec ");
102: strcat(p, s);
103: return(system(p));
104: case EASY:
105: strcpy(p,s);
106: nv = getargs(p, np);
107: t=np[0];
108: if ((strcmp(t, "mv") == 0)||
109: (strcmp(t, "cp") == 0)||
110: (strcmp(t, "rm") == 0)||
111: (strcmp(t, "ls") == 0) ) {
112: if (fork() == 0) {
113: char b[100];
114: signal(SIGINT, SIG_DFL);
115: np[nv] = 0;
116: execvp(t, np);
117: perror(t);
118: /* sprintf(b, "/usr/ucb/bin/%s", t);
119: execv(b, np);
120: sprintf(b, "/usr/ucb/%s", t);
121: execv(b, np);
122: sprintf(b, "/bin/%s", t);
123: execv(b, np);
124: sprintf(b, "/usr/bin/%s", t);
125: execv(b, np);
126: perror(b); */
127: fprintf(stderr, "Mysys: execv failed on %s\n", np);
128: exit(1);
129: }
130: wait(&stat);
131: return(stat);
132: }
133: return(system(s));
134: }
135: }
136:
137: /*
138: * system():
139: * same as library version, except that resets
140: * default handling of signals in child, so that
141: * user gets the behavior he expects.
142: */
143:
144: system(s)
145: char *s;
146: {
147: int status, pid, w;
148: register int (*istat)(), (*qstat)();
149:
150: istat = signal(SIGINT, SIG_IGN);
151: qstat = signal(SIGQUIT, SIG_IGN);
152: if ((pid = fork()) == 0) {
153: signal(SIGINT, SIG_DFL);
154: signal(SIGQUIT, SIG_DFL);
155: execl("/bin/csh", "csh", "-cf", s, 0);
156: _exit(127);
157: }
158: while ((w = wait(&status)) != pid && w != -1)
159: ;
160: if (w == -1)
161: status = -1;
162: signal(SIGINT, istat);
163: signal(SIGQUIT, qstat);
164: return(status);
165: }
166:
167: getargs(s, v)
168: char *s, **v;
169: {
170: int i;
171:
172: i = 0;
173: for (;;) {
174: v[i++]=s;
175: while (*s != 0 && *s!=' '&& *s != '\t')
176: s++;
177: if (*s == 0)
178: break;
179: *s++ =0;
180: while (*s == ' ' || *s == '\t')
181: s++;
182: if (*s == 0)
183: break;
184: }
185: return(i);
186: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.