BSD 3 development
[unix-history] / usr / src / cmd / learn / mysys.c
CommitLineData
42d6e430
BJ
1#include "stdio.h"
2#include "signal.h"
3
4#define EASY 1
5#define MEDIUM 2
6#define HARD 3
7
8mysys(s)
9char *s;
10{
11 /* like "system" but rips off "mv", etc.*/
12 /* also tries to guess if can get away with exec cmd */
13 /* instead of sh cmd */
14 char p[300];
15 char *np[40];
16 register char *t;
17 int nv, type, stat;
18
19 type = EASY; /* we hope */
20 for (t = s; *t && type != HARD; t++) {
21 switch (*t) {
22 case '*':
23 case '[':
24 case '?':
25 case '>':
26 case '<':
27 case '$':
28 case '\'':
29 case '"':
30 type = MEDIUM;
31 break;
32 case '|':
33 case ';':
34 case '&':
35 type = HARD;
36 break;
37 }
38 }
39 switch (type) {
40 case HARD:
41 return(system(s));
42 case MEDIUM:
43 strcpy(p, "exec ");
44 strcat(p, s);
45 return(system(p));
46 case EASY:
47 strcpy(p,s);
48 nv = getargs(p, np);
49 t=np[0];
50 if ((strcmp(t, "mv") == 0)||
51 (strcmp(t, "cp") == 0)||
52 (strcmp(t, "rm") == 0)||
53 (strcmp(t, "ls") == 0) ) {
54 if (fork() == 0) {
55 char b[100];
56 signal(SIGINT, SIG_DFL);
57 strcpy(b, "/bin/");
58 strcat(b, t);
59 np[nv] = 0;
60 execv(b, np);
61 fprintf(stderr, "Execv failed\n");
62 exit(1);
63 }
64 wait(&stat);
65 return(stat);
66 }
67 return(system(s));
68 }
69}
70
71/*
72 * system():
73 * same as library version, except that resets
74 * default handling of signals in child, so that
75 * user gets the behavior he expects.
76 */
77
78system(s)
79char *s;
80{
81 int status, pid, w;
82 register int (*istat)(), (*qstat)();
83
84 istat = signal(SIGINT, SIG_IGN);
85 qstat = signal(SIGQUIT, SIG_IGN);
86 if ((pid = fork()) == 0) {
87 signal(SIGINT, SIG_DFL);
88 signal(SIGQUIT, SIG_DFL);
89 execl("/bin/sh", "sh", "-c", s, 0);
90 _exit(127);
91 }
92 while ((w = wait(&status)) != pid && w != -1)
93 ;
94 if (w == -1)
95 status = -1;
96 signal(SIGINT, istat);
97 signal(SIGQUIT, qstat);
98 return(status);
99}
100
101getargs(s, v)
102char *s, **v;
103{
104 int i;
105
106 i = 0;
107 for (;;) {
108 v[i++]=s;
109 while (*s != 0 && *s!=' '&& *s != '\t')
110 s++;
111 if (*s == 0)
112 break;
113 *s++ =0;
114 while (*s == ' ' || *s == '\t')
115 s++;
116 if (*s == 0)
117 break;
118 }
119 return(i);
120}