131184Sminshall #include <stdio.h>
231184Sminshall 
3*31185Sminshall #include "../general/general.h"
431184Sminshall #include "../api/api.h"
531184Sminshall #include "spint.h"
631184Sminshall 
731184Sminshall 
831184Sminshall 
931184Sminshall /*
1031184Sminshall  * Called from telnet.c to fork a lower command.com.  We
1131184Sminshall  * use the spint... routines so that we can pick up
1231184Sminshall  * interrupts generated by application programs.
1331184Sminshall  */
1431184Sminshall 
1531184Sminshall 
1631184Sminshall int
1731184Sminshall shell(argc,argv)
1831184Sminshall int	argc;
1931184Sminshall char	*argv[];
2031184Sminshall {
2131184Sminshall     Spint spinted;
2231184Sminshall     char command[256];
2331184Sminshall 
2431184Sminshall     ClearElement(spinted);
2531184Sminshall     spinted.int_no = API_INTERRUPT_NUMBER;
2631184Sminshall     if (argc == 1) {
2731184Sminshall 	command[0] = 0;
2831184Sminshall     } else {
2931184Sminshall 	char *cmdptr;
3031184Sminshall 	int length;
3131184Sminshall 
3231184Sminshall 	argc--;
3331184Sminshall 	argv++;
3431184Sminshall 	strcpy(command, " /c");
3531184Sminshall 	cmdptr = command+strlen(command);
3631184Sminshall 	while (argc) {
3731184Sminshall 	    if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) {
3831184Sminshall 		fprintf(stderr, "Argument list too long at argument *%s*.\n",
3931184Sminshall 			    *argv);
4031184Sminshall 		return 0;
4131184Sminshall 	    }
4231184Sminshall 	    *cmdptr++ = ' ';		/* Blank separators */
4331184Sminshall 	    strcpy(cmdptr, *argv);
4431184Sminshall 	    cmdptr += strlen(cmdptr);
4531184Sminshall 	    argc--;
4631184Sminshall 	    argv++;
4731184Sminshall 	}
4831184Sminshall 	length = strlen(command)-1;
4931184Sminshall 	if (length < 0) {
5031184Sminshall 	    length = 0;
5131184Sminshall 	}
5231184Sminshall 	command[0] = length;
5331184Sminshall     }
5431184Sminshall 
5531184Sminshall     /*
5631184Sminshall      * spint_start() returns when either the command has finished, or when
5731184Sminshall      * the required interrupt comes in.  In the latter case, the appropriate
5831184Sminshall      * thing to do is to process the interrupt, and then return to
5931184Sminshall      * the interrupt issuer by calling spint_continue().
6031184Sminshall      */
6131184Sminshall     spint_start(command, &spinted);
6231184Sminshall     while (spinted.done == 0) {
6331184Sminshall 	/* Process request */
6431184Sminshall 	handle_api(&spinted.regs, &spinted.sregs);
6531184Sminshall 	spint_continue(&spinted);
6631184Sminshall     }
6731184Sminshall     if (spinted.rc != 0) {
6831184Sminshall 	fprintf(stderr, "Process generated a return code of 0x%x.\n",
6931184Sminshall 								spinted.rc);
7031184Sminshall     }
7131184Sminshall     return 0;
7231184Sminshall }
73