X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fwindows%2Fdir.cpp;h=151cc1b0944c4b455655c1f426da09c0ee81f89f;hp=6adddeca788a99e73aae2d7289b65721dba77045;hb=edf916d784e503505ddac2acef6f3e9a72abb0d6;hpb=609c9a508cfdc7b42c46c4f21d17639204165a00 diff --git a/source/fs/windows/dir.cpp b/source/fs/windows/dir.cpp index 6adddec..151cc1b 100644 --- a/source/fs/windows/dir.cpp +++ b/source/fs/windows/dir.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "dir.h" @@ -19,6 +20,43 @@ void rmdir(const Path &path) throw system_error("RemoveDirectory"); } +/* Windows documentation says Get/SetCurrentDirectory use a global buffer and +are not thread safe. */ +static Mutex &cwd_mutex() +{ + static Mutex mutex; + return mutex; +} + +Path getcwd() +{ + MutexLock lock(cwd_mutex()); + + char buf[1024]; + Path result; + DWORD len = GetCurrentDirectory(sizeof(buf), buf); + if(len>=sizeof(buf)) + { + vector buf2(len+1); + len = GetCurrentDirectory(buf2.size(), buf2.data()); + result = buf2.data(); + } + else + result = buf; + + if(!len) + throw system_error("GetCurrentDirectory"); + + return result; +} + +void chdir(const Path &path) +{ + MutexLock lock(cwd_mutex()); + if(!SetCurrentDirectory(path.c_str())) + throw system_error("SetCurrentDirectory"); +} + Path get_home_dir() { char home[MAX_PATH]; @@ -29,6 +67,8 @@ Path get_home_dir() Path get_user_data_dir(const string &appname) { + if(appname.empty()) + throw invalid_argument("get_user_data_dir"); char datadir[MAX_PATH]; if(SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, 0, datadir)==S_OK) return Path(datadir)/appname;