1*31184Sminshall #include <stdio.h>
2*31184Sminshall 
3*31184Sminshall #include "../api/api.h"
4*31184Sminshall #include "spint.h"
5*31184Sminshall 
6*31184Sminshall 
7*31184Sminshall 
8*31184Sminshall /*
9*31184Sminshall  * Called from telnet.c to fork a lower command.com.  We
10*31184Sminshall  * use the spint... routines so that we can pick up
11*31184Sminshall  * interrupts generated by application programs.
12*31184Sminshall  */
13*31184Sminshall 
14*31184Sminshall 
15*31184Sminshall int
16*31184Sminshall shell(argc,argv)
17*31184Sminshall int	argc;
18*31184Sminshall char	*argv[];
19*31184Sminshall {
20*31184Sminshall     Spint spinted;
21*31184Sminshall     char command[256];
22*31184Sminshall 
23*31184Sminshall     ClearElement(spinted);
24*31184Sminshall     spinted.int_no = API_INTERRUPT_NUMBER;
25*31184Sminshall     if (argc == 1) {
26*31184Sminshall 	command[0] = 0;
27*31184Sminshall     } else {
28*31184Sminshall 	char *cmdptr;
29*31184Sminshall 	int length;
30*31184Sminshall 
31*31184Sminshall 	argc--;
32*31184Sminshall 	argv++;
33*31184Sminshall 	strcpy(command, " /c");
34*31184Sminshall 	cmdptr = command+strlen(command);
35*31184Sminshall 	while (argc) {
36*31184Sminshall 	    if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) {
37*31184Sminshall 		fprintf(stderr, "Argument list too long at argument *%s*.\n",
38*31184Sminshall 			    *argv);
39*31184Sminshall 		return 0;
40*31184Sminshall 	    }
41*31184Sminshall 	    *cmdptr++ = ' ';		/* Blank separators */
42*31184Sminshall 	    strcpy(cmdptr, *argv);
43*31184Sminshall 	    cmdptr += strlen(cmdptr);
44*31184Sminshall 	    argc--;
45*31184Sminshall 	    argv++;
46*31184Sminshall 	}
47*31184Sminshall 	length = strlen(command)-1;
48*31184Sminshall 	if (length < 0) {
49*31184Sminshall 	    length = 0;
50*31184Sminshall 	}
51*31184Sminshall 	command[0] = length;
52*31184Sminshall     }
53*31184Sminshall 
54*31184Sminshall     /*
55*31184Sminshall      * spint_start() returns when either the command has finished, or when
56*31184Sminshall      * the required interrupt comes in.  In the latter case, the appropriate
57*31184Sminshall      * thing to do is to process the interrupt, and then return to
58*31184Sminshall      * the interrupt issuer by calling spint_continue().
59*31184Sminshall      */
60*31184Sminshall     spint_start(command, &spinted);
61*31184Sminshall     while (spinted.done == 0) {
62*31184Sminshall 	/* Process request */
63*31184Sminshall 	handle_api(&spinted.regs, &spinted.sregs);
64*31184Sminshall 	spint_continue(&spinted);
65*31184Sminshall     }
66*31184Sminshall     if (spinted.rc != 0) {
67*31184Sminshall 	fprintf(stderr, "Process generated a return code of 0x%x.\n",
68*31184Sminshall 								spinted.rc);
69*31184Sminshall     }
70*31184Sminshall     return 0;
71*31184Sminshall }
72