From aec18585f04e9410cc3c965b1e33e8b5b056e018 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 3 Sep 2007 22:17:27 +0000 Subject: [PATCH] * 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. --- gdb/gdbserver/ChangeLog | 8 ++++ gdb/gdbserver/win32-low.c | 94 ++++++++++++++++++++++++--------------- 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,3 +1,11 @@ +2007-09-03 Pedro Alves + + * 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 * win32-low.c (handle_load_dll): Don't use toolhelp when waiting. 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)); } -- 2.39.2