|
|
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.