-/* $Id$
-
-This file is part of libmspfs
-Copyright © 2006-2008 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#include <cerrno>
#include <cstdio>
-#include <msp/core/except.h>
#ifndef WIN32
-#include <fnmatch.h>
-#else
-#include <msp/strings/glob.h>
+#include <unistd.h>
#endif
+#include <msp/core/systemerror.h>
#include <msp/strings/utils.h>
#include "dir.h"
#include "path.h"
{
#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
}
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());
}
void rename(const Path &from, const Path &to)
{
if(::rename(from.str().c_str(), to.str().c_str())==-1)
- throw SystemError("rename failed", errno);
+ throw system_error("rename");
}
void unlink(const Path &path)
{
if(::unlink(path.str().c_str())==-1)
- throw SystemError("unlink failed", errno);
+ throw system_error("unlink");
}
Path relative(const Path &path, const Path &base)