X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Ffs%2Fwindows%2Fdir.cpp;h=151cc1b0944c4b455655c1f426da09c0ee81f89f;hp=6b63b471d5bc939fe11a78ccbc668cdb02573c8c;hb=edf916d784e503505ddac2acef6f3e9a72abb0d6;hpb=5c5ef91ab576f10288e2e3d027aa5c77bf8503a4 diff --git a/source/fs/windows/dir.cpp b/source/fs/windows/dir.cpp index 6b63b47..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];