1*48757Sbostic /*- 2*48757Sbostic * Copyright (c) 1988 The Regents of the University of California. 333814Sbostic * All rights reserved. 431895Sminshall * 5*48757Sbostic * %sccs.include.redist.c% 631895Sminshall */ 731895Sminshall 831895Sminshall #ifndef lint 9*48757Sbostic static char sccsid[] = "@(#)system.c 4.2 (Berkeley) 04/26/91"; 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 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 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