From: Arvin Schnell Date: Mon, 23 May 2011 12:30:24 +0000 (+0200) Subject: - restructuring X-Git-Tag: v0.1.3~374 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e87d07c8b48ee0350479e677fc3376fd0c80980f;p=thirdparty%2Fsnapper.git - restructuring --- diff --git a/snapper/File.cc b/snapper/File.cc index ed84b060..6b6c0389 100644 --- a/snapper/File.cc +++ b/snapper/File.cc @@ -468,6 +468,39 @@ namespace snapper } + bool + File::deleteAllTypes() const + { + struct stat fs; + if (lstat(getAbsolutePath(LOC_POST).c_str(), &fs) == 0) + { + switch (fs.st_mode & S_IFMT) + { + case S_IFDIR: { + if (rmdir(getAbsolutePath(LOC_SYSTEM).c_str()) != 0) + { + y2err("rmdir failed path:" << getAbsolutePath(LOC_SYSTEM) << + " errno:" << errno); + return false; + } + } break; + + case S_IFREG: + case S_IFLNK: { + if (unlink(getAbsolutePath(LOC_SYSTEM).c_str()) != 0) + { + y2err("unlink failed path:" << getAbsolutePath(LOC_SYSTEM) << + " errno:" << errno); + return false; + } + } break; + } + } + + return true; + } + + bool File::doRollback() { @@ -485,44 +518,8 @@ namespace snapper if (getPreToPostStatus() & CREATED || getPreToPostStatus() & TYPE) { - struct stat fs; - if (lstat(getAbsolutePath(LOC_POST).c_str(), &fs) != 0) - { - y2err("lstat failed path:" << getAbsolutePath(LOC_SYSTEM) << " errno:" << errno); + if (!deleteAllTypes()) error = true; - } - else - { - switch (fs.st_mode & S_IFMT) - { - case S_IFDIR: { - if (rmdir(getAbsolutePath(LOC_SYSTEM).c_str()) != 0) - { - y2err("rmdir failed path:" << getAbsolutePath(LOC_SYSTEM) << - " errno:" << errno); - error = true; - } - } break; - - case S_IFREG: { - if (unlink(getAbsolutePath(LOC_SYSTEM).c_str()) != 0) - { - y2err("unlink failed path:" << getAbsolutePath(LOC_SYSTEM) << - " errno:" << errno); - error = true; - } - } break; - - case S_IFLNK: { - if (unlink(getAbsolutePath(LOC_SYSTEM).c_str()) != 0) - { - y2err("unlink failed path:" << getAbsolutePath(LOC_SYSTEM) << - " errno:" << errno); - error = true; - } - } break; - } - } } if (getPreToPostStatus() & DELETED || getPreToPostStatus() & TYPE) @@ -578,14 +575,16 @@ namespace snapper switch (fs.st_mode & S_IFMT) { case S_IFREG: { - unlink(getAbsolutePath(LOC_SYSTEM).c_str()); - if (!createFile(fs.st_mode, fs.st_uid, fs.st_gid)) + if (!deleteAllTypes()) + error = true; + else if (!createFile(fs.st_mode, fs.st_uid, fs.st_gid)) error = true; } break; case S_IFLNK: { - unlink(getAbsolutePath(LOC_SYSTEM).c_str()); - if (!createLink(fs.st_uid, fs.st_gid)) + if (!deleteAllTypes()) + error = true; + else if (!createLink(fs.st_uid, fs.st_gid)) error = true; } break; } diff --git a/snapper/File.h b/snapper/File.h index 0846f5dd..0e3053ec 100644 --- a/snapper/File.h +++ b/snapper/File.h @@ -112,6 +112,8 @@ namespace snapper bool createFile(mode_t mode, uid_t owner, gid_t group) const; bool createLink(uid_t owner, gid_t group) const; + bool deleteAllTypes() const; + const Comparison* comparison; string name;