diff options
author | Eli Zaretskii <eliz@gnu.org> | 2019-06-26 19:23:34 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2019-06-26 19:23:34 +0300 |
commit | e35708b454259425d1a3eda7b0e2f6cf559529ce (patch) | |
tree | ab7070ae4ca485d2765c910bd460cca84c148cfa /src/w32.c | |
parent | d4a0e41829e59a0067461dc066dbfb945f2fe462 (diff) | |
download | emacs-e35708b454259425d1a3eda7b0e2f6cf559529ce.tar.gz |
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.
Diffstat (limited to 'src/w32.c')
-rw-r--r-- | src/w32.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/w32.c b/src/w32.c index b2d1ffcf82b..36a5a37496e 100644 --- a/src/w32.c +++ b/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; } |