|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)system.c 4.1 (Berkeley) 12/4/88"; ! 20: #endif /* not lint */ ! 21: ! 22: #include <stdio.h> ! 23: ! 24: #include "../general/general.h" ! 25: #include "../ctlr/api.h" ! 26: #include "spint.h" ! 27: ! 28: #include "../general/globals.h" ! 29: ! 30: ! 31: static Spint spinted; ! 32: static char command[256]; ! 33: static int need_to_start = 0; ! 34: ! 35: /* ! 36: * shell_continue() actually runs the command, and looks for API ! 37: * requests coming back in. ! 38: * ! 39: * We are called from the main loop in telnet.c. ! 40: */ ! 41: ! 42: int ! 43: shell_continue() ! 44: { ! 45: /* ! 46: * spint_start() returns when either the command has finished, or when ! 47: * the required interrupt comes in. In the latter case, the appropriate ! 48: * thing to do is to process the interrupt, and then return to ! 49: * the interrupt issuer by calling spint_continue(). ! 50: */ ! 51: if (need_to_start) { ! 52: need_to_start = 0; ! 53: spint_start(command, &spinted); ! 54: } ! 55: ! 56: if (spinted.done == 0) { ! 57: /* Process request */ ! 58: handle_api(&spinted.regs, &spinted.sregs); ! 59: spint_continue(&spinted); ! 60: } else { ! 61: char inputbuffer[100]; ! 62: ! 63: if (spinted.rc != 0) { ! 64: fprintf(stderr, "Process generated a return code of 0x%x.\n", ! 65: spinted.rc); ! 66: } ! 67: printf("[Hit return to continue]"); ! 68: fflush(stdout); ! 69: (void) gets(inputbuffer); ! 70: shell_active = 0; ! 71: setconnmode(); ! 72: ConnectScreen(); ! 73: } ! 74: return shell_active; ! 75: } ! 76: ! 77: ! 78: /* ! 79: * Called from telnet.c to fork a lower command.com. We ! 80: * use the spint... routines so that we can pick up ! 81: * interrupts generated by application programs. ! 82: */ ! 83: ! 84: ! 85: int ! 86: shell(argc,argv) ! 87: int argc; ! 88: char *argv[]; ! 89: { ! 90: ! 91: ClearElement(spinted); ! 92: spinted.int_no = API_INTERRUPT_NUMBER; ! 93: if (argc == 1) { ! 94: command[0] = 0; ! 95: } else { ! 96: char *cmdptr; ! 97: int length; ! 98: ! 99: argc--; ! 100: argv++; ! 101: strcpy(command, " /c"); ! 102: cmdptr = command+strlen(command); ! 103: while (argc) { ! 104: if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) { ! 105: fprintf(stderr, "Argument list too long at argument *%s*.\n", ! 106: *argv); ! 107: return 0; ! 108: } ! 109: *cmdptr++ = ' '; /* Blank separators */ ! 110: strcpy(cmdptr, *argv); ! 111: cmdptr += strlen(cmdptr); ! 112: argc--; ! 113: argv++; ! 114: } ! 115: length = strlen(command)-1; ! 116: if (length < 0) { ! 117: length = 0; ! 118: } ! 119: command[0] = length; ! 120: } ! 121: need_to_start = 1; ! 122: shell_active = 1; ! 123: return 1; /* Go back to main loop */ ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.