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