148757Sbostic /*-
2*62343Sbostic  * Copyright (c) 1988, 1993
3*62343Sbostic  *	The Regents of the University of California.  All rights reserved.
431895Sminshall  *
548757Sbostic  * %sccs.include.redist.c%
631895Sminshall  */
731895Sminshall 
831895Sminshall #ifndef lint
9*62343Sbostic static char sccsid[] = "@(#)system.c	8.1 (Berkeley) 06/06/93";
1033814Sbostic #endif /* not lint */
1131895Sminshall 
1231184Sminshall #include <stdio.h>
1331184Sminshall 
1431185Sminshall #include "../general/general.h"
1531874Sminshall #include "../ctlr/api.h"
1631184Sminshall #include "spint.h"
1731184Sminshall 
1831212Sminshall #include "../general/globals.h"
1931184Sminshall 
2031184Sminshall 
2131212Sminshall static Spint spinted;
2231212Sminshall static char command[256];
2331212Sminshall static int need_to_start = 0;
2431212Sminshall 
2531184Sminshall /*
2631212Sminshall  * shell_continue() actually runs the command, and looks for API
2731212Sminshall  * requests coming back in.
2831212Sminshall  *
2931212Sminshall  * We are called from the main loop in telnet.c.
3031212Sminshall  */
3131212Sminshall 
3231212Sminshall int
shell_continue()3331212Sminshall shell_continue()
3431212Sminshall {
3531212Sminshall     /*
3631212Sminshall      * spint_start() returns when either the command has finished, or when
3731212Sminshall      * the required interrupt comes in.  In the latter case, the appropriate
3831212Sminshall      * thing to do is to process the interrupt, and then return to
3931212Sminshall      * the interrupt issuer by calling spint_continue().
4031212Sminshall      */
4131212Sminshall     if (need_to_start) {
4231212Sminshall 	need_to_start = 0;
4331212Sminshall 	spint_start(command, &spinted);
4431212Sminshall     }
4531212Sminshall 
4631212Sminshall     if (spinted.done == 0) {
4731212Sminshall 	/* Process request */
4831212Sminshall 	handle_api(&spinted.regs, &spinted.sregs);
4931212Sminshall 	spint_continue(&spinted);
5031212Sminshall     } else {
5131884Sminshall 	char inputbuffer[100];
5231884Sminshall 
5331212Sminshall 	if (spinted.rc != 0) {
5431212Sminshall 	    fprintf(stderr, "Process generated a return code of 0x%x.\n",
5531212Sminshall 								spinted.rc);
5631212Sminshall 	}
5731884Sminshall 	printf("[Hit return to continue]");
5831884Sminshall 	fflush(stdout);
5931884Sminshall 	(void) gets(inputbuffer);
6031212Sminshall 	shell_active = 0;
6131884Sminshall 	setconnmode();
6231884Sminshall 	ConnectScreen();
6331212Sminshall     }
6431212Sminshall     return shell_active;
6531212Sminshall }
6631212Sminshall 
6731212Sminshall 
6831212Sminshall /*
6931184Sminshall  * Called from telnet.c to fork a lower command.com.  We
7031184Sminshall  * use the spint... routines so that we can pick up
7131184Sminshall  * interrupts generated by application programs.
7231184Sminshall  */
7331184Sminshall 
7431184Sminshall 
7531184Sminshall int
shell(argc,argv)7631184Sminshall shell(argc,argv)
7731184Sminshall int	argc;
7831184Sminshall char	*argv[];
7931184Sminshall {
8031184Sminshall 
8131184Sminshall     ClearElement(spinted);
8231184Sminshall     spinted.int_no = API_INTERRUPT_NUMBER;
8331184Sminshall     if (argc == 1) {
8431184Sminshall 	command[0] = 0;
8531184Sminshall     } else {
8631184Sminshall 	char *cmdptr;
8731184Sminshall 	int length;
8831184Sminshall 
8931184Sminshall 	argc--;
9031184Sminshall 	argv++;
9131184Sminshall 	strcpy(command, " /c");
9231184Sminshall 	cmdptr = command+strlen(command);
9331184Sminshall 	while (argc) {
9431184Sminshall 	    if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) {
9531184Sminshall 		fprintf(stderr, "Argument list too long at argument *%s*.\n",
9631184Sminshall 			    *argv);
9731184Sminshall 		return 0;
9831184Sminshall 	    }
9931184Sminshall 	    *cmdptr++ = ' ';		/* Blank separators */
10031184Sminshall 	    strcpy(cmdptr, *argv);
10131184Sminshall 	    cmdptr += strlen(cmdptr);
10231184Sminshall 	    argc--;
10331184Sminshall 	    argv++;
10431184Sminshall 	}
10531184Sminshall 	length = strlen(command)-1;
10631184Sminshall 	if (length < 0) {
10731184Sminshall 	    length = 0;
10831184Sminshall 	}
10931184Sminshall 	command[0] = length;
11031184Sminshall     }
11131212Sminshall     need_to_start = 1;
11231212Sminshall     shell_active = 1;
11331212Sminshall     return 1;			/* Go back to main loop */
11431184Sminshall }
115