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