diff options
author | 2010-08-24 13:28:45 +0100 | |
---|---|---|
committer | 2010-08-24 15:47:41 +0100 | |
commit | 49750cc61904ba17060521bd345c6ae526fb1bf8 (patch) | |
tree | 8aa8c06a7d6ec58c62dd0741011e8357a19c8b8d /paludis/util/fs_path.hh | |
parent | 75f48bbb1ae368febe984c10c2db2d0b5cbd7cec (diff) | |
download | paludis-49750cc61904ba17060521bd345c6ae526fb1bf8.tar.gz paludis-49750cc61904ba17060521bd345c6ae526fb1bf8.tar.xz |
FSEntry -> FSPath, FSStat
Fixes: ticket:967
Diffstat (limited to 'paludis/util/fs_path.hh')
-rw-r--r-- | paludis/util/fs_path.hh | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/paludis/util/fs_path.hh b/paludis/util/fs_path.hh new file mode 100644 index 000000000..6147c14a2 --- /dev/null +++ b/paludis/util/fs_path.hh @@ -0,0 +1,194 @@ +/* vim: set sw=4 sts=4 et foldmethod=syntax : */ + +/* + * Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010 Ciaran McCreesh + * Copyright (c) 2006 Mark Loeser + * Copyright (c) 2008 Fernando J. Pereda + * + * This file is part of the Paludis package manager. Paludis is free software; + * you can redistribute it and/or modify it under the terms of the GNU General + * Public License version 2, as published by the Free Software Foundation. + * + * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef PALUDIS_GUARD_PALUDIS_UTIL_FS_PATH_HH +#define PALUDIS_GUARD_PALUDIS_UTIL_FS_PATH_HH 1 + +#include <paludis/util/fs_path-fwd.hh> +#include <paludis/util/fs_stat-fwd.hh> +#include <paludis/util/timestamp-fwd.hh> +#include <paludis/util/pimp.hh> +#include <sys/stat.h> + +namespace paludis +{ + class PALUDIS_VISIBLE FSPath : + private Pimp<FSPath> + { + friend std::ostream & paludis::operator<< (std::ostream & s, const FSPath & f); + friend bool operator== (const FSPath &, const FSPath &); + + private: + void _normalise(); + + public: + explicit FSPath(const std::string &); + + FSPath(const FSPath &); + + FSPath & operator= (const FSPath &); + + ~FSPath(); + + FSStat stat() const PALUDIS_ATTRIBUTE((warn_unused_result)); + + FSPath operator/ (const std::string &) const PALUDIS_ATTRIBUTE((warn_unused_result)); + FSPath operator/ (const FSPath &) const PALUDIS_ATTRIBUTE((warn_unused_result)); + + FSPath & operator/= (const std::string &); + FSPath & operator/= (const FSPath &); + + /** + * Return the last part of our path (eg '/foo/bar' => 'bar'). + */ + const std::string basename() const PALUDIS_ATTRIBUTE((warn_unused_result)); + + /** + * Return the first part of our path (eg '/foo/bar' => '/foo'). + */ + FSPath dirname() const + PALUDIS_ATTRIBUTE((warn_unused_result)); + + /** + * Return the canonicalised version of our path. + */ + FSPath realpath() const PALUDIS_ATTRIBUTE((warn_unused_result)); + + /** + * Return the canonicalised version of our path, if it exists, or + * ourself if it doesn't. + */ + FSPath realpath_if_exists() const PALUDIS_ATTRIBUTE((warn_unused_result)); + + /** + * Return the path without a given prefix (eg '/foo/bar/baz'->strip_leading('/foo') => '/bar/baz'). + */ + FSPath strip_leading(const FSPath & prefix) const; + + /** + * Try to make a directory. + * + * \return True, if we succeeded, and false if the directory + * already exists and is a directory and options includes + * fspmkdo_ok_if_exists. + * + * \exception FSError If an error other than the directory already + * existing occurs, or if the directory already exists and + * options does not include fspmkdo_ok_if_exists. + */ + bool mkdir(const mode_t mode, const FSPathMkdirOptions &) const; + + /** + * Try to make a symlink. + * + * \return True, if we succeeded, and false if the target already + * exists and is a symlink to the same target. + * + * \exception FSError If an error other than the symlink already + * existing occurs, or if the symlink exists and points elsewhere. + */ + bool symlink(const std::string & target) const; + + /** + * Try to unlink. + * + * \return True, if we succeeded, and false if we don't exist + * already. + * + * \exception FSError If an error other than us already not + * existing occurs. + */ + bool unlink() const; + + /** + * Try to rmdir. + * + * \return True, if we succeeded, and false if we don't exist + * already. + * + * \exception FSError If an error other than us already not + * existing occurs. + */ + bool rmdir() const; + + /** + * Change our ownership, following symlinks. + * + * \exception FSError If the chown failed. + */ + void chown(const uid_t owner, const gid_t group) const; + + /** + * Change our ownership, not following symlinks. + * + * \exception FSError If the lchown failed. + */ + void lchown(const uid_t owner, const gid_t group) const; + + /** + * Change our permissions. + * + * \exception FSError If the chmod failed. + */ + void chmod(const mode_t mode) const; + + /** + * Try to set atime and mtime + * + * \return True, if we succeeded, and false if we don't exist + * already. + * + * \exception FSError If an error other than us already not + * existing ocurrs. + */ + bool utime(const Timestamp &) const; + + /** + * Return our destination, if we are a symlink. + * + * \exception FSError if we are not a symlink, or if the system call + * fails. + */ + std::string readlink() const PALUDIS_ATTRIBUTE((warn_unused_result)); + + /** + * Rename ourself (will not work across mount points). + * + * \exception FSError If the rename failed. + */ + void rename(const FSPath & new_name) const; + + /** + * Return the current working directory + */ + static FSPath cwd() PALUDIS_ATTRIBUTE((warn_unused_result)); + }; + + class PALUDIS_VISIBLE FSPathComparator + { + public: + bool operator() (const FSPath &, const FSPath &) const; + }; + + extern template class Pimp<FSPath>; +} + +#endif |