diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/emacs.c | 26 | ||||
| -rw-r--r-- | src/w32.c | 15 | ||||
| -rw-r--r-- | src/w32.h | 1 |
3 files changed, 41 insertions, 1 deletions
diff --git a/src/emacs.c b/src/emacs.c index a26eacbe786..1ddd10b8051 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -715,6 +715,24 @@ static enum pdumper_load_result load_pdump_find_executable (const char* argv0, char **exename) { enum pdumper_load_result result; +#ifdef WINDOWSNT + result = PDUMPER_LOAD_ERROR; + *exename = NULL; + char *prog_fname = w32_my_exename (); + if (prog_fname) + { + result = PDUMPER_LOAD_OOM; + /* Use xstrdup, so as to call our private implementation of + malloc, since the caller calls our free. */ + char *ret = xstrdup (prog_fname); + if (ret) + { + *exename = ret; + result = PDUMPER_LOAD_SUCCESS; + } + } + return result; +#else /* !WINDOWSNT */ char *candidate = NULL; /* If the executable name contains a slash, we have some kind of @@ -784,6 +802,7 @@ load_pdump_find_executable (const char* argv0, char **exename) out: free (candidate); return result; +#endif /* !WINDOWSNT */ } static enum pdumper_load_result @@ -848,10 +867,15 @@ load_pdump (int argc, char **argv) the dump in the hardcoded location. */ if (exename) { +#ifdef WINDOWSNT + real_exename = exename; + exename = NULL; +#else real_exename = realpath (exename, NULL); if (!real_exename) fatal ("could not resolve realpath of \"%s\": %s", exename, strerror (errno)); +#endif size_t real_exename_length = strlen (real_exename); if (strip_suffix) { @@ -920,7 +944,7 @@ load_pdump (int argc, char **argv) + strlen (suffix) + 1); #ifdef DOS_NT - argv0_len = strlen (argv0_base); + size_t argv0_len = strlen (argv0_base); if (argv0_len >= 4 && c_strcasecmp (argv0_base + argv0_len - 4, ".exe") == 0) sprintf (dump_file, "%s%c%.*s%s", path_exec, DIRECTORY_SEP, diff --git a/src/w32.c b/src/w32.c index 833ff4c7e4a..b2d1ffcf82b 100644 --- a/src/w32.c +++ b/src/w32.c @@ -9988,6 +9988,21 @@ w32_relocate (const char *epath_dir) return epath_dir; } +/* Return the full absolute name of the running executable. + + Note: this function is called early during startup, when Unicode + file name are not yet supported. */ +char * +w32_my_exename (void) +{ + static char exename[MAX_PATH]; + if (!GetModuleFileNameA (NULL, exename, MAX_PATH)) + return NULL; + /* FIXME: Resolve possible symlinks in the last component of + exename, i.e. if the executable itself is a symlink. */ + return exename; +} + /* globals_of_w32 is used to initialize those global variables that must always be initialized on startup even when the global variable diff --git a/src/w32.h b/src/w32.h index 3790583bfc8..3ef78ecdee2 100644 --- a/src/w32.h +++ b/src/w32.h @@ -185,6 +185,7 @@ extern MultiByteToWideChar_Proc pMultiByteToWideChar; extern WideCharToMultiByte_Proc pWideCharToMultiByte; extern DWORD multiByteToWideCharFlags; +extern char *w32_my_exename (void); extern const char *w32_relocate (const char *); extern void init_environment (char **); |
