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