131895Sminshall /*
2*33814Sbostic  * Copyright (c) 1988 Regents of the University of California.
3*33814Sbostic  * All rights reserved.
431895Sminshall  *
5*33814Sbostic  * Redistribution and use in source and binary forms are permitted
6*33814Sbostic  * provided that this notice is preserved and that due credit is given
7*33814Sbostic  * to the University of California at Berkeley. The name of the University
8*33814Sbostic  * may not be used to endorse or promote products derived from this
9*33814Sbostic  * software without specific prior written permission. This software
10*33814Sbostic  * is provided ``as is'' without express or implied warranty.
1131895Sminshall  */
1231895Sminshall 
1331895Sminshall #ifndef lint
14*33814Sbostic static char sccsid[] = "@(#)system.c	3.2 (Berkeley) 03/28/88";
15*33814Sbostic #endif /* not lint */
1631895Sminshall 
1731184Sminshall #include <stdio.h>
1831184Sminshall 
1931185Sminshall #include "../general/general.h"
2031874Sminshall #include "../ctlr/api.h"
2131184Sminshall #include "spint.h"
2231184Sminshall 
2331212Sminshall #include "../general/globals.h"
2431184Sminshall 
2531184Sminshall 
2631212Sminshall static Spint spinted;
2731212Sminshall static char command[256];
2831212Sminshall static int need_to_start = 0;
2931212Sminshall 
3031184Sminshall /*
3131212Sminshall  * shell_continue() actually runs the command, and looks for API
3231212Sminshall  * requests coming back in.
3331212Sminshall  *
3431212Sminshall  * We are called from the main loop in telnet.c.
3531212Sminshall  */
3631212Sminshall 
3731212Sminshall int
3831212Sminshall shell_continue()
3931212Sminshall {
4031212Sminshall     /*
4131212Sminshall      * spint_start() returns when either the command has finished, or when
4231212Sminshall      * the required interrupt comes in.  In the latter case, the appropriate
4331212Sminshall      * thing to do is to process the interrupt, and then return to
4431212Sminshall      * the interrupt issuer by calling spint_continue().
4531212Sminshall      */
4631212Sminshall     if (need_to_start) {
4731212Sminshall 	need_to_start = 0;
4831212Sminshall 	spint_start(command, &spinted);
4931212Sminshall     }
5031212Sminshall 
5131212Sminshall     if (spinted.done == 0) {
5231212Sminshall 	/* Process request */
5331212Sminshall 	handle_api(&spinted.regs, &spinted.sregs);
5431212Sminshall 	spint_continue(&spinted);
5531212Sminshall     } else {
5631884Sminshall 	char inputbuffer[100];
5731884Sminshall 
5831212Sminshall 	if (spinted.rc != 0) {
5931212Sminshall 	    fprintf(stderr, "Process generated a return code of 0x%x.\n",
6031212Sminshall 								spinted.rc);
6131212Sminshall 	}
6231884Sminshall 	printf("[Hit return to continue]");
6331884Sminshall 	fflush(stdout);
6431884Sminshall 	(void) gets(inputbuffer);
6531212Sminshall 	shell_active = 0;
6631884Sminshall 	setconnmode();
6731884Sminshall 	ConnectScreen();
6831212Sminshall     }
6931212Sminshall     return shell_active;
7031212Sminshall }
7131212Sminshall 
7231212Sminshall 
7331212Sminshall /*
7431184Sminshall  * Called from telnet.c to fork a lower command.com.  We
7531184Sminshall  * use the spint... routines so that we can pick up
7631184Sminshall  * interrupts generated by application programs.
7731184Sminshall  */
7831184Sminshall 
7931184Sminshall 
8031184Sminshall int
8131184Sminshall shell(argc,argv)
8231184Sminshall int	argc;
8331184Sminshall char	*argv[];
8431184Sminshall {
8531184Sminshall 
8631184Sminshall     ClearElement(spinted);
8731184Sminshall     spinted.int_no = API_INTERRUPT_NUMBER;
8831184Sminshall     if (argc == 1) {
8931184Sminshall 	command[0] = 0;
9031184Sminshall     } else {
9131184Sminshall 	char *cmdptr;
9231184Sminshall 	int length;
9331184Sminshall 
9431184Sminshall 	argc--;
9531184Sminshall 	argv++;
9631184Sminshall 	strcpy(command, " /c");
9731184Sminshall 	cmdptr = command+strlen(command);
9831184Sminshall 	while (argc) {
9931184Sminshall 	    if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) {
10031184Sminshall 		fprintf(stderr, "Argument list too long at argument *%s*.\n",
10131184Sminshall 			    *argv);
10231184Sminshall 		return 0;
10331184Sminshall 	    }
10431184Sminshall 	    *cmdptr++ = ' ';		/* Blank separators */
10531184Sminshall 	    strcpy(cmdptr, *argv);
10631184Sminshall 	    cmdptr += strlen(cmdptr);
10731184Sminshall 	    argc--;
10831184Sminshall 	    argv++;
10931184Sminshall 	}
11031184Sminshall 	length = strlen(command)-1;
11131184Sminshall 	if (length < 0) {
11231184Sminshall 	    length = 0;
11331184Sminshall 	}
11431184Sminshall 	command[0] = length;
11531184Sminshall     }
11631212Sminshall     need_to_start = 1;
11731212Sminshall     shell_active = 1;
11831212Sminshall     return 1;			/* Go back to main loop */
11931184Sminshall }
120