From: Arvin Schnell Date: Mon, 23 May 2011 13:38:36 +0000 (+0200) Subject: - restructuring X-Git-Tag: v0.1.3~373 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=26c83494979a4b46c48ae34c8adefee000c1ca81;p=thirdparty%2Fsnapper.git - restructuring --- diff --git a/snapper/File.cc b/snapper/File.cc index 6b6c0389..8afb7a20 100644 --- a/snapper/File.cc +++ b/snapper/File.cc @@ -407,6 +407,44 @@ namespace snapper } + bool + File::createAllTypes() const + { + struct stat fs; + if (lstat(getAbsolutePath(LOC_PRE).c_str(), &fs) != 0) + { + y2err("lstat failed path:" << getAbsolutePath(LOC_SYSTEM) << " errno:" << errno); + return false; + } + else if (!createParentDirectories(getAbsolutePath(LOC_SYSTEM))) + { + return false; + } + else + { + switch (fs.st_mode & S_IFMT) + { + case S_IFDIR: { + if (!createDirectory(fs.st_mode, fs.st_uid, fs.st_gid)) + return false; + } break; + + case S_IFREG: { + if (!createFile(fs.st_mode, fs.st_uid, fs.st_gid)) + return false; + } break; + + case S_IFLNK: { + if (!createLink(fs.st_uid, fs.st_gid)) + return false; + } break; + } + } + + return true; + } + + bool File::createDirectory(mode_t mode, uid_t owner, gid_t group) const { @@ -501,6 +539,66 @@ namespace snapper } + bool + File::modifyAllTypes() const + { + struct stat fs; + if (lstat(getAbsolutePath(LOC_PRE).c_str(), &fs) != 0) + { + y2err("lstat failed path:" << getAbsolutePath(LOC_SYSTEM) << " errno:" << errno); + return false; + } + else if (!createParentDirectories(getAbsolutePath(LOC_SYSTEM))) + { + return false; + } + else + { + if (getPreToPostStatus() & CONTENT) + { + switch (fs.st_mode & S_IFMT) + { + case S_IFREG: { + if (!deleteAllTypes()) + return false; + else if (!createFile(fs.st_mode, fs.st_uid, fs.st_gid)) + return false; + } break; + + case S_IFLNK: { + if (!deleteAllTypes()) + return false; + else if (!createLink(fs.st_uid, fs.st_gid)) + return false; + } break; + } + } + + if (getPreToPostStatus() & PERMISSIONS) + { + if (chmod(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_mode) != 0) + { + y2err("chmod failed path:" << getAbsolutePath(LOC_SYSTEM) << + " errno:" << errno); + return false; + } + } + + if (getPreToPostStatus() & (USER | GROUP)) + { + if (lchown(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_uid, fs.st_gid) != 0) + { + y2err("lchown failed path:" << getAbsolutePath(LOC_SYSTEM) << + " errno:" << errno); + return false; + } + } + } + + return true; + } + + bool File::doRollback() { @@ -524,92 +622,14 @@ namespace snapper if (getPreToPostStatus() & DELETED || getPreToPostStatus() & TYPE) { - struct stat fs; - if (lstat(getAbsolutePath(LOC_PRE).c_str(), &fs) != 0) - { - y2err("lstat failed path:" << getAbsolutePath(LOC_SYSTEM) << " errno:" << errno); + if (!createAllTypes()) error = true; - } - else if (!createParentDirectories(getAbsolutePath(LOC_SYSTEM))) - { - error = true; - } - else - { - switch (fs.st_mode & S_IFMT) - { - case S_IFDIR: { - if (!createDirectory(fs.st_mode, fs.st_uid, fs.st_gid)) - error = true; - } break; - - case S_IFREG: { - if (!createFile(fs.st_mode, fs.st_uid, fs.st_gid)) - error = true; - } break; - - case S_IFLNK: { - if (!createLink(fs.st_uid, fs.st_gid)) - error = true; - } break; - } - } } if (getPreToPostStatus() & (CONTENT | PERMISSIONS | USER | GROUP)) { - struct stat fs; - if (lstat(getAbsolutePath(LOC_PRE).c_str(), &fs) != 0) - { - y2err("lstat failed path:" << getAbsolutePath(LOC_SYSTEM) << " errno:" << errno); - error = true; - } - else if (!createParentDirectories(getAbsolutePath(LOC_SYSTEM))) - { + if (!modifyAllTypes()) error = true; - } - else - { - if (getPreToPostStatus() & CONTENT) - { - switch (fs.st_mode & S_IFMT) - { - case S_IFREG: { - if (!deleteAllTypes()) - error = true; - else if (!createFile(fs.st_mode, fs.st_uid, fs.st_gid)) - error = true; - } break; - - case S_IFLNK: { - if (!deleteAllTypes()) - error = true; - else if (!createLink(fs.st_uid, fs.st_gid)) - error = true; - } break; - } - } - - if (getPreToPostStatus() & PERMISSIONS) - { - if (chmod(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_mode) != 0) - { - y2err("chmod failed path:" << getAbsolutePath(LOC_SYSTEM) << - " errno:" << errno); - error = true; - } - } - - if (getPreToPostStatus() & (USER | GROUP)) - { - if (lchown(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_uid, fs.st_gid) != 0) - { - y2err("lchown failed path:" << getAbsolutePath(LOC_SYSTEM) << - " errno:" << errno); - error = true; - } - } - } } if (error && getSnapper()->getRollbackCallback()) diff --git a/snapper/File.h b/snapper/File.h index 0e3053ec..cda5da0e 100644 --- a/snapper/File.h +++ b/snapper/File.h @@ -24,6 +24,8 @@ #define FILE_H +#include + #include #include @@ -108,12 +110,15 @@ namespace snapper bool createParentDirectories(const string& path) const; + bool createAllTypes() const; bool createDirectory(mode_t mode, uid_t owner, gid_t group) const; bool createFile(mode_t mode, uid_t owner, gid_t group) const; bool createLink(uid_t owner, gid_t group) const; bool deleteAllTypes() const; + bool modifyAllTypes() const; + const Comparison* comparison; string name;