diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2009-10-15 11:40:02 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2009-10-15 11:40:02 +0000 |
commit | 175e39bb7f7aefab3a315427b564faf1f0b33173 (patch) | |
tree | b12d06eb703f768b1cfe0f4c12b9532ae181b4e2 /winsup/utils/cygpath.cc | |
parent | e710872955b83d7acd84c5d2a6b8d945a621af1e (diff) | |
download | newlib-175e39bb7f7aefab3a315427b564faf1f0b33173.zip newlib-175e39bb7f7aefab3a315427b564faf1f0b33173.tar.gz newlib-175e39bb7f7aefab3a315427b564faf1f0b33173.tar.bz2 |
* cygpath.cc (get_special_folder): Fetch path as WCHAR and convert
using my_wcstombs.
(get_user_folder): Remove.
(do_sysfolders): Use get_special_folder instead of get_user_folder.
Fetch system paths as WCHAR and convert using my_wcstombs.
Diffstat (limited to 'winsup/utils/cygpath.cc')
-rw-r--r-- | winsup/utils/cygpath.cc | 61 |
1 files changed, 36 insertions, 25 deletions
diff --git a/winsup/utils/cygpath.cc b/winsup/utils/cygpath.cc index a267181..83d4e3f 100644 --- a/winsup/utils/cygpath.cc +++ b/winsup/utils/cygpath.cc @@ -558,45 +558,46 @@ get_mixed_name (const char* filename) static bool get_special_folder (char* path, int id) { - path[0] = 0; + WCHAR wpath[MAX_PATH]; + + path[0] = '\0'; + wpath[0] = L'\0'; LPITEMIDLIST pidl = 0; if (SHGetSpecialFolderLocation (NULL, id, &pidl) != S_OK) return false; - if (!SHGetPathFromIDList (pidl, path) || !path[0]) + if (!SHGetPathFromIDListW (pidl, wpath) || !wpath[0]) return false; + my_wcstombs (path, wpath, PATH_MAX); return true; } static void -get_user_folder (char* path, int id, int allid) -{ - get_special_folder (path, allusers_flag ? allid : id); -} - -static void do_sysfolders (char option) { - char *buf, buf1[MAX_PATH], buf2[PATH_MAX]; + char *buf, buf1[PATH_MAX], buf2[PATH_MAX]; + WCHAR wbuf[MAX_PATH]; DWORD len = MAX_PATH; - WIN32_FIND_DATA w32_fd; + WIN32_FIND_DATAW w32_fd; HINSTANCE k32; - BOOL (*GetProfilesDirectoryAPtr) (LPSTR, LPDWORD) = 0; + BOOL (*GetProfilesDirectoryAPtrW) (LPWSTR, LPDWORD) = 0; buf = buf1; buf[0] = 0; switch (option) { case 'D': - get_user_folder (buf, CSIDL_DESKTOPDIRECTORY, - CSIDL_COMMON_DESKTOPDIRECTORY); + get_special_folder (buf, allusers_flag ? CSIDL_COMMON_DESKTOPDIRECTORY + : CSIDL_DESKTOPDIRECTORY); break; case 'P': - get_user_folder (buf, CSIDL_PROGRAMS, CSIDL_COMMON_PROGRAMS); + get_special_folder (buf, allusers_flag ? CSIDL_COMMON_PROGRAMS + : CSIDL_PROGRAMS); break; case 'O': - get_user_folder (buf, CSIDL_PERSONAL, CSIDL_COMMON_DOCUMENTS); + get_special_folder (buf, allusers_flag ? CSIDL_COMMON_DOCUMENTS + : CSIDL_PERSONAL); break; case 'F': @@ -616,25 +617,35 @@ do_sysfolders (char option) case 'H': k32 = LoadLibrary ("userenv"); if (k32) - GetProfilesDirectoryAPtr = (BOOL (*) (LPSTR, LPDWORD)) - GetProcAddress (k32, "GetProfilesDirectoryA"); - if (GetProfilesDirectoryAPtr) - (*GetProfilesDirectoryAPtr) (buf, &len); + GetProfilesDirectoryAPtrW = (BOOL (*) (LPWSTR, LPDWORD)) + GetProcAddress (k32, "GetProfilesDirectoryW"); + if (GetProfilesDirectoryAPtrW) + (*GetProfilesDirectoryAPtrW) (wbuf, &len); else { - GetWindowsDirectory (buf, MAX_PATH); - strcat (buf, "\\Profiles"); + GetWindowsDirectoryW (wbuf, MAX_PATH); + wcscat (wbuf, L"\\Profiles"); } + my_wcstombs (buf, wbuf, PATH_MAX); break; case 'S': - GetSystemDirectory (buf, MAX_PATH); - FindFirstFile (buf, &w32_fd); - strcpy (strrchr (buf, '\\') + 1, w32_fd.cFileName); + { + HANDLE fh; + + GetSystemDirectoryW (wbuf, MAX_PATH); + if ((fh = FindFirstFileW (wbuf, &w32_fd)) != INVALID_HANDLE_VALUE) + { + FindClose (fh); + wcscpy (wcsrchr (wbuf, L'\\') + 1, w32_fd.cFileName); + } + my_wcstombs (buf, wbuf, PATH_MAX); + } break; case 'W': - GetWindowsDirectory (buf, MAX_PATH); + GetWindowsDirectoryW (wbuf, MAX_PATH); + my_wcstombs (buf, wbuf, PATH_MAX); break; default: |