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