From 23b672f83cd233aa9fcd45851460fea3ec6e6bc7 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Wed, 13 Jan 2010 19:36:41 +0000 Subject: [PATCH] Query the cygdrive prefix only if the cygwin mount command is available. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@33014 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/support/os_win32.cpp | 75 ++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/src/support/os_win32.cpp b/src/support/os_win32.cpp index 61ec17cb9a..d3ec20dffd 100644 --- a/src/support/os_win32.cpp +++ b/src/support/os_win32.cpp @@ -154,40 +154,47 @@ void init(int /* argc */, char * argv[]) * lyx is invoked as a parameter of hidecmd.exe. */ - // If Cygwin is detected, query the cygdrive prefix - HKEY regKey; - LONG retVal; - - // Check for Cygwin 1.7 or later - retVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - "Software\\Cygwin\\setup", - 0, KEY_QUERY_VALUE, ®Key); - if (retVal != ERROR_SUCCESS) - retVal = RegOpenKeyEx(HKEY_CURRENT_USER, - "Software\\Cygwin\\setup", - 0, KEY_QUERY_VALUE, ®Key); - - // Check for older Cygwin versions - if (retVal != ERROR_SUCCESS) - retVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, - "Software\\Cygnus Solutions\\Cygwin\\mounts v2", - 0, KEY_QUERY_VALUE, ®Key); - if (retVal != ERROR_SUCCESS) - retVal = RegOpenKeyEx(HKEY_CURRENT_USER, - "Software\\Cygnus Solutions\\Cygwin\\mounts v2", - 0, KEY_QUERY_VALUE, ®Key); - - if (retVal == ERROR_SUCCESS) { - RegCloseKey(regKey); - cmd_ret const p = runCommand("mount --show-cygdrive-prefix"); - // The output of the mount command is as follows: - // Prefix Type Flags - // /cygdrive system binmode - // So, we use the inner split to pass the second line to the - // outer split which sets cygdrive with its contents until - // the first blank, discarding the unneeded return value. - if (p.first != -1 && prefixIs(p.second, "Prefix")) - split(split(p.second, '\n'), cygdrive, ' '); + // If Cygwin is detected, query the cygdrive prefix. + // The cygdrive prefix is needed for translating windows style paths + // to posix style paths in LaTeX files when the Cygwin teTeX is used. + int i; + HKEY hkey; + char buf[MAX_PATH]; + DWORD bufsize = sizeof(buf); + LONG retval = ERROR_FILE_NOT_FOUND; + HKEY const mainkey[2] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER }; + char const * const subkey[2] = { + "Software\\Cygwin\\setup", // Cygwin 1.7 + "Software\\Cygnus Solutions\\Cygwin\\mounts v2\\/" // Prev. ver. + }; + char const * const valuename[2] = { + "rootdir", // Cygwin 1.7 or later + "native" // Previous versions + }; + // Check for newer Cygwin versions first, then older ones + for (i = 0; i < 2 && retval != ERROR_SUCCESS; ++i) { + for (int k = 0; k < 2 && retval != ERROR_SUCCESS; ++k) + retval = RegOpenKey(mainkey[k], subkey[i], &hkey); + } + if (retval == ERROR_SUCCESS) { + // Query the Cygwin root directory + retval = RegQueryValueEx(hkey, valuename[i - 1], + NULL, NULL, (LPBYTE) buf, &bufsize); + RegCloseKey(hkey); + string const mount = string(buf) + "\\bin\\mount.exe"; + if (retval == ERROR_SUCCESS && FileName(mount).exists()) { + cmd_ret const p = + runCommand(mount + " --show-cygdrive-prefix"); + // The output of the mount command is as follows: + // Prefix Type Flags + // /cygdrive system binmode + // So, we use the inner split to pass the second line + // to the outer split which sets cygdrive with its + // contents until the first blank, discarding the + // unneeded return value. + if (p.first != -1 && prefixIs(p.second, "Prefix")) + split(split(p.second, '\n'), cygdrive, ' '); + } } // Catch shutdown events. -- 2.39.2