|
|
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.