Support invoking Emacs via a symlink on MS-Windows
* src/w32.c (w32_my_exename): Resolve symlinks in the executable name, to support searching for the pdumper file when the executable is found via a symlink. * src/emacs.c (load_pdump): Add a comment about symlink resolution on Windows.
This commit is contained in:
parent
d4a0e41829
commit
e35708b454
2 changed files with 22 additions and 4 deletions
|
@ -868,6 +868,8 @@ load_pdump (int argc, char **argv)
|
|||
if (exename)
|
||||
{
|
||||
#ifdef WINDOWSNT
|
||||
/* w32_my_exename resolves symlinks internally, so no need to
|
||||
call realpath. */
|
||||
real_exename = exename;
|
||||
exename = NULL;
|
||||
#else
|
||||
|
|
24
src/w32.c
24
src/w32.c
|
@ -9988,18 +9988,34 @@ w32_relocate (const char *epath_dir)
|
|||
return epath_dir;
|
||||
}
|
||||
|
||||
/* Return the full absolute name of the running executable.
|
||||
/* Return the full absolute name of the running executable. If the
|
||||
executable is a symlink, resolve it.
|
||||
|
||||
Note: this function is called early during startup, when Unicode
|
||||
file name are not yet supported. */
|
||||
file names are not yet supported. Thus the result must be an
|
||||
ANSI-encoded string. */
|
||||
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. */
|
||||
/* The caller expects us to resolve all possible symlinks in the
|
||||
last component of exename, i.e. if the executable itself is a
|
||||
symlink to a file in another directory. */
|
||||
if (get_volume_info (exename, NULL)
|
||||
&& (volume_info.flags & FILE_SUPPORTS_REPARSE_POINTS) != 0)
|
||||
{
|
||||
/* chase_symlinks wants its argument in UTF-8. */
|
||||
char exename_utf8[MAX_UTF8_PATH];
|
||||
filename_from_ansi (exename, exename_utf8);
|
||||
|
||||
/* If EXENAME is a symlink, replace it with its target. */
|
||||
char *tgt = chase_symlinks (exename_utf8);
|
||||
if (tgt != exename_utf8)
|
||||
filename_to_ansi (tgt, exename);
|
||||
}
|
||||
|
||||
return exename;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue