|
|
1.1 ! root 1: /* ! 2: * The routines in this file ! 3: * are called to create a subjob running ! 4: * a command interpreter. This code is a big ! 5: * fat nothing on CP/M-86. You lose. ! 6: */ ! 7: #include <stdio.h> ! 8: #include "ed.h" ! 9: ! 10: #if VMS ! 11: #define EFN 0 /* Event flag. */ ! 12: ! 13: #include <ssdef.h> /* Random headers. */ ! 14: #include <stsdef.h> ! 15: #include <descrip.h> ! 16: #include <iodef.h> ! 17: ! 18: extern int oldmode[]; /* In "termio.c" */ ! 19: extern int newmode[]; /* In "termio.c" */ ! 20: extern short iochan; /* In "termio.c" */ ! 21: #endif ! 22: ! 23: #if MSDOS ! 24: #include <dos.h> ! 25: #endif ! 26: ! 27: #if V7 ! 28: #include <signal.h> ! 29: #endif ! 30: ! 31: /* ! 32: * Create a subjob with a copy ! 33: * of the command intrepreter in it. When the ! 34: * command interpreter exits, mark the screen as ! 35: * garbage so that you do a full repaint. Bound ! 36: * to "C-C". The message at ! 37: * the start in VMS puts out a newline. Under ! 38: * some (unknown) condition, you don't get one ! 39: * free when DCL starts up. ! 40: */ ! 41: spawncli(f, n) ! 42: { ! 43: #if V7 ! 44: uchar *cp; ! 45: char buf[80]; ! 46: char *getenv(); ! 47: #endif ! 48: #if VMS ! 49: movecursor(term.t_nrow, 0); /* In last line. */ ! 50: mlputs("[Starting DCL]\r\n"); ! 51: tflush(); /* Ignore "ttcol". */ ! 52: sgarbf = TRUE; ! 53: return (sys(NULL)); /* NULL => DCL. */ ! 54: #endif ! 55: #if CPM ! 56: mlwrite("Not in CP/M-86"); ! 57: #endif ! 58: #if GEM ! 59: movecursor(term.t_nrow, 0); /* Seek to last line. */ ! 60: tflush(); ! 61: tclose(); ! 62: system("msh"); ! 63: sgarbf = TRUE; ! 64: topen(); ! 65: return (TRUE); ! 66: #endif ! 67: #if MSDOS ! 68: movecursor(term.t_nrow, 0); /* Seek to last line. */ ! 69: tflush(); ! 70: ttclose(); ! 71: execall("c:\\command.com", ""); /* Run CLI. */ ! 72: ttopen(); ! 73: sgarbf = TRUE; ! 74: return (TRUE); ! 75: #endif ! 76: #if V7 ! 77: movecursor(term.t_nrow, 0); /* Seek to last line. */ ! 78: tflush(); ! 79: tclose(); /* stty to old settings */ ! 80: if ((cp = getenv("SHELL")) != NULL && *cp != '\0') { ! 81: sprintf(buf, "exec %s", cp); ! 82: system(buf); ! 83: } ! 84: else ! 85: system("exec /bin/sh"); ! 86: ! 87: sgarbf = TRUE; ! 88: topen(); ! 89: ! 90: return (TRUE); ! 91: #endif ! 92: } ! 93: ! 94: /* ! 95: * Run a one-liner in a subjob. ! 96: * When the command returns, wait for a single ! 97: * character to be typed, then mark the screen as ! 98: * garbage so a full repaint is done. ! 99: * Bound to "C-X !". ! 100: */ ! 101: spawn(f, n) ! 102: { ! 103: register int s; ! 104: uchar line[NLINE]; ! 105: #if VMS ! 106: if ((s=mlreply("DCL command: ", line, NLINE)) != TRUE) ! 107: return (s); ! 108: tputc('\n'); /* Already have '\r' */ ! 109: tflush(); ! 110: s = sys(line); /* Run the command. */ ! 111: mlputs("\r\n\n[End]"); /* Pause. */ ! 112: tflush(); ! 113: while (tgetc() != '\r') ! 114: ; ! 115: sgarbf = TRUE; ! 116: return (s); ! 117: #endif ! 118: #if CPM ! 119: mlwrite("Not in CP/M-86"); ! 120: return (FALSE); ! 121: #endif ! 122: #if GEM ! 123: if ((s=mlreply("! ", line, NLINE)) != TRUE) ! 124: return (s); ! 125: tputc('\n'); /* Already have '\r' */ ! 126: tflush(); ! 127: tclose(); ! 128: system(line); ! 129: topen(); ! 130: mlputs("[End]"); /* Pause. */ ! 131: tflush(); ! 132: while ((s = tgetc()) != '\r' && s != ' ') ! 133: ; ! 134: sgarbf = TRUE; ! 135: return (TRUE); ! 136: #endif ! 137: #if MSDOS ! 138: if ((s=mlreply("DOS command: ", line, NLINE)) != TRUE) ! 139: return (s); ! 140: (*term.t_putchar)('\n'); ! 141: ttclose(); ! 142: system(line); ! 143: ttopen(); ! 144: mlputs("\n[End]"); ! 145: while (tgetc() != '\r') /* Pause. */ ! 146: ; ! 147: sgarbf = TRUE; ! 148: return (TRUE); ! 149: #endif ! 150: #if V7 ! 151: if ((s=mlreply("! ", line, NLINE)) != TRUE) ! 152: return (s); ! 153: tputc('\n'); /* Already have '\r' */ ! 154: tflush(); ! 155: tclose(); /* stty to old modes */ ! 156: system(line); ! 157: sleep(2); ! 158: topen(); ! 159: mlputs("[End]"); /* Pause. */ ! 160: tflush(); ! 161: while ((s = tgetc()) != '\r' && s != ' ') ! 162: ; ! 163: sgarbf = TRUE; ! 164: return (TRUE); ! 165: #endif ! 166: } ! 167: ! 168: #if VMS ! 169: /* ! 170: * Run a command. The "cmd" is a pointer ! 171: * to a command string, or NULL if you want to run ! 172: * a copy of DCL in the subjob (this is how the standard ! 173: * routine LIB$SPAWN works. You have to do wierd stuff ! 174: * with the terminal on the way in and the way out, ! 175: * because DCL does not want the channel to be ! 176: * in raw mode. ! 177: */ ! 178: sys(cmd) ! 179: register uchar *cmd; ! 180: { ! 181: struct dsc$descriptor cdsc; ! 182: struct dsc$descriptor *cdscp; ! 183: long status; ! 184: long substatus; ! 185: long iosb[2]; ! 186: ! 187: status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0, ! 188: oldmode, sizeof(oldmode), 0, 0, 0, 0); ! 189: if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL) ! 190: return (FALSE); ! 191: cdscp = NULL; /* Assume DCL. */ ! 192: if (cmd != NULL) { /* Build descriptor. */ ! 193: cdsc.dsc$a_pointer = cmd; ! 194: cdsc.dsc$w_length = strlen(cmd); ! 195: cdsc.dsc$b_dtype = DSC$K_DTYPE_T; ! 196: cdsc.dsc$b_class = DSC$K_CLASS_S; ! 197: cdscp = &cdsc; ! 198: } ! 199: status = LIB$SPAWN(cdscp, 0, 0, 0, 0, 0, &substatus, 0, 0, 0); ! 200: if (status != SS$_NORMAL) ! 201: substatus = status; ! 202: status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0, ! 203: newmode, sizeof(newmode), 0, 0, 0, 0); ! 204: if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL) ! 205: return (FALSE); ! 206: if ((substatus&STS$M_SUCCESS) == 0) /* Command failed. */ ! 207: return (FALSE); ! 208: return (TRUE); ! 209: } ! 210: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.