131184Sminshall #include <stdio.h> 231184Sminshall 3*31185Sminshall #include "../general/general.h" 431184Sminshall #include "../api/api.h" 531184Sminshall #include "spint.h" 631184Sminshall 731184Sminshall 831184Sminshall 931184Sminshall /* 1031184Sminshall * Called from telnet.c to fork a lower command.com. We 1131184Sminshall * use the spint... routines so that we can pick up 1231184Sminshall * interrupts generated by application programs. 1331184Sminshall */ 1431184Sminshall 1531184Sminshall 1631184Sminshall int 1731184Sminshall shell(argc,argv) 1831184Sminshall int argc; 1931184Sminshall char *argv[]; 2031184Sminshall { 2131184Sminshall Spint spinted; 2231184Sminshall char command[256]; 2331184Sminshall 2431184Sminshall ClearElement(spinted); 2531184Sminshall spinted.int_no = API_INTERRUPT_NUMBER; 2631184Sminshall if (argc == 1) { 2731184Sminshall command[0] = 0; 2831184Sminshall } else { 2931184Sminshall char *cmdptr; 3031184Sminshall int length; 3131184Sminshall 3231184Sminshall argc--; 3331184Sminshall argv++; 3431184Sminshall strcpy(command, " /c"); 3531184Sminshall cmdptr = command+strlen(command); 3631184Sminshall while (argc) { 3731184Sminshall if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) { 3831184Sminshall fprintf(stderr, "Argument list too long at argument *%s*.\n", 3931184Sminshall *argv); 4031184Sminshall return 0; 4131184Sminshall } 4231184Sminshall *cmdptr++ = ' '; /* Blank separators */ 4331184Sminshall strcpy(cmdptr, *argv); 4431184Sminshall cmdptr += strlen(cmdptr); 4531184Sminshall argc--; 4631184Sminshall argv++; 4731184Sminshall } 4831184Sminshall length = strlen(command)-1; 4931184Sminshall if (length < 0) { 5031184Sminshall length = 0; 5131184Sminshall } 5231184Sminshall command[0] = length; 5331184Sminshall } 5431184Sminshall 5531184Sminshall /* 5631184Sminshall * spint_start() returns when either the command has finished, or when 5731184Sminshall * the required interrupt comes in. In the latter case, the appropriate 5831184Sminshall * thing to do is to process the interrupt, and then return to 5931184Sminshall * the interrupt issuer by calling spint_continue(). 6031184Sminshall */ 6131184Sminshall spint_start(command, &spinted); 6231184Sminshall while (spinted.done == 0) { 6331184Sminshall /* Process request */ 6431184Sminshall handle_api(&spinted.regs, &spinted.sregs); 6531184Sminshall spint_continue(&spinted); 6631184Sminshall } 6731184Sminshall if (spinted.rc != 0) { 6831184Sminshall fprintf(stderr, "Process generated a return code of 0x%x.\n", 6931184Sminshall spinted.rc); 7031184Sminshall } 7131184Sminshall return 0; 7231184Sminshall } 73