summaryrefslogtreecommitdiff
path: root/nt/cmdproxy.c
diff options
context:
space:
mode:
authorGeoff Voelker <voelker@cs.washington.edu>1998-04-17 05:04:21 +0000
committerGeoff Voelker <voelker@cs.washington.edu>1998-04-17 05:04:21 +0000
commitbc0a3a2817ffa8eb9fc59ad0b96acbb66e2a4888 (patch)
tree46e8fd743f00d7dff4f39eb2a5b561e51fb40214 /nt/cmdproxy.c
parent752f4c76707a38982852c4dd2aa5a72a40f5887c (diff)
downloademacs-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.c36
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;
}