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