131184Sminshall #include <stdio.h> 231184Sminshall 331185Sminshall #include "../general/general.h" 4*31874Sminshall #include "../ctlr/api.h" 531184Sminshall #include "spint.h" 631184Sminshall 731212Sminshall #include "../general/globals.h" 831184Sminshall 931184Sminshall 1031212Sminshall static Spint spinted; 1131212Sminshall static char command[256]; 1231212Sminshall static int need_to_start = 0; 1331212Sminshall 1431184Sminshall /* 1531212Sminshall * shell_continue() actually runs the command, and looks for API 1631212Sminshall * requests coming back in. 1731212Sminshall * 1831212Sminshall * We are called from the main loop in telnet.c. 1931212Sminshall */ 2031212Sminshall 2131212Sminshall int 2231212Sminshall shell_continue() 2331212Sminshall { 2431212Sminshall /* 2531212Sminshall * spint_start() returns when either the command has finished, or when 2631212Sminshall * the required interrupt comes in. In the latter case, the appropriate 2731212Sminshall * thing to do is to process the interrupt, and then return to 2831212Sminshall * the interrupt issuer by calling spint_continue(). 2931212Sminshall */ 3031212Sminshall if (need_to_start) { 3131212Sminshall need_to_start = 0; 3231212Sminshall spint_start(command, &spinted); 3331212Sminshall } 3431212Sminshall 3531212Sminshall if (spinted.done == 0) { 3631212Sminshall /* Process request */ 3731212Sminshall handle_api(&spinted.regs, &spinted.sregs); 3831212Sminshall spint_continue(&spinted); 3931212Sminshall } else { 4031212Sminshall if (spinted.rc != 0) { 4131212Sminshall fprintf(stderr, "Process generated a return code of 0x%x.\n", 4231212Sminshall spinted.rc); 4331212Sminshall } 4431212Sminshall shell_active = 0; 4531212Sminshall } 4631212Sminshall return shell_active; 4731212Sminshall } 4831212Sminshall 4931212Sminshall 5031212Sminshall /* 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 } 9331212Sminshall need_to_start = 1; 9431212Sminshall shell_active = 1; 9531212Sminshall return 1; /* Go back to main loop */ 9631184Sminshall } 97