summaryrefslogtreecommitdiff
path: root/nt/cmdproxy.c
diff options
context:
space:
mode:
authorAndrew Innes <andrewi@gnu.org>1998-12-28 19:25:28 +0000
committerAndrew Innes <andrewi@gnu.org>1998-12-28 19:25:28 +0000
commitd78e84f792e68c4db0e775a977c70e09871d23e1 (patch)
tree9264a9d7d8c8b8aee122233cbcf4a952c5fc4f01 /nt/cmdproxy.c
parent9d52160a5c4cbeb9486b7bba1faeaedadf6d75a0 (diff)
downloademacs-d78e84f792e68c4db0e775a977c70e09871d23e1.tar.gz
(spawn): Pass directory for child as parameter.
(main): Save startup directory to give to spawn, then change directory to location of .exe in order not to prevent startup directory from being deleted.
Diffstat (limited to 'nt/cmdproxy.c')
-rw-r--r--nt/cmdproxy.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/nt/cmdproxy.c b/nt/cmdproxy.c
index ce72ba129c9..0ca57abb5ca 100644
--- a/nt/cmdproxy.c
+++ b/nt/cmdproxy.c
@@ -369,7 +369,7 @@ console_event_handler (DWORD event)
/* Change from normal usage; return value indicates whether spawn
succeeded or failed - program return code is returned separately. */
int
-spawn (char * progname, char * cmdline, int * retcode)
+spawn (char * progname, char * cmdline, char * dir, int * retcode)
{
BOOL success = FALSE;
SECURITY_ATTRIBUTES sec_attrs;
@@ -388,7 +388,7 @@ spawn (char * progname, char * cmdline, int * retcode)
start.cb = sizeof (start);
if (CreateProcess (progname, cmdline, &sec_attrs, NULL, TRUE,
- 0, envblock, NULL, &start, &child))
+ 0, envblock, dir, &start, &child))
{
success = TRUE;
/* wait for completion and pass on return code */
@@ -432,12 +432,16 @@ main (int argc, char ** argv)
int num_pass_through_args;
char modname[MAX_PATH];
char path[MAX_PATH];
+ char dir[MAX_PATH];
interactive = TRUE;
SetConsoleCtrlHandler ((PHANDLER_ROUTINE) console_event_handler, TRUE);
+ if (!GetCurrentDirectory (sizeof (dir), dir))
+ fail ("error: GetCurrentDirectory failed\n");
+
/* We serve double duty: we can be called either as a proxy for the
real shell (that is, because we are defined to be the user shell),
or in our role as a helper application for running DOS programs.
@@ -453,6 +457,13 @@ main (int argc, char ** argv)
if (!GetModuleFileName (NULL, modname, sizeof (modname)))
fail ("error: GetModuleFileName failed\n");
+ /* Change directory to location of .exe so startup directory can be
+ deleted. */
+ progname = strrchr (modname, '\\');
+ *progname = '\0';
+ SetCurrentDirectory (modname);
+ *progname = '\\';
+
/* Although Emacs always sets argv[0] to an absolute pathname, we
might get run in other ways as well, so convert argv[0] to an
absolute name before comparing to the module name. */
@@ -462,7 +473,7 @@ 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. */
- if (spawn (NULL, GetCommandLine (), &rc))
+ if (spawn (NULL, GetCommandLine (), dir, &rc))
return rc;
fail ("Could not run %s\n", GetCommandLine ());
}
@@ -670,7 +681,7 @@ main (int argc, char ** argv)
if (!cmdline)
cmdline = progname;
- if (spawn (progname, cmdline, &rc))
+ if (spawn (progname, cmdline, dir, &rc))
return rc;
if (!need_shell)