- if (spawn->done == 0) {
- return; /* Not done yet */
- }
-
- if (spawn->regs.x.cflag) {
- fprintf(stderr, "0x%x return code from EXEC.\n", spawn->regs.x.ax);
- spawn->done = 1;
- spawn->rc = 99;
- return;
- }
-
- spawn->regs.h.ah = 0x4d; /* Get return code */
-
- intdos(&spawn->regs, &spawn->regs);
-
- spawn->rc = spawn->regs.x.ax;
-
- /*
- * Restore old interrupt handler.
- */
-
- spawn->regs.h.ah = 0x25;
- spawn->regs.h.al = spawn->int_no;
- spawn->regs.x.dx = int_offset;
- spawn->sregs.ds = int_segment;
- intdosx(&spawn->regs, &spawn->regs, &spawn->sregs);
-}
-\f
-/* XXX */
-
-#define INTERRUPT_NUMBER 73
-
-main(argc, argv, envp)
-int argc; /* Number of passed arguments */
-char *argv[]; /* Arguments passed */
-char *envp[]; /* Inherited environment */
-{
- Spawn spawned;
- static char command[256];
-
- ClearElement(spawned);
- spawned.int_no = 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;
- }
-
- /*
- * do_spawn() 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 continue_spawn().
- */
- do_spawn(command, &spawned);
- while (spawned.done == 0) {
- /* Process request */
- spawned.regs.h.al = 0;
- spawned.regs.x.cflag = 0; /* No errors (yet) */
- switch (spawned.regs.h.ah) {
- case 1: /* Add */
- spawned.regs.x.bx += spawned.regs.x.cx;
- break;
- case 2: /* Subtract */
- spawned.regs.x.bx -= spawned.regs.x.cx;
- break;
- case 3: /* Multiply */
- spawned.regs.x.bx *= spawned.regs.x.cx;
- break;
- case 4: /* Divide */
- spawned.regs.x.bx /= spawned.regs.x.cx;
- break;
- default:
- spawned.regs.h.al = -1; /* Error */
- spawned.regs.x.cflag = 1;
- break;
- }
- spawned.regs.h.ah = 0; /* We saw this */
- continue_spawn(&spawned);
- }
- if (spawned.rc != 0) {
- fprintf(stderr, "Process generated a return code of 0x%x.\n",
- spawned.rc);
- }