diff options
Diffstat (limited to 'usr.bin/tn3270/distribution/sys_dos/system.c')
-rw-r--r-- | usr.bin/tn3270/distribution/sys_dos/system.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/usr.bin/tn3270/distribution/sys_dos/system.c b/usr.bin/tn3270/distribution/sys_dos/system.c new file mode 100644 index 0000000..864926b --- /dev/null +++ b/usr.bin/tn3270/distribution/sys_dos/system.c @@ -0,0 +1,140 @@ +/*- + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)system.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +#include <stdio.h> + +#include "../general/general.h" +#include "../ctlr/api.h" +#include "spint.h" + +#include "../general/globals.h" + + +static Spint spinted; +static char command[256]; +static int need_to_start = 0; + +/* + * shell_continue() actually runs the command, and looks for API + * requests coming back in. + * + * We are called from the main loop in telnet.c. + */ + +int +shell_continue() +{ + /* + * spint_start() returns when either the command has finished, or when + * the required interrupt comes in. In the latter case, the appropriate + * thing to do is to process the interrupt, and then return to + * the interrupt issuer by calling spint_continue(). + */ + if (need_to_start) { + need_to_start = 0; + spint_start(command, &spinted); + } + + if (spinted.done == 0) { + /* Process request */ + handle_api(&spinted.regs, &spinted.sregs); + spint_continue(&spinted); + } else { + char inputbuffer[100]; + + if (spinted.rc != 0) { + fprintf(stderr, "Process generated a return code of 0x%x.\n", + spinted.rc); + } + printf("[Hit return to continue]"); + fflush(stdout); + (void) gets(inputbuffer); + shell_active = 0; + setconnmode(); + ConnectScreen(); + } + return shell_active; +} + + +/* + * Called from telnet.c to fork a lower command.com. We + * use the spint... routines so that we can pick up + * interrupts generated by application programs. + */ + + +int +shell(argc,argv) +int argc; +char *argv[]; +{ + + ClearElement(spinted); + spinted.int_no = API_INTERRUPT_NUMBER; + if (argc == 1) { + command[0] = 0; + } else { + char *cmdptr; + int length; + + argc--; + argv++; + strcpy(command, " /c"); + cmdptr = command+strlen(command); + while (argc) { + if ((cmdptr+strlen(*argv)) >= (command+sizeof command)) { + fprintf(stderr, "Argument list too long at argument *%s*.\n", + *argv); + return 0; + } + *cmdptr++ = ' '; /* Blank separators */ + strcpy(cmdptr, *argv); + cmdptr += strlen(cmdptr); + argc--; + argv++; + } + length = strlen(command)-1; + if (length < 0) { + length = 0; + } + command[0] = length; + } + need_to_start = 1; + shell_active = 1; + return 1; /* Go back to main loop */ +} |