/* * Escape to local shell */ void shell(void) { int shpid, status; char *cp; printf("[sh]\r\n"); signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); unraw(); if ((shpid = fork())) { while (shpid != wait(&status)); raw(); printf("\r\n!\r\n"); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); return; } else { signal(SIGQUIT, SIG_DFL); signal(SIGINT, SIG_DFL); if ((cp = rindex(value(SHELL), '/')) == NULL) cp = value(SHELL); else cp++; shell_uid(); execl(value(SHELL), cp, NULL); printf("\r\ncan't execl!\r\n"); exit(1); } }
static void execute(char *s) { register char *cp; if ((cp = rindex(value(SHELL), '/')) == NULL) cp = value(SHELL); else cp++; shell_uid(); execl(value(SHELL), cp, "-c", s, NULL); }
static void execute(char *s) { char *cp; if ((cp = strrchr(value(SHELL), '/')) == NULL) cp = value(SHELL); else cp++; shell_uid(); execl(value(SHELL), cp, "-c", s, (char *)NULL); }
char * expand(char *name) { static char xname[BUFSIZ]; char cmdbuf[BUFSIZ]; register int pid, l; register char *cp, *Shell; int s, pivec[2] /*, (*sigint)()*/; if (!anyof(name, "~{[*?$`'\"\\")) return(name); /* sigint = signal(SIGINT, SIG_IGN); */ if (pipe(pivec) < 0) { warn("pipe"); /* signal(SIGINT, sigint) */ return(name); } snprintf(cmdbuf, sizeof(cmdbuf), "echo %s", name); if ((pid = vfork()) == 0) { Shell = value(SHELL); if (Shell == NULL) Shell = _PATH_BSHELL; close(pivec[0]); close(1); dup(pivec[1]); close(pivec[1]); close(2); shell_uid(); execl(Shell, Shell, "-c", cmdbuf, NULL); _exit(1); } if (pid == -1) { warn("fork"); close(pivec[0]); close(pivec[1]); return(NULL); } close(pivec[1]); l = read(pivec[0], xname, BUFSIZ); close(pivec[0]); while (wait(&s) != pid); ; s &= 0377; if (s != 0 && s != SIGPIPE) { fprintf(stderr, "\"Echo\" failed\n"); return(NULL); } if (l < 0) { warn("read"); return(NULL); } if (l == 0) { fprintf(stderr, "\"%s\": No match\n", name); return(NULL); } if (l == BUFSIZ) { fprintf(stderr, "Buffer overflow expanding \"%s\"\n", name); return(NULL); } xname[l] = 0; for (cp = &xname[l-1]; *cp == '\n' && cp > xname; cp--) ; *++cp = '\0'; return(xname); }