summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2007-09-03 22:17:27 +0000
committerPedro Alves <palves@redhat.com>2007-09-03 22:17:27 +0000
commitaec18585f04e9410cc3c965b1e33e8b5b056e018 (patch)
treeb6a7a7c2ebdc3fcce353957083c3bd314320886b
parent26669a276811c6d2836868651a28d802503ab987 (diff)
downloadbinutils-gdb-aec18585f04e9410cc3c965b1e33e8b5b056e018.tar.gz
* win32-low.c (create_process): New.
(win32_create_inferior): Use create_process instead of CreateProcess. If create_process failed retry appending an ".exe" suffix. Store the GetLastError result immediatelly after create_process calls and use it on the call to error.
-rw-r--r--gdb/gdbserver/ChangeLog8
-rw-r--r--gdb/gdbserver/win32-low.c94
2 files changed, 67 insertions, 35 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 2313e28216b..0b5d751fef3 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,13 @@
2007-09-03 Pedro Alves <pedro_alves@portugalmail.pt>
+ * win32-low.c (create_process): New.
+ (win32_create_inferior): Use create_process instead of
+ CreateProcess. If create_process failed retry appending an ".exe"
+ suffix. Store the GetLastError result immediatelly after
+ create_process calls and use it on the call to error.
+
+2007-09-03 Pedro Alves <pedro_alves@portugalmail.pt>
+
* win32-low.c (handle_load_dll): Don't use toolhelp when waiting.
2007-08-23 Joel Brobecker <brobecker@adacore.com>
diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c
index 755f816a506..1d3c61766d6 100644
--- a/gdb/gdbserver/win32-low.c
+++ b/gdb/gdbserver/win32-low.c
@@ -373,6 +373,55 @@ strwinerror (DWORD error)
return buf;
}
+static BOOL
+create_process (const char *program, char *args,
+ DWORD flags, PROCESS_INFORMATION *pi)
+{
+ BOOL ret;
+
+#ifdef _WIN32_WCE
+ wchar_t *p, *wprogram, *wargs;
+ size_t argslen;
+
+ wprogram = alloca ((strlen (program) + 1) * sizeof (wchar_t));
+ mbstowcs (wprogram, program, strlen (program) + 1);
+
+ for (p = wprogram; *p; ++p)
+ if (L'/' == *p)
+ *p = L'\\';
+
+ argslen = strlen (args);
+ wargs = alloca ((argslen + 1) * sizeof (wchar_t));
+ mbstowcs (wargs, args, argslen + 1);
+
+ ret = CreateProcessW (wprogram, /* image name */
+ wargs, /* command line */
+ NULL, /* security, not supported */
+ NULL, /* thread, not supported */
+ FALSE, /* inherit handles, not supported */
+ flags, /* start flags */
+ NULL, /* environment, not supported */
+ NULL, /* current directory, not supported */
+ NULL, /* start info, not supported */
+ pi); /* proc info */
+#else
+ STARTUPINFOA si = { sizeof (STARTUPINFOA) };
+
+ ret = CreateProcessA (program, /* image name */
+ args, /* command line */
+ NULL, /* security */
+ NULL, /* thread */
+ TRUE, /* inherit handles */
+ flags, /* start flags */
+ NULL, /* environment */
+ NULL, /* current directory */
+ &si, /* start info */
+ pi); /* proc info */
+#endif
+
+ return ret;
+}
+
/* Start a new process.
PROGRAM is a path to the program to execute.
ARGS is a standard NULL-terminated array of arguments,
@@ -392,12 +441,7 @@ win32_create_inferior (char *program, char **program_args)
int argslen;
int argc;
PROCESS_INFORMATION pi;
-#ifndef __MINGW32CE__
- STARTUPINFOA si = { sizeof (STARTUPINFOA) };
- char *winenv = NULL;
-#else
- wchar_t *wargs, *wprogram;
-#endif
+ DWORD err;
if (!program)
error ("No executable specified, specify executable to debug.\n");
@@ -437,34 +481,15 @@ win32_create_inferior (char *program, char **program_args)
flags |= CREATE_NEW_PROCESS_GROUP;
#endif
-#ifdef __MINGW32CE__
- to_back_slashes (program);
- wargs = alloca (argslen * sizeof (wchar_t));
- mbstowcs (wargs, args, argslen);
- wprogram = alloca ((strlen (program) + 1) * sizeof (wchar_t));
- mbstowcs (wprogram, program, strlen (program) + 1);
- ret = CreateProcessW (wprogram, /* image name */
- wargs, /* command line */
- NULL, /* security, not supported */
- NULL, /* thread, not supported */
- FALSE, /* inherit handles, not supported */
- flags, /* start flags */
- NULL, /* environment, not supported */
- NULL, /* current directory, not supported */
- NULL, /* start info, not supported */
- &pi); /* proc info */
-#else
- ret = CreateProcessA (program, /* image name */
- args, /* command line */
- NULL, /* security */
- NULL, /* thread */
- TRUE, /* inherit handles */
- flags, /* start flags */
- winenv, /* environment */
- NULL, /* current directory */
- &si, /* start info */
- &pi); /* proc info */
-#endif
+ ret = create_process (program, args, flags, &pi);
+ err = GetLastError ();
+ if (!ret && err == ERROR_FILE_NOT_FOUND)
+ {
+ char *exename = alloca (strlen (program) + 5);
+ strcat (strcpy (exename, program), ".exe");
+ ret = create_process (exename, args, flags, &pi);
+ err = GetLastError ();
+ }
#ifndef USE_WIN32API
if (orig_path)
@@ -473,7 +498,6 @@ win32_create_inferior (char *program, char **program_args)
if (!ret)
{
- DWORD err = GetLastError ();
error ("Error creating process \"%s%s\", (error %d): %s\n",
program, args, (int) err, strwinerror (err));
}