diff options
author | Geoff Voelker <voelker@cs.washington.edu> | 1998-04-17 05:04:21 +0000 |
---|---|---|
committer | Geoff Voelker <voelker@cs.washington.edu> | 1998-04-17 05:04:21 +0000 |
commit | bc0a3a2817ffa8eb9fc59ad0b96acbb66e2a4888 (patch) | |
tree | 46e8fd743f00d7dff4f39eb2a5b561e51fb40214 /nt/cmdproxy.c | |
parent | 752f4c76707a38982852c4dd2aa5a72a40f5887c (diff) | |
download | emacs-bc0a3a2817ffa8eb9fc59ad0b96acbb66e2a4888.tar.gz |
(fail): Exit with a negative return value.
(spawn): Return subprocess return code as an argument.
Explicitly copy environment block.
(main): Update to use return value argument with spawn.
Retry if spawn failed when a subshell was not tried.
Diffstat (limited to 'nt/cmdproxy.c')
-rw-r--r-- | nt/cmdproxy.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/nt/cmdproxy.c b/nt/cmdproxy.c index 18705af47f5..64eae8d286a 100644 --- a/nt/cmdproxy.c +++ b/nt/cmdproxy.c @@ -90,7 +90,7 @@ fail (char * msg, ...) vfprintf (stderr, msg, args); va_end (args); - exit (1); + exit (-1); } void @@ -366,12 +366,18 @@ console_event_handler (DWORD event) return TRUE; } +/* Change from normal usage; return value indicates whether spawn + succeeded or failed - program return code is returned separately. */ int -spawn (char * progname, char * cmdline) +spawn (char * progname, char * cmdline, int * retcode) { - DWORD rc = 0xff; + BOOL success = FALSE; SECURITY_ATTRIBUTES sec_attrs; STARTUPINFO start; + /* In theory, passing NULL for the environment block to CreateProcess + is the same as passing the value of GetEnvironmentStrings, but + doing this explicitly seems to cure problems running DOS programs + in some cases. */ char * envblock = GetEnvironmentStrings (); sec_attrs.nLength = sizeof (sec_attrs); @@ -384,9 +390,11 @@ spawn (char * progname, char * cmdline) if (CreateProcess (progname, cmdline, &sec_attrs, NULL, TRUE, 0, envblock, NULL, &start, &child)) { + success = TRUE; /* wait for completion and pass on return code */ WaitForSingleObject (child.hProcess, INFINITE); - GetExitCodeProcess (child.hProcess, &rc); + if (retcode) + GetExitCodeProcess (child.hProcess, (DWORD *)retcode); CloseHandle (child.hThread); CloseHandle (child.hProcess); child.hProcess = NULL; @@ -394,7 +402,7 @@ spawn (char * progname, char * cmdline) FreeEnvironmentStrings (envblock); - return (int) rc; + return success; } /* Return size of current environment block. */ @@ -454,7 +462,9 @@ main (int argc, char ** argv) /* We are being used as a helper to run a DOS app; just pass command line to DOS app without change. */ /* TODO: fill in progname. */ - return spawn (NULL, GetCommandLine ()); + if (spawn (NULL, GetCommandLine (), &rc)) + return rc; + fail ("Could not run %s\n", GetCommandLine ()); } /* Process command line. If running interactively (-c or /c not @@ -568,6 +578,7 @@ main (int argc, char ** argv) } } +pass_to_shell: if (need_shell) { char * p; @@ -649,7 +660,16 @@ main (int argc, char ** argv) if (!cmdline) cmdline = progname; - rc = spawn (progname, cmdline); + if (spawn (progname, cmdline, &rc)) + return rc; - return rc; + if (!need_shell) + { + need_shell = TRUE; + goto pass_to_shell; + } + + fail ("Could not run %s\n", progname); + + return 0; } |