|
|
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: register uchar *cp;
45: char *getenv();
46: #endif
47: #if VMS
48: movecursor(term.t_nrow, 0); /* In last line. */
49: mlputs("[Starting DCL]\r\n");
50: tflush(); /* Ignore "ttcol". */
51: sgarbf = TRUE;
52: return (sys(NULL)); /* NULL => DCL. */
53: #endif
54: #if CPM
55: mlwrite("Not in CP/M-86");
56: #endif
57: #if GEM
58: movecursor(term.t_nrow, 0); /* Seek to last line. */
59: tflush();
60: tclose();
61: system("msh");
62: sgarbf = TRUE;
63: topen();
64: return (TRUE);
65: #endif
66: #if MSDOS
67: movecursor(term.t_nrow, 0); /* Seek to last line. */
68: tflush();
69: ttclose();
70: execall("c:\\command.com", ""); /* Run CLI. */
71: ttopen();
72: sgarbf = TRUE;
73: return (TRUE);
74: #endif
75: #if V7
76: movecursor(term.t_nrow, 0); /* Seek to last line. */
77: tflush();
78: tclose(); /* stty to old settings */
79: if ((cp = getenv("SHELL")) != NULL && *cp != '\0')
80: system(cp);
81: else
82: system("exec /bin/sh");
83: sgarbf = TRUE;
84: topen();
85: return (TRUE);
86: #endif
87: }
88:
89: /*
90: * Run a one-liner in a subjob.
91: * When the command returns, wait for a single
92: * character to be typed, then mark the screen as
93: * garbage so a full repaint is done.
94: * Bound to "C-X !".
95: */
96: spawn(f, n)
97: {
98: register int s;
99: uchar line[NLINE];
100: #if VMS
101: if ((s=mlreply("DCL command: ", line, NLINE)) != TRUE)
102: return (s);
103: tputc('\n'); /* Already have '\r' */
104: tflush();
105: s = sys(line); /* Run the command. */
106: mlputs("\r\n\n[End]"); /* Pause. */
107: tflush();
108: while (tgetc() != '\r')
109: ;
110: sgarbf = TRUE;
111: return (s);
112: #endif
113: #if CPM
114: mlwrite("Not in CP/M-86");
115: return (FALSE);
116: #endif
117: #if GEM
118: if ((s=mlreply("! ", line, NLINE)) != TRUE)
119: return (s);
120: tputc('\n'); /* Already have '\r' */
121: tflush();
122: tclose();
123: system(line);
124: topen();
125: mlputs("[End]"); /* Pause. */
126: tflush();
127: while ((s = tgetc()) != '\r' && s != ' ')
128: ;
129: sgarbf = TRUE;
130: return (TRUE);
131: #endif
132: #if MSDOS
133: if ((s=mlreply("DOS command: ", line, NLINE)) != TRUE)
134: return (s);
135: (*term.t_putchar)('\n');
136: ttclose();
137: system(line);
138: ttopen();
139: mlputs("\n[End]");
140: while (tgetc() != '\r') /* Pause. */
141: ;
142: sgarbf = TRUE;
143: return (TRUE);
144: #endif
145: #if V7
146: if ((s=mlreply("! ", line, NLINE)) != TRUE)
147: return (s);
148: tputc('\n'); /* Already have '\r' */
149: tflush();
150: tclose(); /* stty to old modes */
151: system(line);
152: sleep(2);
153: topen();
154: mlputs("[End]"); /* Pause. */
155: tflush();
156: while ((s = tgetc()) != '\r' && s != ' ')
157: ;
158: sgarbf = TRUE;
159: return (TRUE);
160: #endif
161: }
162:
163: #if VMS
164: /*
165: * Run a command. The "cmd" is a pointer
166: * to a command string, or NULL if you want to run
167: * a copy of DCL in the subjob (this is how the standard
168: * routine LIB$SPAWN works. You have to do wierd stuff
169: * with the terminal on the way in and the way out,
170: * because DCL does not want the channel to be
171: * in raw mode.
172: */
173: sys(cmd)
174: register uchar *cmd;
175: {
176: struct dsc$descriptor cdsc;
177: struct dsc$descriptor *cdscp;
178: long status;
179: long substatus;
180: long iosb[2];
181:
182: status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0,
183: oldmode, sizeof(oldmode), 0, 0, 0, 0);
184: if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)
185: return (FALSE);
186: cdscp = NULL; /* Assume DCL. */
187: if (cmd != NULL) { /* Build descriptor. */
188: cdsc.dsc$a_pointer = cmd;
189: cdsc.dsc$w_length = strlen(cmd);
190: cdsc.dsc$b_dtype = DSC$K_DTYPE_T;
191: cdsc.dsc$b_class = DSC$K_CLASS_S;
192: cdscp = &cdsc;
193: }
194: status = LIB$SPAWN(cdscp, 0, 0, 0, 0, 0, &substatus, 0, 0, 0);
195: if (status != SS$_NORMAL)
196: substatus = status;
197: status = SYS$QIOW(EFN, iochan, IO$_SETMODE, iosb, 0, 0,
198: newmode, sizeof(newmode), 0, 0, 0, 0);
199: if (status!=SS$_NORMAL || (iosb[0]&0xFFFF)!=SS$_NORMAL)
200: return (FALSE);
201: if ((substatus&STS$M_SUCCESS) == 0) /* Command failed. */
202: return (FALSE);
203: return (TRUE);
204: }
205: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.