X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ffs%2Futils.cpp;h=9a9802524399e53c8b21e723764f939a6fd9f8c1;hb=8db2c378e1d006afb792d829857e866541bf81a5;hp=0c29a5306cf591d7f10abf053c65651804f6a942;hpb=7563bb650aa11207a7c128ba44468cf5ad2897c7;p=libs%2Fcore.git diff --git a/source/fs/utils.cpp b/source/fs/utils.cpp index 0c29a53..9a98025 100644 --- a/source/fs/utils.cpp +++ b/source/fs/utils.cpp @@ -1,11 +1,10 @@ -#include #include -#include -#ifndef WIN32 -#include +#ifdef WIN32 +#include #else -#include +#include #endif +#include #include #include "dir.h" #include "path.h" @@ -83,12 +82,12 @@ Path readlink(const Path &link) { #ifdef WIN32 (void)link; - throw Exception("No symbolic links on win32"); + throw logic_error("no symbolic links on win32"); #else char buf[4096]; int len = ::readlink(link.str().c_str(), buf, sizeof(buf)); if(len==-1) - throw SystemError("readlink failed", errno); + throw system_error("readlink"); return string(buf, len); #endif } @@ -115,11 +114,10 @@ Path realpath(const Path &path) Path next = real/queue.front(); queue.pop_front(); - struct stat st = lstat(next); - if(S_ISLNK(st.st_mode)) + if(is_link(next)) { if(++n_links>64) - throw Exception("Ludicrous amount of symlinks detected in realpath, giving up"); + throw runtime_error("too many symbolic links"); Path link = readlink(next); queue.insert(queue.begin(), link.begin(), link.end()); } @@ -133,14 +131,24 @@ Path realpath(const Path &path) void rename(const Path &from, const Path &to) { +#ifdef WIN32 + if(!MoveFileEx(from.c_str(), to.c_str(), MOVEFILE_REPLACE_EXISTING)) + throw system_error("MoveFileEx"); +#else if(::rename(from.str().c_str(), to.str().c_str())==-1) - throw SystemError("rename failed", errno); + throw system_error("rename"); +#endif } void unlink(const Path &path) { +#ifdef WIN32 + if(!DeleteFile(path.c_str())) + throw system_error("DeleteFile"); +#else if(::unlink(path.str().c_str())==-1) - throw SystemError("unlink failed", errno); + throw system_error("unlink"); +#endif } Path relative(const Path &path, const Path &base) @@ -158,6 +166,16 @@ Path relative(const Path &path, const Path &base) return result; } +Path common_ancestor(const Path &path1, const Path &path2) +{ + Path::Iterator i = path1.begin(); + Path::Iterator j = path2.begin(); + Path result; + for(; (i!=path1.end() && j!=path2.end() && *i==*j); ++i, ++j) + result /= *i; + return result; +} + int descendant_depth(const Path &path, const Path &parent) { Path::Iterator i = path.begin();