1*31184Sminshall #include <stdio.h> 2*31184Sminshall 3*31184Sminshall #include "../api/api.h" 4*31184Sminshall #include "spint.h" 5*31184Sminshall 6*31184Sminshall 7*31184Sminshall 8*31184Sminshall /* 9*31184Sminshall * Called from telnet.c to fork a lower command.com. We 10*31184Sminshall * use the spint... routines so that we can pick up 11*31184Sminshall * interrupts generated by application programs. 12*31184Sminshall */ 13*31184Sminshall 14*31184Sminshall 15*31184Sminshall int 16*31184Sminshall shell(argc,argv) 17*31184Sminshall int argc; 18*31184Sminshall char *argv[]; 19*31184Sminshall { 20*31184Sminshall Spint spinted; 21*31184Sminshall char command[256]; 22*31184Sminshall 23*31184Sminshall ClearElement(spinted); 24*31184Sminshall spinted.int_no = API_INTERRUPT_NUMBER; 25*31184Sminshall if (argc == 1) { 26*31184Sminshall command[0] = 0; 27*31184Sminshall } else { 28*31184Sminshall char *cmdptr; 29*31184Sminshall int length; 30*31184Sminshall 31*31184Sminshall argc--; 32*31184Sminshall argv++; 33*31184Sminshall strcpy(command, " /c"); 34*31184Sminshall cmdptr = command+strlen(command); 35*31184Sminshall while (argc) { 36*31184Sminshall if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) { 37*31184Sminshall fprintf(stderr, "Argument list too long at argument *%s*.\n", 38*31184Sminshall *argv); 39*31184Sminshall return 0; 40*31184Sminshall } 41*31184Sminshall *cmdptr++ = ' '; /* Blank separators */ 42*31184Sminshall strcpy(cmdptr, *argv); 43*31184Sminshall cmdptr += strlen(cmdptr); 44*31184Sminshall argc--; 45*31184Sminshall argv++; 46*31184Sminshall } 47*31184Sminshall length = strlen(command)-1; 48*31184Sminshall if (length < 0) { 49*31184Sminshall length = 0; 50*31184Sminshall } 51*31184Sminshall command[0] = length; 52*31184Sminshall } 53*31184Sminshall 54*31184Sminshall /* 55*31184Sminshall * spint_start() returns when either the command has finished, or when 56*31184Sminshall * the required interrupt comes in. In the latter case, the appropriate 57*31184Sminshall * thing to do is to process the interrupt, and then return to 58*31184Sminshall * the interrupt issuer by calling spint_continue(). 59*31184Sminshall */ 60*31184Sminshall spint_start(command, &spinted); 61*31184Sminshall while (spinted.done == 0) { 62*31184Sminshall /* Process request */ 63*31184Sminshall handle_api(&spinted.regs, &spinted.sregs); 64*31184Sminshall spint_continue(&spinted); 65*31184Sminshall } 66*31184Sminshall if (spinted.rc != 0) { 67*31184Sminshall fprintf(stderr, "Process generated a return code of 0x%x.\n", 68*31184Sminshall spinted.rc); 69*31184Sminshall } 70*31184Sminshall return 0; 71*31184Sminshall } 72