summaryrefslogtreecommitdiff
path: root/lib/resolve_path.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/resolve_path.cpp')
-rw-r--r--lib/resolve_path.cpp86
1 files changed, 17 insertions, 69 deletions
diff --git a/lib/resolve_path.cpp b/lib/resolve_path.cpp
index 9c690c9a..b735d1f9 100644
--- a/lib/resolve_path.cpp
+++ b/lib/resolve_path.cpp
@@ -1,25 +1,21 @@
#include "resolve_path.h"
+#include <set> //not necessarily included by <map>!
#include <map>
-#include <set>
#include <zen/time.h>
-#include <zen/scope_guard.h>
#include <zen/thread.h>
-#include <wx/utils.h>
-#include <wx+/string_conv.h>
+#include <zen/utf.h>
+#include <wx/utils.h> //wxGetEnv
#ifdef FFS_WIN
-#include <zen/dll.h>
-#include <Shlobj.h>
#include <zen/win.h> //includes "windows.h"
+#include <Shlobj.h>
#include <zen/long_path_prefix.h>
#include <zen/file_handling.h>
#ifdef _MSC_VER
#pragma comment(lib, "Mpr.lib")
#endif
-#elif defined FFS_LINUX
-#include <zen/file_traverser.h>
-#include <unistd.h>
+#elif defined FFS_LINUX || defined FFS_MAC
#include <stdlib.h> //getenv()
#endif
@@ -44,7 +40,7 @@ Zstring resolveRelativePath(const Zstring& relativeName) //note: ::GetFullPathNa
return removeLongPathPrefix(Zstring(&buffer[0], charsWritten)); //GetFullPathName() preserves long path prefix -> a low-level detail we don't want to leak out!
}
-#elif defined FFS_LINUX
+#elif defined FFS_LINUX || defined FFS_MAC
Zstring resolveRelativePath(const Zstring& relativeName)
{
//http://linux.die.net/man/2/path_resolution
@@ -70,21 +66,12 @@ Zstring resolveRelativePath(const Zstring& relativeName)
return homeDir;
}
- //unfortunately ::realpath only resolves *existing* relative paths, so we need to do it by ourselves
+ //we cannot use ::realpath() since it resolves *existing* relative paths only!
std::vector<char> buffer(10000);
if (::getcwd(&buffer[0], buffer.size()) != nullptr)
return appendSeparator(&buffer[0]) + relativeName;
}
return relativeName;
-
- /*
- char* absPath = ::realpath(relativeName.c_str(), nullptr);
- if (!absPath)
- return relativeName; //ERROR! Don't do anything
- ZEN_ON_SCOPE_EXIT(::free(absPath));
-
- return Zstring(absPath);
- */
}
#endif
@@ -288,33 +275,10 @@ Zstring zen::expandMacros(const Zstring& text) { return ::expandMacros(text, std
namespace
{
-#ifdef FFS_LINUX
-class TraverseMedia : public zen::TraverseCallback
-{
-public:
- typedef std::map<Zstring, Zstring> DeviceList; //device name -> device path mapping
-
- TraverseMedia(DeviceList& devices) : devices_(devices) {}
-
- virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details) {}
- virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) { return LINK_SKIP; }
- virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName)
- {
- devices_.insert(std::make_pair(shortName, fullName));
- return nullptr; //DON'T traverse into subdirs
- }
- virtual HandleError onError(const std::wstring& msg) { assert(false); return ON_ERROR_IGNORE; }
-
-private:
- DeviceList& devices_;
-};
-#endif
-
-
+#ifdef FFS_WIN
//networks and cdrom excluded - this should not block
Zstring getPathByVolumenName(const Zstring& volumeName) //return empty string on error
{
-#ifdef FFS_WIN
//FindFirstVolume(): traverses volumes on local hard disks only!
//GetLogicalDriveStrings(): traverses all *logical* volumes, including CD-ROM, FreeOTFE virtual volumes
@@ -335,8 +299,7 @@ Zstring getPathByVolumenName(const Zstring& volumeName) //return empty string on
findFirstMatch.addJob([path, volumeName]() -> std::unique_ptr<Zstring>
{
UINT type = ::GetDriveType(path.c_str()); //non-blocking call!
- if (type == DRIVE_REMOTE ||
- type == DRIVE_CDROM)
+ if (type == DRIVE_REMOTE || type == DRIVE_CDROM)
return nullptr;
//next call seriously blocks for non-existing network drives!
@@ -359,29 +322,15 @@ Zstring getPathByVolumenName(const Zstring& volumeName) //return empty string on
return *result;
}
-#elif defined FFS_LINUX
- //due to the naming convention on Linux /media/<volume name> this function is not that useful, but...
-
- TraverseMedia::DeviceList deviceList;
-
- TraverseMedia traverser(deviceList);
- traverseFolder("/media", traverser); //traverse one level
-
- TraverseMedia::DeviceList::const_iterator it = deviceList.find(volumeName);
- if (it != deviceList.end())
- return it->second;
-#endif
return Zstring();
}
-#ifdef FFS_WIN
//networks and cdrom excluded - this should not block
Zstring getVolumeName(const Zstring& volumePath) //return empty string on error
{
UINT rv = ::GetDriveType(volumePath.c_str()); //non-blocking call!
- if (rv != DRIVE_REMOTE &&
- rv != DRIVE_CDROM)
+ if (rv != DRIVE_REMOTE && rv != DRIVE_CDROM)
{
std::vector<wchar_t> buffer(MAX_PATH + 1);
if (::GetVolumeInformation(volumePath.c_str(), //__in_opt LPCTSTR lpRootPathName,
@@ -420,7 +369,7 @@ Zstring expandVolumeName(const Zstring& text) // [volname]:\folder [volna
rest = afterFirst(rest, Zstr(':'));
if (startsWith(rest, FILE_NAME_SEPARATOR))
rest = afterFirst(rest, FILE_NAME_SEPARATOR);
-
+#ifdef FFS_WIN
//[.*] pattern was found...
if (!volname.empty())
{
@@ -435,11 +384,10 @@ Zstring expandVolumeName(const Zstring& text) // [volname]:\folder [volna
?:\[FFS USB]\FreeFileSync\ - Windows
/.../[FFS USB]/FreeFileSync/ - Linux
instead of:
- C:\Program Files\FreeFileSync\[FFS USB]\FreeFileSync\
- */
-#ifdef FFS_WIN
+ C:\Program Files\FreeFileSync\[FFS USB]\FreeFileSync\ */
return L"?:\\[" + volname + L"]\\" + rest;
-#elif defined FFS_LINUX
+
+#elif defined FFS_LINUX || defined FFS_MAC //neither supported nor needed
return "/.../[" + volname + "]/" + rest;
#endif
}
@@ -500,13 +448,13 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less
const auto& csidlMap = CsidlConstants::get();
envToDir.insert(csidlMap.begin(), csidlMap.end());
-#elif defined FFS_LINUX
- addEnvVar("HOME"); // /home/zenju
+#elif defined FFS_LINUX || defined FFS_MAC
+ addEnvVar("HOME"); //Linux: /home/zenju Mac: /Users/zenju
#endif
//substitute paths by symbolic names
auto pathStartsWith = [](const Zstring& path, const Zstring& prefix) -> bool
{
-#ifdef FFS_WIN
+#if defined FFS_WIN || defined FFS_MAC
Zstring tmp = path;
Zstring tmp2 = prefix;
::makeUpper(tmp);
bgstack15