Kaynağa Gözat

Mingw: Use _wgetenv to get user's home directory

Fixes GH-342
Tatsuhiro Tsujikawa 10 yıl önce
ebeveyn
işleme
649c49dcc6
2 değiştirilmiş dosya ile 35 ekleme ve 13 silme
  1. 32 13
      src/util.cc
  2. 3 0
      src/util.h

+ 32 - 13
src/util.cc

@@ -146,6 +146,13 @@ std::string wCharToUtf8(const std::wstring& wsrc)
   }
 }
 
+std::string toForwardSlash(const std::string &src) {
+  auto dst = src;
+  std::transform(std::begin(dst), std::end(dst), std::begin(dst),
+                 [](char c) { return c == '\\' ? '/' : c; });
+  return dst;
+}
+
 #endif // __MINGW32__
 
 namespace util {
@@ -1288,34 +1295,46 @@ void setGlobalSignalHandler(int sig, sigset_t* mask, signal_handler_t handler,
 #endif // HAVE_SIGACTION
 }
 
+#ifndef __MINGW32__
 std::string getHomeDir()
 {
   const char* p = getenv("HOME");
   if (p) {
     return p;
   }
-#ifdef __MINGW32__
-  p = getenv("USERPROFILE");
+#ifdef HAVE_PWD_H
+  auto pw = getpwuid(geteuid());
+  if (pw && pw->pw_dir) {
+    return pw->pw_dir;
+  }
+#endif // HAVE_PWD_H
+  return A2STR::NIL;
+}
+
+#else // __MINGW32__
+
+std::string getHomeDir()
+{
+  auto p = _wgetenv(L"HOME");
   if (p) {
-    return p;
+    return toForwardSlash(wCharToUtf8(p));
   }
-  p = getenv("HOMEDRIVE");
+  p = _wgetenv(L"USERPROFILE");
   if (p) {
-    std::string homeDir = p;
-    p = getenv("HOMEPATH");
+    return toForwardSlash(wCharToUtf8(p));
+  }
+  p = _wgetenv(L"HOMEDRIVE");
+  if (p) {
+    std::wstring homeDir = p;
+    p = _wgetenv(L"HOMEPATH");
     if (p) {
       homeDir += p;
-      return homeDir;
+      return toForwardSlash(wCharToUtf8(homeDir));
     }
   }
-#elif HAVE_PWD_H
-  passwd* pw = getpwuid(geteuid());
-  if(pw && pw->pw_dir) {
-    return pw->pw_dir;
-  }
-#endif // HAVE_PWD_H
   return A2STR::NIL;
 }
+#endif // __MINGW32__
 
 int64_t getRealSize(const std::string& sizeWithUnit)
 {

+ 3 - 0
src/util.h

@@ -108,6 +108,9 @@ std::wstring utf8ToWChar(const std::string& src);
 std::wstring utf8ToWChar(const char* str);
 
 std::string wCharToUtf8(const std::wstring& wsrc);
+
+// replace any backslash '\' in |src| with '/' and returns it.
+std::string toForwardSlash(const std::string &src);
 #else // !__MINGW32__
 # define utf8ToWChar(src) src
 # define utf8ToNative(src) src