131184Sminshall #include <stdio.h>
231184Sminshall 
331185Sminshall #include "../general/general.h"
431184Sminshall #include "../api/api.h"
531184Sminshall #include "spint.h"
631184Sminshall 
7*31212Sminshall #include "../general/globals.h"
831184Sminshall 
931184Sminshall 
10*31212Sminshall static Spint spinted;
11*31212Sminshall static char command[256];
12*31212Sminshall static int need_to_start = 0;
13*31212Sminshall 
1431184Sminshall /*
15*31212Sminshall  * shell_continue() actually runs the command, and looks for API
16*31212Sminshall  * requests coming back in.
17*31212Sminshall  *
18*31212Sminshall  * We are called from the main loop in telnet.c.
19*31212Sminshall  */
20*31212Sminshall 
21*31212Sminshall int
22*31212Sminshall shell_continue()
23*31212Sminshall {
24*31212Sminshall     /*
25*31212Sminshall      * spint_start() returns when either the command has finished, or when
26*31212Sminshall      * the required interrupt comes in.  In the latter case, the appropriate
27*31212Sminshall      * thing to do is to process the interrupt, and then return to
28*31212Sminshall      * the interrupt issuer by calling spint_continue().
29*31212Sminshall      */
30*31212Sminshall     if (need_to_start) {
31*31212Sminshall 	need_to_start = 0;
32*31212Sminshall 	spint_start(command, &spinted);
33*31212Sminshall     }
34*31212Sminshall 
35*31212Sminshall     if (spinted.done == 0) {
36*31212Sminshall 	/* Process request */
37*31212Sminshall 	handle_api(&spinted.regs, &spinted.sregs);
38*31212Sminshall 	spint_continue(&spinted);
39*31212Sminshall     } else {
40*31212Sminshall 	if (spinted.rc != 0) {
41*31212Sminshall 	    fprintf(stderr, "Process generated a return code of 0x%x.\n",
42*31212Sminshall 								spinted.rc);
43*31212Sminshall 	}
44*31212Sminshall 	shell_active = 0;
45*31212Sminshall     }
46*31212Sminshall     return shell_active;
47*31212Sminshall }
48*31212Sminshall 
49*31212Sminshall 
50*31212Sminshall /*
5131184Sminshall  * Called from telnet.c to fork a lower command.com.  We
5231184Sminshall  * use the spint... routines so that we can pick up
5331184Sminshall  * interrupts generated by application programs.
5431184Sminshall  */
5531184Sminshall 
5631184Sminshall 
5731184Sminshall int
5831184Sminshall shell(argc,argv)
5931184Sminshall int	argc;
6031184Sminshall char	*argv[];
6131184Sminshall {
6231184Sminshall 
6331184Sminshall     ClearElement(spinted);
6431184Sminshall     spinted.int_no = API_INTERRUPT_NUMBER;
6531184Sminshall     if (argc == 1) {
6631184Sminshall 	command[0] = 0;
6731184Sminshall     } else {
6831184Sminshall 	char *cmdptr;
6931184Sminshall 	int length;
7031184Sminshall 
7131184Sminshall 	argc--;
7231184Sminshall 	argv++;
7331184Sminshall 	strcpy(command, " /c");
7431184Sminshall 	cmdptr = command+strlen(command);
7531184Sminshall 	while (argc) {
7631184Sminshall 	    if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) {
7731184Sminshall 		fprintf(stderr, "Argument list too long at argument *%s*.\n",
7831184Sminshall 			    *argv);
7931184Sminshall 		return 0;
8031184Sminshall 	    }
8131184Sminshall 	    *cmdptr++ = ' ';		/* Blank separators */
8231184Sminshall 	    strcpy(cmdptr, *argv);
8331184Sminshall 	    cmdptr += strlen(cmdptr);
8431184Sminshall 	    argc--;
8531184Sminshall 	    argv++;
8631184Sminshall 	}
8731184Sminshall 	length = strlen(command)-1;
8831184Sminshall 	if (length < 0) {
8931184Sminshall 	    length = 0;
9031184Sminshall 	}
9131184Sminshall 	command[0] = length;
9231184Sminshall     }
93*31212Sminshall     need_to_start = 1;
94*31212Sminshall     shell_active = 1;
95*31212Sminshall     return 1;			/* Go back to main loop */
9631184Sminshall }
97