1*31455Sminshall #include <sys/wait.h> 2*31455Sminshall 3*31455Sminshall #include <stdio.h> 4*31455Sminshall 5*31455Sminshall #include "../general/general.h" 6*31455Sminshall #include "../api/api.h" 7*31455Sminshall 8*31455Sminshall #include "../general/globals.h" 9*31455Sminshall 10*31455Sminshall 11*31455Sminshall static int shell_pid = 0; 12*31455Sminshall 13*31455Sminshall static int 14*31455Sminshall child_died() 15*31455Sminshall { 16*31455Sminshall union wait *status; 17*31455Sminshall 18*31455Sminshall while ((pid = wait3(status, WNOHANG, 0)) > 0) { 19*31455Sminshall if (pid == shell_pid) { 20*31455Sminshall shell_active = 0; 21*31455Sminshall } 22*31455Sminshall } 23*31455Sminshall signal(SIGCHLD, child_died); 24*31455Sminshall } 25*31455Sminshall 26*31455Sminshall /* 27*31455Sminshall * shell_continue() actually runs the command, and looks for API 28*31455Sminshall * requests coming back in. 29*31455Sminshall * 30*31455Sminshall * We are called from the main loop in telnet.c. 31*31455Sminshall */ 32*31455Sminshall 33*31455Sminshall int 34*31455Sminshall shell_continue() 35*31455Sminshall { 36*31455Sminshall return shell_active; 37*31455Sminshall } 38*31455Sminshall 39*31455Sminshall 40*31455Sminshall /* 41*31455Sminshall * Called from telnet.c to fork a lower command.com. We 42*31455Sminshall * use the spint... routines so that we can pick up 43*31455Sminshall * interrupts generated by application programs. 44*31455Sminshall */ 45*31455Sminshall 46*31455Sminshall 47*31455Sminshall int 48*31455Sminshall shell(argc,argv) 49*31455Sminshall int argc; 50*31455Sminshall char *argv[]; 51*31455Sminshall { 52*31455Sminshall if ((shell_pid = fork()) { 53*31455Sminshall shell_active = 1; /* We are running down below */ 54*31455Sminshall child_killed(); /* Start up signal handler */ 55*31455Sminshall } else { /* New process */ 56*31455Sminshall register int i; 57*31455Sminshall 58*31455Sminshall for (i = 3; i < 30; i++) { 59*31455Sminshall (void) close(i); 60*31455Sminshall } 61*31455Sminshall if (argc == 1) { /* Just get a shell */ 62*31455Sminshall char *cmdname; 63*31455Sminshall 64*31455Sminshall cmdname = getenv("SHELL"); 65*31455Sminshall execlp(cmdname, cmdname, 0); 66*31455Sminshall perror("Exec'ing new shell...\n"); 67*31455Sminshall exit(1); 68*31455Sminshall } else { 69*31455Sminshall execvp(argv[1], &argv[1]); 70*31455Sminshall perror("Exec'ing command.\n"); 71*31455Sminshall exit(1); 72*31455Sminshall } 73*31455Sminshall /*NOTREACHED*/ 74*31455Sminshall } 75*31455Sminshall return 1; /* Go back to main loop */ 76*31455Sminshall } 77