gl_cv_func_symlink_works=yes
ac_cv_func_readlinkat=yes
ac_cv_func_faccessat=yes
+# Avoid compiling Gnulib's canonicalize-lgpl.c, which fails
+ac_cv_func_canonicalize_file_name=yes
+ac_cv_func_realpath="not-needed"
+gl_cv_func_realpath_works="no-but-not-needed-so-yes"
# Implemented in w32.c
ac_cv_func_fcntl=yes
gl_cv_func_fcntl_f_dupfd_cloexec=yes
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
out:
free (candidate);
return result;
+#endif /* !WINDOWSNT */
}
static enum pdumper_load_result
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)
{
+ 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,
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
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 **);