Mercurial > emacs
annotate nt/cmdproxy.c @ 51010:f79532778159
Rewrote the local minor mode so that it can be
sticky as well and made sticky the default. Reimplemented the
global minor mode. Updated the commentary section to document
these changes.
(hl-line-sticky-flag): New user option.
(hl-line-overlay): Made it buffer-local and gave it a docstring.
(global-hl-line-overlay): New variable.
(hl-line-mode): Rewritten to use `hl-line-sticky-flag'.
(hl-line-highlight): Rewritten to use `hl-line-sticky-flag'.
(hl-line-unhighlight): Updated docstring.
(global-hl-line-mode): Implemented directly so that is does not
depend on `hl-line-mode' any more.
(global-hl-line-highlight, global-hl-line-unhighlight): New
functions.
author | Lute Kamstra <lute@gnu.org> |
---|---|
date | Thu, 15 May 2003 13:21:23 +0000 |
parents | 23a1cea22d13 |
children | 695cf19ef79e d7ddb3e565de |
rev | line source |
---|---|
19236 | 1 /* Proxy shell designed for use with Emacs on Windows 95 and NT. |
2 Copyright (C) 1997 Free Software Foundation, Inc. | |
3 | |
4 Accepts subset of Unix sh(1) command-line options, for compatability | |
5 with elisp code written for Unix. When possible, executes external | |
6 programs directly (a common use of /bin/sh by Emacs), otherwise | |
7 invokes the user-specified command processor to handle built-in shell | |
8 commands, batch files and interactive mode. | |
9 | |
10 The main function is simply to process the "-c string" option in the | |
11 way /bin/sh does, since the standard Windows command shells use the | |
12 convention that everything after "/c" (the Windows equivalent of | |
13 "-c") is the input string. | |
14 | |
15 This file is part of GNU Emacs. | |
16 | |
17 GNU Emacs is free software; you can redistribute it and/or modify | |
18 it under the terms of the GNU General Public License as published by | |
19 the Free Software Foundation; either version 2, or (at your option) | |
20 any later version. | |
21 | |
22 GNU Emacs is distributed in the hope that it will be useful, | |
23 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
25 GNU General Public License for more details. | |
26 | |
27 You should have received a copy of the GNU General Public License | |
28 along with GNU Emacs; see the file COPYING. If not, write to | |
29 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
30 Boston, MA 02111-1307, USA. */ | |
31 | |
32 #include <windows.h> | |
33 | |
34 #include <stdarg.h> /* va_args */ | |
35 #include <malloc.h> /* alloca */ | |
36 #include <stdlib.h> /* getenv */ | |
37 #include <string.h> /* strlen */ | |
38 | |
39 | |
40 /******* Mock C library routines *********************************/ | |
41 | |
42 /* These routines are used primarily to minimize the executable size. */ | |
43 | |
44 #define stdin GetStdHandle (STD_INPUT_HANDLE) | |
45 #define stdout GetStdHandle (STD_OUTPUT_HANDLE) | |
46 #define stderr GetStdHandle (STD_ERROR_HANDLE) | |
47 | |
48 int | |
49 vfprintf(HANDLE hnd, char * msg, va_list args) | |
50 { | |
51 DWORD bytes_written; | |
52 char buf[1024]; | |
53 | |
54 wvsprintf (buf, msg, args); | |
55 return WriteFile (hnd, buf, strlen (buf), &bytes_written, NULL); | |
56 } | |
57 | |
58 int | |
59 fprintf(HANDLE hnd, char * msg, ...) | |
60 { | |
61 va_list args; | |
62 int rc; | |
63 | |
64 va_start (args, msg); | |
65 rc = vfprintf (hnd, msg, args); | |
66 va_end (args); | |
67 | |
68 return rc; | |
69 } | |
70 | |
71 int | |
72 printf(char * msg, ...) | |
73 { | |
74 va_list args; | |
75 int rc; | |
76 | |
77 va_start (args, msg); | |
78 rc = vfprintf (stdout, msg, args); | |
79 va_end (args); | |
80 | |
81 return rc; | |
82 } | |
83 | |
84 void | |
85 fail (char * msg, ...) | |
86 { | |
87 va_list args; | |
88 | |
89 va_start (args, msg); | |
90 vfprintf (stderr, msg, args); | |
91 va_end (args); | |
92 | |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
93 exit (-1); |
19236 | 94 } |
95 | |
96 void | |
97 warn (char * msg, ...) | |
98 { | |
99 va_list args; | |
100 | |
101 va_start (args, msg); | |
102 vfprintf (stderr, msg, args); | |
103 va_end (args); | |
104 } | |
105 | |
106 /******************************************************************/ | |
107 | |
108 char * | |
109 canon_filename (char *fname) | |
110 { | |
111 char *p = fname; | |
112 | |
113 while (*p) | |
114 { | |
115 if (*p == '/') | |
116 *p = '\\'; | |
117 p++; | |
118 } | |
119 | |
120 return fname; | |
121 } | |
122 | |
123 char * | |
124 skip_space (char *str) | |
125 { | |
126 while (isspace (*str)) str++; | |
127 return str; | |
128 } | |
129 | |
130 char * | |
131 skip_nonspace (char *str) | |
132 { | |
133 while (*str && !isspace (*str)) str++; | |
134 return str; | |
135 } | |
136 | |
137 int escape_char = '\\'; | |
138 | |
139 /* Get next token from input, advancing pointer. */ | |
140 int | |
141 get_next_token (char * buf, char ** pSrc) | |
142 { | |
143 char * p = *pSrc; | |
144 char * o = buf; | |
145 | |
146 p = skip_space (p); | |
147 if (*p == '"') | |
148 { | |
149 int escape_char_run = 0; | |
150 | |
151 /* Go through src until an ending quote is found, unescaping | |
152 quotes along the way. If the escape char is not quote, then do | |
153 special handling of multiple escape chars preceding a quote | |
154 char (ie. the reverse of what Emacs does to escape quotes). */ | |
155 p++; | |
156 while (1) | |
157 { | |
158 if (p[0] == escape_char && escape_char != '"') | |
159 { | |
160 escape_char_run++; | |
36858
f6aff87320dd
(get_next_token): Fix indefinite loop bug scanning
Andrew Innes <andrewi@gnu.org>
parents:
24555
diff
changeset
|
161 p++; |
19236 | 162 continue; |
163 } | |
164 else if (p[0] == '"') | |
165 { | |
166 while (escape_char_run > 1) | |
167 { | |
168 *o++ = escape_char; | |
169 escape_char_run -= 2; | |
170 } | |
171 | |
172 if (escape_char_run > 0) | |
173 { | |
174 /* escaped quote */ | |
175 *o++ = *p++; | |
176 escape_char_run = 0; | |
177 } | |
178 else if (p[1] == escape_char && escape_char == '"') | |
179 { | |
180 /* quote escaped by doubling */ | |
181 *o++ = *p; | |
182 p += 2; | |
183 } | |
184 else | |
185 { | |
186 /* The ending quote. */ | |
187 *o = '\0'; | |
188 /* Leave input pointer after token. */ | |
189 p++; | |
190 break; | |
191 } | |
192 } | |
193 else if (p[0] == '\0') | |
194 { | |
195 /* End of string, but no ending quote found. We might want to | |
196 flag this as an error, but for now will consider the end as | |
197 the end of the token. */ | |
198 *o = '\0'; | |
199 break; | |
200 } | |
201 else | |
202 { | |
203 *o++ = *p++; | |
204 } | |
205 } | |
206 } | |
207 else | |
208 { | |
209 /* Next token is delimited by whitespace. */ | |
210 char * p1 = skip_nonspace (p); | |
211 memcpy (o, p, p1 - p); | |
212 o += (p1 - p); | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
213 *o = '\0'; |
19236 | 214 p = p1; |
215 } | |
216 | |
217 *pSrc = p; | |
218 | |
219 return o - buf; | |
220 } | |
221 | |
222 /* Search for EXEC file in DIR. If EXEC does not have an extension, | |
223 DIR is searched for EXEC with the standard extensions appended. */ | |
224 int | |
225 search_dir (char *dir, char *exec, int bufsize, char *buffer) | |
226 { | |
227 char *exts[] = {".bat", ".cmd", ".exe", ".com"}; | |
228 int n_exts = sizeof (exts) / sizeof (char *); | |
229 char *dummy; | |
230 int i, rc; | |
231 | |
232 /* Search the directory for the program. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
36858
diff
changeset
|
233 for (i = 0; i < n_exts; i++) |
19236 | 234 { |
235 rc = SearchPath (dir, exec, exts[i], bufsize, buffer, &dummy); | |
236 if (rc > 0) | |
237 return rc; | |
238 } | |
239 | |
240 return 0; | |
241 } | |
242 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
36858
diff
changeset
|
243 /* Return the absolute name of executable file PROG, including |
19236 | 244 any file extensions. If an absolute name for PROG cannot be found, |
245 return NULL. */ | |
246 char * | |
247 make_absolute (char *prog) | |
248 { | |
249 char absname[MAX_PATH]; | |
250 char dir[MAX_PATH]; | |
251 char curdir[MAX_PATH]; | |
252 char *p, *fname; | |
253 char *path; | |
254 int i; | |
255 | |
256 /* At least partial absolute path specified; search there. */ | |
257 if ((isalpha (prog[0]) && prog[1] == ':') || | |
258 (prog[0] == '\\')) | |
259 { | |
260 /* Split the directory from the filename. */ | |
261 fname = strrchr (prog, '\\'); | |
262 if (!fname) | |
263 /* Only a drive specifier is given. */ | |
264 fname = prog + 2; | |
265 strncpy (dir, prog, fname - prog); | |
266 dir[fname - prog] = '\0'; | |
267 | |
268 /* Search the directory for the program. */ | |
269 if (search_dir (dir, prog, MAX_PATH, absname) > 0) | |
270 return strdup (absname); | |
271 else | |
272 return NULL; | |
273 } | |
274 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
36858
diff
changeset
|
275 if (GetCurrentDirectory (MAX_PATH, curdir) <= 0) |
19236 | 276 return NULL; |
277 | |
278 /* Relative path; search in current dir. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
36858
diff
changeset
|
279 if (strpbrk (prog, "\\")) |
19236 | 280 { |
281 if (search_dir (curdir, prog, MAX_PATH, absname) > 0) | |
282 return strdup (absname); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
36858
diff
changeset
|
283 else |
19236 | 284 return NULL; |
285 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
36858
diff
changeset
|
286 |
19236 | 287 /* Just filename; search current directory then PATH. */ |
288 path = alloca (strlen (getenv ("PATH")) + strlen (curdir) + 2); | |
289 strcpy (path, curdir); | |
290 strcat (path, ";"); | |
291 strcat (path, getenv ("PATH")); | |
292 | |
293 while (*path) | |
294 { | |
295 /* Get next directory from path. */ | |
296 p = path; | |
297 while (*p && *p != ';') p++; | |
298 strncpy (dir, path, p - path); | |
299 dir[p - path] = '\0'; | |
300 | |
301 /* Search the directory for the program. */ | |
302 if (search_dir (dir, prog, MAX_PATH, absname) > 0) | |
303 return strdup (absname); | |
304 | |
305 /* Move to the next directory. */ | |
306 path = p + 1; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
36858
diff
changeset
|
307 } |
19236 | 308 |
309 return NULL; | |
310 } | |
311 | |
312 /*****************************************************************/ | |
313 | |
314 #if 0 | |
315 char ** _argv; | |
316 int _argc; | |
317 | |
318 /* Parse commandline into argv array, allowing proper quoting of args. */ | |
319 void | |
320 setup_argv (void) | |
321 { | |
322 char * cmdline = GetCommandLine (); | |
323 int arg_bytes = 0; | |
324 | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
36858
diff
changeset
|
325 |
19236 | 326 } |
327 #endif | |
328 | |
329 /* Information about child proc is global, to allow for automatic | |
330 termination when interrupted. At the moment, only one child process | |
331 can be running at any one time. */ | |
332 | |
333 PROCESS_INFORMATION child; | |
334 int interactive = TRUE; | |
335 | |
336 BOOL | |
337 console_event_handler (DWORD event) | |
338 { | |
339 switch (event) | |
340 { | |
341 case CTRL_C_EVENT: | |
342 case CTRL_BREAK_EVENT: | |
343 if (!interactive) | |
344 { | |
345 /* Both command.com and cmd.exe have the annoying behaviour of | |
346 prompting "Terminate batch job (y/n)?" when interrupted | |
347 while running a batch file, even if running in | |
348 non-interactive (-c) mode. Try to make up for this | |
349 deficiency by forcibly terminating the subprocess if | |
350 running non-interactively. */ | |
351 if (child.hProcess && | |
352 WaitForSingleObject (child.hProcess, 500) != WAIT_OBJECT_0) | |
353 TerminateProcess (child.hProcess, 0); | |
354 exit (STATUS_CONTROL_C_EXIT); | |
355 } | |
356 break; | |
357 | |
358 #if 0 | |
359 default: | |
360 /* CLOSE, LOGOFF and SHUTDOWN events - actually we don't get these | |
361 under Windows 95. */ | |
362 fail ("cmdproxy: received %d event\n", event); | |
363 if (child.hProcess) | |
364 TerminateProcess (child.hProcess, 0); | |
365 #endif | |
366 } | |
367 return TRUE; | |
368 } | |
369 | |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
370 /* Change from normal usage; return value indicates whether spawn |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
371 succeeded or failed - program return code is returned separately. */ |
19236 | 372 int |
23947
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
373 spawn (char * progname, char * cmdline, char * dir, int * retcode) |
19236 | 374 { |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
375 BOOL success = FALSE; |
19236 | 376 SECURITY_ATTRIBUTES sec_attrs; |
377 STARTUPINFO start; | |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
378 /* In theory, passing NULL for the environment block to CreateProcess |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
379 is the same as passing the value of GetEnvironmentStrings, but |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
380 doing this explicitly seems to cure problems running DOS programs |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
381 in some cases. */ |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
382 char * envblock = GetEnvironmentStrings (); |
19236 | 383 |
384 sec_attrs.nLength = sizeof (sec_attrs); | |
385 sec_attrs.lpSecurityDescriptor = NULL; | |
386 sec_attrs.bInheritHandle = FALSE; | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
36858
diff
changeset
|
387 |
19236 | 388 memset (&start, 0, sizeof (start)); |
389 start.cb = sizeof (start); | |
390 | |
391 if (CreateProcess (progname, cmdline, &sec_attrs, NULL, TRUE, | |
23947
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
392 0, envblock, dir, &start, &child)) |
19236 | 393 { |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
394 success = TRUE; |
19236 | 395 /* wait for completion and pass on return code */ |
396 WaitForSingleObject (child.hProcess, INFINITE); | |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
397 if (retcode) |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
398 GetExitCodeProcess (child.hProcess, (DWORD *)retcode); |
19236 | 399 CloseHandle (child.hThread); |
400 CloseHandle (child.hProcess); | |
401 child.hProcess = NULL; | |
402 } | |
403 | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
404 FreeEnvironmentStrings (envblock); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
405 |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
406 return success; |
19236 | 407 } |
408 | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
409 /* Return size of current environment block. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
410 int |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
411 get_env_size () |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
412 { |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
413 char * start = GetEnvironmentStrings (); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
414 char * tmp = start; |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
415 |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
416 while (tmp[0] || tmp[1]) |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
417 ++tmp; |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
418 FreeEnvironmentStrings (start); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
419 return tmp + 2 - start; |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
420 } |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
421 |
19236 | 422 /******* Main program ********************************************/ |
423 | |
424 int | |
425 main (int argc, char ** argv) | |
426 { | |
427 int rc; | |
428 int need_shell; | |
429 char * cmdline; | |
430 char * progname; | |
431 int envsize; | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
432 char **pass_through_args; |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
433 int num_pass_through_args; |
19236 | 434 char modname[MAX_PATH]; |
435 char path[MAX_PATH]; | |
23947
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
436 char dir[MAX_PATH]; |
19236 | 437 |
438 | |
439 interactive = TRUE; | |
440 | |
441 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) console_event_handler, TRUE); | |
442 | |
23947
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
443 if (!GetCurrentDirectory (sizeof (dir), dir)) |
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
444 fail ("error: GetCurrentDirectory failed\n"); |
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
445 |
19236 | 446 /* We serve double duty: we can be called either as a proxy for the |
447 real shell (that is, because we are defined to be the user shell), | |
448 or in our role as a helper application for running DOS programs. | |
449 In the former case, we interpret the command line options as if we | |
450 were a Unix shell, but in the latter case we simply pass our | |
451 command line to CreateProcess. We know which case we are dealing | |
452 with by whether argv[0] refers to ourself or to some other program. | |
453 (This relies on an arcane feature of CreateProcess, where we can | |
454 specify cmdproxy as the module to run, but specify a different | |
455 program in the command line - the MSVC startup code sets argv[0] | |
456 from the command line.) */ | |
457 | |
458 if (!GetModuleFileName (NULL, modname, sizeof (modname))) | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
459 fail ("error: GetModuleFileName failed\n"); |
19236 | 460 |
23947
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
461 /* Change directory to location of .exe so startup directory can be |
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
462 deleted. */ |
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
463 progname = strrchr (modname, '\\'); |
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
464 *progname = '\0'; |
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
465 SetCurrentDirectory (modname); |
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
466 *progname = '\\'; |
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
467 |
19236 | 468 /* Although Emacs always sets argv[0] to an absolute pathname, we |
469 might get run in other ways as well, so convert argv[0] to an | |
24516
d519b387b8a9
(main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents:
24439
diff
changeset
|
470 absolute name before comparing to the module name. Don't get |
d519b387b8a9
(main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents:
24439
diff
changeset
|
471 caught out by mixed short and long names. */ |
d519b387b8a9
(main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents:
24439
diff
changeset
|
472 GetShortPathName (modname, modname, sizeof (modname)); |
d519b387b8a9
(main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents:
24439
diff
changeset
|
473 path[0] = '\0'; |
19236 | 474 if (!SearchPath (NULL, argv[0], ".exe", sizeof (path), path, &progname) |
24516
d519b387b8a9
(main): Call GetShortPathName to normalize program
Andrew Innes <andrewi@gnu.org>
parents:
24439
diff
changeset
|
475 || !GetShortPathName (path, path, sizeof (path)) |
19236 | 476 || stricmp (modname, path) != 0) |
477 { | |
478 /* We are being used as a helper to run a DOS app; just pass | |
479 command line to DOS app without change. */ | |
480 /* TODO: fill in progname. */ | |
23947
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
481 if (spawn (NULL, GetCommandLine (), dir, &rc)) |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
482 return rc; |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
483 fail ("Could not run %s\n", GetCommandLine ()); |
19236 | 484 } |
485 | |
486 /* Process command line. If running interactively (-c or /c not | |
487 specified) then spawn a real command shell, passing it the command | |
488 line arguments. | |
489 | |
490 If not running interactively, then attempt to execute the specified | |
491 command directly. If necessary, spawn a real shell to execute the | |
492 command. | |
493 | |
494 */ | |
495 | |
496 progname = NULL; | |
497 cmdline = NULL; | |
498 /* If no args, spawn real shell for interactive use. */ | |
499 need_shell = TRUE; | |
500 interactive = TRUE; | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
501 /* Ask command.com to create an environment block with a reasonable |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
502 amount of free space. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
503 envsize = get_env_size () + 300; |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
504 pass_through_args = (char **) alloca (argc * sizeof(char *)); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
505 num_pass_through_args = 0; |
19236 | 506 |
507 while (--argc > 0) | |
508 { | |
509 ++argv; | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
510 /* Act on switches we recognize (mostly single letter switches, |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
511 except for -e); all unrecognised switches and extra args are |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
512 passed on to real shell if used (only really of benefit for |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
513 interactive use, but allow for batch use as well). Accept / as |
19236 | 514 switch char for compatability with cmd.exe. */ |
23374
0110032de8b3
(main): Treat command line options as case-insensitive.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21733
diff
changeset
|
515 if (((*argv)[0] == '-' || (*argv)[0] == '/') && (*argv)[1] != '\0') |
19236 | 516 { |
23374
0110032de8b3
(main): Treat command line options as case-insensitive.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21733
diff
changeset
|
517 if (((*argv)[1] == 'c' || (*argv)[1] == 'C') && ((*argv)[2] == '\0')) |
19236 | 518 { |
519 if (--argc == 0) | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
520 fail ("error: expecting arg for %s\n", *argv); |
19236 | 521 cmdline = *(++argv); |
522 interactive = FALSE; | |
523 } | |
23374
0110032de8b3
(main): Treat command line options as case-insensitive.
Geoff Voelker <voelker@cs.washington.edu>
parents:
21733
diff
changeset
|
524 else if (((*argv)[1] == 'i' || (*argv)[1] == 'I') && ((*argv)[2] == '\0')) |
19236 | 525 { |
526 if (cmdline) | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
527 warn ("warning: %s ignored because of -c\n", *argv); |
19236 | 528 } |
24555
2bf5c4b2cc5a
cmdproxy.c (main): Fix parens.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24516
diff
changeset
|
529 else if (((*argv)[1] == 'e' || (*argv)[1] == 'E') && ((*argv)[2] == ':')) |
19236 | 530 { |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
531 int requested_envsize = atoi (*argv + 3); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
532 /* Enforce a reasonable minimum size, as above. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
533 if (requested_envsize > envsize) |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
534 envsize = requested_envsize; |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
535 /* For sanity, enforce a reasonable maximum. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
536 if (envsize > 32768) |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
537 envsize = 32768; |
19236 | 538 } |
539 else | |
540 { | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
541 /* warn ("warning: unknown option %s ignored", *argv); */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
542 pass_through_args[num_pass_through_args++] = *argv; |
19236 | 543 } |
544 } | |
545 else | |
546 break; | |
547 } | |
548 | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
549 #if 0 |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
550 /* I think this is probably not useful - cmd.exe ignores extra |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
551 (non-switch) args in interactive mode, and they cannot be passed on |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
552 when -c was given. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
553 |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
554 /* Collect any remaining args after (initial) switches. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
555 while (argc-- > 0) |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
556 { |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
557 pass_through_args[num_pass_through_args++] = *argv++; |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
558 } |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
559 #else |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
560 /* Probably a mistake for there to be extra args; not fatal. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
561 if (argc > 0) |
21733
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
562 warn ("warning: extra args ignored after '%s'\n", argv[-1]); |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
563 #endif |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
564 |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
565 pass_through_args[num_pass_through_args] = NULL; |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
566 |
19236 | 567 /* If -c option, determine if we must spawn a real shell, or if we can |
568 execute the command directly ourself. */ | |
569 if (cmdline) | |
570 { | |
571 /* If no redirection or piping, and if program can be found, then | |
572 run program directly. Otherwise invoke a real shell. */ | |
573 | |
574 static char copout_chars[] = "|<>&"; | |
575 | |
576 if (strpbrk (cmdline, copout_chars) == NULL) | |
577 { | |
578 char *args; | |
579 | |
580 /* The program name is the first token of cmdline. Since | |
581 filenames cannot legally contain embedded quotes, the value | |
582 of escape_char doesn't matter. */ | |
583 args = cmdline; | |
584 if (!get_next_token (path, &args)) | |
585 fail ("error: no program name specified.\n"); | |
586 | |
587 canon_filename (path); | |
588 progname = make_absolute (path); | |
589 | |
590 /* If we found the program, run it directly (if not found it | |
591 might be an internal shell command, so don't fail). */ | |
592 if (progname != NULL) | |
593 need_shell = FALSE; | |
594 } | |
595 } | |
596 | |
21733
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
597 pass_to_shell: |
19236 | 598 if (need_shell) |
599 { | |
600 char * p; | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
601 int extra_arg_space = 0; |
23683
cb300ad44b55
(main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents:
23374
diff
changeset
|
602 int run_command_dot_com; |
19236 | 603 |
604 progname = getenv ("COMSPEC"); | |
605 if (!progname) | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
606 fail ("error: COMSPEC is not set\n"); |
19236 | 607 |
608 canon_filename (progname); | |
609 progname = make_absolute (progname); | |
610 | |
611 if (progname == NULL || strchr (progname, '\\') == NULL) | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
612 fail ("error: the program %s could not be found.\n", getenv ("COMSPEC")); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
613 |
23683
cb300ad44b55
(main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents:
23374
diff
changeset
|
614 /* Need to set environment size when running command.com. */ |
cb300ad44b55
(main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents:
23374
diff
changeset
|
615 run_command_dot_com = |
cb300ad44b55
(main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents:
23374
diff
changeset
|
616 (stricmp (strrchr (progname, '\\'), "command.com") == 0); |
cb300ad44b55
(main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents:
23374
diff
changeset
|
617 |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
618 /* Work out how much extra space is required for |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
619 pass_through_args. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
620 for (argv = pass_through_args; *argv != NULL; ++argv) |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
621 /* We don't expect to have to quote switches. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
622 extra_arg_space += strlen (*argv) + 2; |
19236 | 623 |
624 if (cmdline) | |
625 { | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
626 char * buf; |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
627 |
19236 | 628 /* Convert to syntax expected by cmd.exe/command.com for |
629 running non-interactively. Always quote program name in | |
630 case path contains spaces (fortunately it can't contain | |
631 quotes, since they are illegal in path names). */ | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
632 |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
633 buf = p = alloca (strlen (progname) + extra_arg_space + |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
634 strlen (cmdline) + 16); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
635 |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
636 /* Quote progname in case it contains spaces. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
637 p += wsprintf (p, "\"%s\"", progname); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
638 |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
639 /* Include pass_through_args verbatim; these are just switches |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
640 so should not need quoting. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
641 for (argv = pass_through_args; *argv != NULL; ++argv) |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
642 p += wsprintf (p, " %s", *argv); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
643 |
23683
cb300ad44b55
(main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents:
23374
diff
changeset
|
644 if (run_command_dot_com) |
21733
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
645 wsprintf(p, " /e:%d /c %s", envsize, cmdline); |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
646 else |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
647 wsprintf(p, " /c %s", cmdline); |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
648 cmdline = buf; |
19236 | 649 } |
650 else | |
651 { | |
23683
cb300ad44b55
(main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents:
23374
diff
changeset
|
652 if (run_command_dot_com) |
21733
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
653 { |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
654 /* Provide dir arg expected by command.com when first |
23683
cb300ad44b55
(main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents:
23374
diff
changeset
|
655 started interactively (the "command search path"). To |
21733
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
656 avoid potential problems with spaces in command dir |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
657 (which cannot be quoted - command.com doesn't like it), |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
658 we always use the 8.3 form. */ |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
659 GetShortPathName (progname, path, sizeof (path)); |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
660 p = strrchr (path, '\\'); |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
661 /* Trailing slash is acceptable, so always leave it. */ |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
662 *(++p) = '\0'; |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
663 } |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
664 else |
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
665 path[0] = '\0'; |
19236 | 666 |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
667 cmdline = p = alloca (strlen (progname) + extra_arg_space + |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
668 strlen (path) + 13); |
19236 | 669 |
670 /* Quote progname in case it contains spaces. */ | |
19718
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
671 p += wsprintf (p, "\"%s\" %s", progname, path); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
672 |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
673 /* Include pass_through_args verbatim; these are just switches |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
674 so should not need quoting. */ |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
675 for (argv = pass_through_args; *argv != NULL; ++argv) |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
676 p += wsprintf (p, " %s", *argv); |
f645084cc96c
(get_env_size): New function.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19236
diff
changeset
|
677 |
23683
cb300ad44b55
(main): Set environment size only when running
Geoff Voelker <voelker@cs.washington.edu>
parents:
23374
diff
changeset
|
678 if (run_command_dot_com) |
21733
a373669e1196
(main): Only set environment size for real shell, and
Geoff Voelker <voelker@cs.washington.edu>
parents:
21598
diff
changeset
|
679 wsprintf (p, " /e:%d", envsize); |
19236 | 680 } |
681 } | |
682 | |
683 if (!progname) | |
684 fail ("Internal error: program name not defined\n"); | |
685 | |
686 if (!cmdline) | |
687 cmdline = progname; | |
688 | |
23947
f01d27883cb1
(spawn): Pass directory for child as parameter.
Andrew Innes <andrewi@gnu.org>
parents:
23683
diff
changeset
|
689 if (spawn (progname, cmdline, dir, &rc)) |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
690 return rc; |
19236 | 691 |
21598
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
692 if (!need_shell) |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
693 { |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
694 need_shell = TRUE; |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
695 goto pass_to_shell; |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
696 } |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
697 |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
698 fail ("Could not run %s\n", progname); |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
699 |
235f717e6916
(fail): Exit with a negative return value.
Geoff Voelker <voelker@cs.washington.edu>
parents:
19718
diff
changeset
|
700 return 0; |
19236 | 701 } |