X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=zypp%2FPathInfo.h;h=74baf030e74a07df7085d07eb6d7ced80c0cf37c;hb=HEAD;hp=15612fd9c99dd04060d6fdbe7cf2b61ed20435c6;hpb=1e08c9b35d632ec68a1f514fe07ad687bbb57c0c;p=platform%2Fupstream%2Flibzypp.git diff --git a/zypp/PathInfo.h b/zypp/PathInfo.h index 15612fd..cb05df5 100644 --- a/zypp/PathInfo.h +++ b/zypp/PathInfo.h @@ -27,12 +27,16 @@ extern "C" #include #include -#include "zypp/Pathname.h" +#include +#include +#include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// + class StrMatcher; + /////////////////////////////////////////////////////////////////// /** Types and functions for filesystem operations. * \todo move zypp::filesystem stuff into separate header @@ -242,6 +246,8 @@ namespace zypp const Pathname & path() const { return path_t; } /** Return current Pathname as String. */ const std::string & asString() const { return path_t.asString(); } + /** Return current Pathname as C-string. */ + const char * c_str() const { return path_t.asString().c_str(); } /** Return current stat Mode. */ Mode mode() const { return mode_e; } /** Return error returned from last stat/lstat call. */ @@ -353,8 +359,8 @@ namespace zypp dev_t dev() const { return isExist() ? statbuf_C.st_dev : 0; } dev_t rdev() const { return isExist() ? statbuf_C.st_rdev : 0; } - unsigned int major() const; - unsigned int minor() const; + unsigned int devMajor() const; + unsigned int devMinor() const; //@} /** \name Size info. */ @@ -448,6 +454,51 @@ namespace zypp int copy_dir_content( const Pathname & srcpath, const Pathname & destpath); /** + * Convenience returning StrMatcher( "[^.]*", Match::GLOB ) + * \see \ref dirForEach + */ + const StrMatcher & matchNoDots(); + + /** + * Invoke callback function \a fnc_r for each entry in directory \a dir_r. + * + * If \a fnc_r is a \c NULL function \c 0 is returned immediately without even + * testing or accessing \a dir_r. + * + * Otherwise \c ::readdir is used to read the name of every entry in \a dir_r, + * omitting \c '.' and \c '..'. \a dir_r and the current entries name are passed + * as arguments to \a fnc_r. If \a fnc_r returns \c false processing is aborted. + * + * @return 0 on success, -1 if aborted by callback, errno > 0 on ::readdir failure. + */ + int dirForEach( const Pathname & dir_r, function fnc_r ); + + /** + * \overload taking a \ref StrMatcher to filter the entries for which \a fnc_r is invoked. + * + * For convenience a \ref StrMatcher \ref matchNoDots is provided in this namespace. + * + * \code + * bool cbfnc( const Pathname & dir_r, const char *const str_r ) + * { + * D BG <*< " - " << dir_r/str_r << endl; + * return true; + * } + * // Print no-dot files in "/tmp" via callback + * filesystem::dirForEach( "/tmp", filesystem::matchNoDots(), cbfnc ); + * + * // same via lambda + * filesystem::dirForEach( "/tmp", filesystem::matchNoDots(), + * [](const Pathname & dir_r, const std::string & str_r)->bool + * { + * DBG << " - " << dir_r/str_r << endl; + * return true; + * }); + * \endcode + */ + int dirForEach( const Pathname & dir_r, const StrMatcher & matcher_r, function fnc_r ); + + /** * Return content of directory via retlist. If dots is false * entries starting with '.' are not reported. "." and ".." * are never reported. @@ -485,11 +536,18 @@ namespace zypp : name( name_r ) , type( type_r ) {} + + bool operator==( const DirEntry &rhs ) const; }; + inline std::ostream & operator<<( std::ostream & str, const DirEntry & obj ) + { return str << '[' << obj.type << "] " << obj.name; } + /** Returned by readdir. */ typedef std::list DirContent; + std::ostream & operator<<( std::ostream & str, const DirContent & obj ); + /** * Return content of directory via retlist. If dots is false * entries starting with '.' are not reported. "." and ".." @@ -503,7 +561,6 @@ namespace zypp int readdir( DirContent & retlist, const Pathname & path, bool dots = true, PathInfo::Mode statmode = PathInfo::STAT ); - /** * Check if the specified directory is empty. * \param path The path of the directory to check. @@ -517,6 +574,27 @@ namespace zypp /** \name File related functions. */ //@{ /** + * Create an empty file if it does not yet exist. Make parent directories + * as needed. mode specifies the permissions to use. It is modified by the + * process's umask in the usual way. + * + * @return 0 on success, errno on failure + **/ + int assert_file( const Pathname & path, unsigned mode = 0644 ); + /** + * Like \ref assert_file but enforce \a mode even if the file already exists. + */ + int assert_file_mode( const Pathname & path, unsigned mode = 0644 ); + + /** + * Change file's modification and access times. + * + * \return 0 on success, errno on failure + * \see man utime + */ + int touch (const Pathname & path); + + /** * Like '::unlink'. Delete a file (symbolic link, socket, fifo or device). * * @return 0 on success, errno on failure @@ -524,12 +602,43 @@ namespace zypp int unlink( const Pathname & path ); /** - * Like '::rename'. Renames a file, moving it between directories if required. + * Like '::rename'. Renames a file, moving it between directories if + * required. It falls back to using mv(1) in case errno is set to + * EXDEV, indicating a cross-device rename, which is likely to happen when + * oldpath and newpath are not on the same OverlayFS layer. * * @return 0 on success, errno on failure **/ int rename( const Pathname & oldpath, const Pathname & newpath ); + /** Exchanges two files or directories. + * + * Most common use is when building a new config file (or dir) + * in a tempfile. After the job is done, configfile and tempfile + * are exchanged. This includes moving away the configfile in case + * the tempfile does not exist. Parent directories are created as + * needed. + * + * \note Paths are exchanged using \c ::rename, so take care both paths + * are located on the same filesystem. + * + * \code + * Pathname configfile( "/etc/myconfig" ); + * TmpFile newconfig( TmpFile::makeSibling( configfile ) ); + * // now write the new config: + * std::ofstream o( newconfig.path().c_str() ); + * o << "mew values << endl; + * o.close(); + * // If everything is fine, exchange the files: + * exchange( newconfig.path(), configfile ); + * // Now the old configfile is still available at newconfig.path() + * // until newconfig goes out of scope. + * \endcode + * + * @return 0 on success, errno on failure + */ + int exchange( const Pathname & lpath, const Pathname & rpath ); + /** * Like 'cp file dest'. Copy file to destination file. * @@ -555,6 +664,42 @@ namespace zypp int hardlink( const Pathname & oldpath, const Pathname & newpath ); /** + * Create \a newpath as hardlink or copy of \a oldpath. + * + * @return 0 on success, errno on failure. + */ + int hardlinkCopy( const Pathname & oldpath, const Pathname & newpath ); + + /** + * Like '::readlink'. Return the contents of the symbolic link + * \a symlink_r via \a target_r. + * + * @return 0 on success, errno on failure. + */ + int readlink( const Pathname & symlink_r, Pathname & target_r ); + /** \overload Return an empty Pathname on error. */ + inline Pathname readlink( const Pathname & symlink_r ) + { + Pathname target; + readlink( symlink_r, target ); + return target; + } + + /** + * Recursively follows the symlink pointed to by \a path_r and returns + * the Pathname to the real file or directory pointed to by the link. + * + * There is a recursion limit of 256 iterations to protect against a cyclic + * link. + * + * @return Pathname of the file or directory pointed to by the given link + * if it is a valid link. If \a path_r is not a link, an exact copy of + * it is returned. If \a path_r is a broken or a cyclic link, an empty + * Pathname is returned and the event logged. + */ + Pathname expandlink( const Pathname & path_r ); + + /** * Like 'cp file dest'. Copy file to dest dir. * * @return 0 on success, EINVAL if file is not a file, ENOTDIR if dest @@ -583,6 +728,20 @@ namespace zypp std::string sha1sum( const Pathname & file ); //@} + /** + * Compute a files checksum + * + * @return the files checksum on success, otherwise an empty string.. + **/ + std::string checksum( const Pathname & file, const std::string &algorithm ); + + /** + * check files checksum + * + * @return true if the checksum matches (an empty Checksum always matches!) + **/ + bool is_checksum( const Pathname & file, const CheckSum &checksum ); + /////////////////////////////////////////////////////////////////// /** \name Changing permissions. */ //@{ @@ -592,6 +751,20 @@ namespace zypp * @return 0 on success, errno on failure **/ int chmod( const Pathname & path, mode_t mode ); + + /** + * Add the \c mode bits to the file given by path. + * + * @return 0 on success, errno on failure + */ + int addmod( const Pathname & path, mode_t mode ); + + /** + * Remove the \c mode bits from the file given by path. + * + * @return 0 on success, errno on failure + */ + int delmod( const Pathname & path, mode_t mode ); //@} /////////////////////////////////////////////////////////////////// @@ -602,7 +775,7 @@ namespace zypp * * @return ZT_GZ, ZT_BZ2 if file is compressed, otherwise ZT_NONE. **/ - enum ZIP_TYPE { ZT_NONE, ZT_GZ, ZT_BZ2 }; + enum ZIP_TYPE { ZT_NONE, ZT_GZ, ZT_BZ2, ZT_ZCHNK }; ZIP_TYPE zipType( const Pathname & file ); @@ -614,6 +787,31 @@ namespace zypp * \todo check cooperation with zypp::TmpFile and zypp::TmpDir **/ int erase( const Pathname & path ); + + /** + * Report free disk space on a mounted file system. + * + * path is the path name of any file within the mounted filesystem. + * + * @return Free disk space or -1 on error. + **/ + ByteCount df( const Pathname & path ); + + /** + * Get the current umask (file mode creation mask) + * + * @return The current umask + **/ + mode_t getUmask(); + + /** + * Modify \c mode_r according to the current umask + * ( mode_r & ~getUmask() ). + * \see \ref getUmask. + * @return The resulting permissions. + **/ + inline mode_t applyUmaskTo( mode_t mode_r ) + { return mode_r & ~getUmask(); } //@} /////////////////////////////////////////////////////////////////