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