131184Sminshall #include <stdio.h>
231184Sminshall 
331185Sminshall #include "../general/general.h"
431874Sminshall #include "../ctlr/api.h"
531184Sminshall #include "spint.h"
631184Sminshall 
731212Sminshall #include "../general/globals.h"
831184Sminshall 
931184Sminshall 
1031212Sminshall static Spint spinted;
1131212Sminshall static char command[256];
1231212Sminshall static int need_to_start = 0;
1331212Sminshall 
1431184Sminshall /*
1531212Sminshall  * shell_continue() actually runs the command, and looks for API
1631212Sminshall  * requests coming back in.
1731212Sminshall  *
1831212Sminshall  * We are called from the main loop in telnet.c.
1931212Sminshall  */
2031212Sminshall 
2131212Sminshall int
2231212Sminshall shell_continue()
2331212Sminshall {
2431212Sminshall     /*
2531212Sminshall      * spint_start() returns when either the command has finished, or when
2631212Sminshall      * the required interrupt comes in.  In the latter case, the appropriate
2731212Sminshall      * thing to do is to process the interrupt, and then return to
2831212Sminshall      * the interrupt issuer by calling spint_continue().
2931212Sminshall      */
3031212Sminshall     if (need_to_start) {
3131212Sminshall 	need_to_start = 0;
3231212Sminshall 	spint_start(command, &spinted);
3331212Sminshall     }
3431212Sminshall 
3531212Sminshall     if (spinted.done == 0) {
3631212Sminshall 	/* Process request */
3731212Sminshall 	handle_api(&spinted.regs, &spinted.sregs);
3831212Sminshall 	spint_continue(&spinted);
3931212Sminshall     } else {
40*31884Sminshall 	char inputbuffer[100];
41*31884Sminshall 
4231212Sminshall 	if (spinted.rc != 0) {
4331212Sminshall 	    fprintf(stderr, "Process generated a return code of 0x%x.\n",
4431212Sminshall 								spinted.rc);
4531212Sminshall 	}
46*31884Sminshall 	printf("[Hit return to continue]");
47*31884Sminshall 	fflush(stdout);
48*31884Sminshall 	(void) gets(inputbuffer);
4931212Sminshall 	shell_active = 0;
50*31884Sminshall 	setconnmode();
51*31884Sminshall 	ConnectScreen();
5231212Sminshall     }
5331212Sminshall     return shell_active;
5431212Sminshall }
5531212Sminshall 
5631212Sminshall 
5731212Sminshall /*
5831184Sminshall  * Called from telnet.c to fork a lower command.com.  We
5931184Sminshall  * use the spint... routines so that we can pick up
6031184Sminshall  * interrupts generated by application programs.
6131184Sminshall  */
6231184Sminshall 
6331184Sminshall 
6431184Sminshall int
6531184Sminshall shell(argc,argv)
6631184Sminshall int	argc;
6731184Sminshall char	*argv[];
6831184Sminshall {
6931184Sminshall 
7031184Sminshall     ClearElement(spinted);
7131184Sminshall     spinted.int_no = API_INTERRUPT_NUMBER;
7231184Sminshall     if (argc == 1) {
7331184Sminshall 	command[0] = 0;
7431184Sminshall     } else {
7531184Sminshall 	char *cmdptr;
7631184Sminshall 	int length;
7731184Sminshall 
7831184Sminshall 	argc--;
7931184Sminshall 	argv++;
8031184Sminshall 	strcpy(command, " /c");
8131184Sminshall 	cmdptr = command+strlen(command);
8231184Sminshall 	while (argc) {
8331184Sminshall 	    if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) {
8431184Sminshall 		fprintf(stderr, "Argument list too long at argument *%s*.\n",
8531184Sminshall 			    *argv);
8631184Sminshall 		return 0;
8731184Sminshall 	    }
8831184Sminshall 	    *cmdptr++ = ' ';		/* Blank separators */
8931184Sminshall 	    strcpy(cmdptr, *argv);
9031184Sminshall 	    cmdptr += strlen(cmdptr);
9131184Sminshall 	    argc--;
9231184Sminshall 	    argv++;
9331184Sminshall 	}
9431184Sminshall 	length = strlen(command)-1;
9531184Sminshall 	if (length < 0) {
9631184Sminshall 	    length = 0;
9731184Sminshall 	}
9831184Sminshall 	command[0] = length;
9931184Sminshall     }
10031212Sminshall     need_to_start = 1;
10131212Sminshall     shell_active = 1;
10231212Sminshall     return 1;			/* Go back to main loop */
10331184Sminshall }
104