131184Sminshall #include <stdio.h> 231184Sminshall 331185Sminshall #include "../general/general.h" 431184Sminshall #include "../api/api.h" 531184Sminshall #include "spint.h" 631184Sminshall 7*31212Sminshall #include "../general/globals.h" 831184Sminshall 931184Sminshall 10*31212Sminshall static Spint spinted; 11*31212Sminshall static char command[256]; 12*31212Sminshall static int need_to_start = 0; 13*31212Sminshall 1431184Sminshall /* 15*31212Sminshall * shell_continue() actually runs the command, and looks for API 16*31212Sminshall * requests coming back in. 17*31212Sminshall * 18*31212Sminshall * We are called from the main loop in telnet.c. 19*31212Sminshall */ 20*31212Sminshall 21*31212Sminshall int 22*31212Sminshall shell_continue() 23*31212Sminshall { 24*31212Sminshall /* 25*31212Sminshall * spint_start() returns when either the command has finished, or when 26*31212Sminshall * the required interrupt comes in. In the latter case, the appropriate 27*31212Sminshall * thing to do is to process the interrupt, and then return to 28*31212Sminshall * the interrupt issuer by calling spint_continue(). 29*31212Sminshall */ 30*31212Sminshall if (need_to_start) { 31*31212Sminshall need_to_start = 0; 32*31212Sminshall spint_start(command, &spinted); 33*31212Sminshall } 34*31212Sminshall 35*31212Sminshall if (spinted.done == 0) { 36*31212Sminshall /* Process request */ 37*31212Sminshall handle_api(&spinted.regs, &spinted.sregs); 38*31212Sminshall spint_continue(&spinted); 39*31212Sminshall } else { 40*31212Sminshall if (spinted.rc != 0) { 41*31212Sminshall fprintf(stderr, "Process generated a return code of 0x%x.\n", 42*31212Sminshall spinted.rc); 43*31212Sminshall } 44*31212Sminshall shell_active = 0; 45*31212Sminshall } 46*31212Sminshall return shell_active; 47*31212Sminshall } 48*31212Sminshall 49*31212Sminshall 50*31212Sminshall /* 5131184Sminshall * Called from telnet.c to fork a lower command.com. We 5231184Sminshall * use the spint... routines so that we can pick up 5331184Sminshall * interrupts generated by application programs. 5431184Sminshall */ 5531184Sminshall 5631184Sminshall 5731184Sminshall int 5831184Sminshall shell(argc,argv) 5931184Sminshall int argc; 6031184Sminshall char *argv[]; 6131184Sminshall { 6231184Sminshall 6331184Sminshall ClearElement(spinted); 6431184Sminshall spinted.int_no = API_INTERRUPT_NUMBER; 6531184Sminshall if (argc == 1) { 6631184Sminshall command[0] = 0; 6731184Sminshall } else { 6831184Sminshall char *cmdptr; 6931184Sminshall int length; 7031184Sminshall 7131184Sminshall argc--; 7231184Sminshall argv++; 7331184Sminshall strcpy(command, " /c"); 7431184Sminshall cmdptr = command+strlen(command); 7531184Sminshall while (argc) { 7631184Sminshall if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) { 7731184Sminshall fprintf(stderr, "Argument list too long at argument *%s*.\n", 7831184Sminshall *argv); 7931184Sminshall return 0; 8031184Sminshall } 8131184Sminshall *cmdptr++ = ' '; /* Blank separators */ 8231184Sminshall strcpy(cmdptr, *argv); 8331184Sminshall cmdptr += strlen(cmdptr); 8431184Sminshall argc--; 8531184Sminshall argv++; 8631184Sminshall } 8731184Sminshall length = strlen(command)-1; 8831184Sminshall if (length < 0) { 8931184Sminshall length = 0; 9031184Sminshall } 9131184Sminshall command[0] = length; 9231184Sminshall } 93*31212Sminshall need_to_start = 1; 94*31212Sminshall shell_active = 1; 95*31212Sminshall return 1; /* Go back to main loop */ 9631184Sminshall } 97