]> git.ipfire.org Git - thirdparty/snapper.git/commitdiff
- added callbacks for rollback errors
authorArvin Schnell <aschnell@suse.de>
Tue, 3 May 2011 13:17:35 +0000 (15:17 +0200)
committerArvin Schnell <aschnell@suse.de>
Tue, 3 May 2011 13:17:35 +0000 (15:17 +0200)
14 files changed:
snapper/File.cc
snapper/Snapper.h
testsuite-real/.gitignore
testsuite-real/Makefile.am
testsuite-real/common.cc
testsuite-real/common.h
testsuite-real/error1.cc [new file with mode: 0644]
testsuite-real/owner1.cc
testsuite-real/owner2.cc
testsuite-real/permissions1.cc
testsuite-real/permissions2.cc
testsuite-real/run-all
testsuite-real/simple1.cc
tools/snapper.cc

index 0f2e780ef7952812f2bc3cbd1d87d11100b85b66..9df7e963eb74ea664f85313ae1ca5613c95e782a 100644 (file)
@@ -386,15 +386,30 @@ namespace snapper
            switch (fs.st_mode & S_IFMT)
            {
                case S_IFDIR: {
-                   rmdir(getAbsolutePath(LOC_SYSTEM).c_str());
+                   if (rmdir(getAbsolutePath(LOC_SYSTEM).c_str()) != 0)
+                   {
+                       y2err("rmdir failed for " << getAbsolutePath(LOC_SYSTEM));
+                       if (getSnapper()->getRollbackCallback())
+                           getSnapper()->getRollbackCallback()->deleteError(name);
+                   }
                } break;
 
                case S_IFREG: {
-                   unlink(getAbsolutePath(LOC_SYSTEM).c_str());
+                   if (unlink(getAbsolutePath(LOC_SYSTEM).c_str()) != 0)
+                   {
+                       y2err("unlink failed for " << getAbsolutePath(LOC_SYSTEM));
+                       if (getSnapper()->getRollbackCallback())
+                           getSnapper()->getRollbackCallback()->deleteError(name);
+                   }
                } break;
 
                case S_IFLNK: {
-                   unlink(getAbsolutePath(LOC_SYSTEM).c_str());
+                   if (unlink(getAbsolutePath(LOC_SYSTEM).c_str()) != 0)
+                   {
+                       y2err("unlink failed for " << getAbsolutePath(LOC_SYSTEM));
+                       if (getSnapper()->getRollbackCallback())
+                           getSnapper()->getRollbackCallback()->deleteError(name);
+                   }
                } break;
            }
        }
@@ -457,12 +472,22 @@ namespace snapper
 
            if (getPreToPostStatus() & PERMISSIONS)
            {
-               chmod(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_mode);
+               if (chmod(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_mode) != 0)
+               {
+                   y2err("chmod failed for " << getAbsolutePath(LOC_SYSTEM));
+                   if (getSnapper()->getRollbackCallback())
+                       getSnapper()->getRollbackCallback()->modifyError(name);
+               }
            }
 
            if (getPreToPostStatus() & (USER | GROUP))
            {
-               lchown(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_uid, fs.st_gid);
+               if (lchown(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_uid, fs.st_gid) != 0)
+               {
+                   y2err("lchown failed for " << getAbsolutePath(LOC_SYSTEM));
+                   if (getSnapper()->getRollbackCallback())
+                       getSnapper()->getRollbackCallback()->modifyError(name);
+               }
            }
        }
 
index d2b9db4b3f529ad690668bbcfcaa3dc458c34d41..60a731b8779d4994b3ad420476f6b2350d4c8e78 100644 (file)
@@ -58,6 +58,10 @@ namespace snapper
        virtual void createInfo(const string& name) = 0;
        virtual void modifyInfo(const string& name) = 0;
        virtual void deleteInfo(const string& name) = 0;
+
+       virtual void createError(const string& name) = 0;
+       virtual void modifyError(const string& name) = 0;
+       virtual void deleteError(const string& name) = 0;
     };
 
 
index b9089f272ca71d9f081d53c36c2ade3d2badb203..f8693eacd99f6251597b818e4581706a26a1f566 100644 (file)
@@ -4,3 +4,4 @@ permissions1
 permissions2
 owner1
 owner2
+error1
index 5f7837bb1a76e6cd40b9328d62e73c1d063850f3..46f12ccde8ca27577533eea5648cb5507d254d8a 100644 (file)
@@ -10,7 +10,7 @@ LDADD = ../snapper/libsnapper.la
 
 noinst_SCRIPTS = run-all
 
-noinst_PROGRAMS = simple1 permissions1 permissions2 owner1 owner2
+noinst_PROGRAMS = simple1 permissions1 permissions2 owner1 owner2 error1
 
 simple1_SOURCES = simple1.cc common.h common.cc
 
@@ -20,5 +20,7 @@ permissions2_SOURCES = permissions2.cc common.h common.cc
 owner1_SOURCES = owner1.cc common.h common.cc
 owner2_SOURCES = owner2.cc common.h common.cc
 
+error1_SOURCES = error1.cc common.h common.cc
+
 EXTRA_DIST = $(noinst_SCRIPTS)
 
index 309fb34e27ac9aaf73d3f5d0b19c4c7bc6f1853d..4faec8b508ac8688ba934d4d394d10268974b2b1 100644 (file)
@@ -27,6 +27,8 @@ Snapper* sh = NULL;
 Snapshots::iterator first;
 Snapshots::iterator second;
 
+unsigned int numCreateErrors, numModifyErrors, numDeleteErrors;
+
 
 struct CompareCallbackImpl : public CompareCallback
 {
@@ -42,9 +44,13 @@ struct RollbackCallbackImpl : public RollbackCallback
     void start() { cout << "running rollback..." << endl; }
     void stop() { cout << "rollback done" << endl; }
 
-    void createInfo(const string& name) { cout << "create " << name << endl; }
-    void modifyInfo(const string& name) { cout << "modify " << name << endl; }
-    void deleteInfo(const string& name) { cout << "delete " << name << endl; }
+    void createInfo(const string& name) { cout << "creating " << name << endl; }
+    void modifyInfo(const string& name) { cout << "modifying " << name << endl; }
+    void deleteInfo(const string& name) { cout << "deleting " << name << endl; }
+
+    void createError(const string& name) { cout << "failed to create " << name << endl; numCreateErrors++; }
+    void modifyError(const string& name) { cout << "failed to modify " << name << endl; numModifyErrors++; }
+    void deleteError(const string& name) { cout << "failed to delete " << name << endl; numDeleteErrors++; }
 };
 
 RollbackCallbackImpl rollback_callback_impl;
@@ -101,6 +107,8 @@ check_rollback_statistics(unsigned int numCreate, unsigned int numModify, unsign
 void
 rollback()
 {
+    numCreateErrors = numModifyErrors = numDeleteErrors = 0;
+
     Comparison comparison(sh, first, second);
 
     Files& files = comparison.getFiles();
@@ -111,6 +119,15 @@ rollback()
 }
 
 
+void
+check_rollback_errors(unsigned int numCreate, unsigned int numModify, unsigned int numDelete)
+{
+    check_equal(numCreateErrors, numCreate);
+    check_equal(numModifyErrors, numModify);
+    check_equal(numDeleteErrors, numDelete);
+}
+
+
 void
 check_first()
 {
index c0679812e2c50ab1ecc256613f807ebe9865b7d5..9983ceda66f8c1568681c943b76be177b10f477b 100644 (file)
@@ -49,6 +49,8 @@ void second_snapshot();
 void check_rollback_statistics(unsigned int numCreate, unsigned int numModify,
                               unsigned int numDelete);
 void rollback();
+void check_rollback_errors(unsigned int numCreate, unsigned int numModify,
+                          unsigned int numDelete);
 void check_first();
 
 void run_command(const char* command);
diff --git a/testsuite-real/error1.cc b/testsuite-real/error1.cc
new file mode 100644 (file)
index 0000000..4a7a4de
--- /dev/null
@@ -0,0 +1,30 @@
+
+#include <stdlib.h>
+#include <iostream>
+
+#include "common.h"
+
+using namespace std;
+
+
+int
+main()
+{
+    setup();
+
+    first_snapshot();
+
+    run_command("mkdir not-empty");
+
+    second_snapshot();
+
+    run_command("touch not-empty/bad");
+
+    check_rollback_statistics(0, 0, 1);
+
+    rollback();
+
+    check_rollback_errors(0, 0, 1);
+
+    exit(EXIT_SUCCESS);
+}
index cd9678271c3c1c7b10c743c99e7d3ed079ff0922..fe362ab7349db9b01f0d7c0f0c1238b498dfaee2 100644 (file)
@@ -33,6 +33,8 @@ main()
 
     rollback();
 
+    check_rollback_errors(0, 0, 0);
+
     check_first();
 
     exit(EXIT_SUCCESS);
index d8d41244d0b6e398aee45240726d6c9164a60ec9..65b25d2f6d1ade4e1f2aedc20b33e147dc855cbd 100644 (file)
@@ -28,6 +28,8 @@ main()
 
     rollback();
 
+    check_rollback_errors(0, 0, 0);
+
     check_first();
 
     exit(EXIT_SUCCESS);
index a88cbd853da9688f1ba0d93d801e09f9b75f745a..c392dc8857d57139e22e72e73884285044f36762 100644 (file)
@@ -34,6 +34,8 @@ main()
 
     rollback();
 
+    check_rollback_errors(0, 0, 0);
+
     check_first();
 
     exit(EXIT_SUCCESS);
index c95a7805c170eb037e41b3c0f26cb27805e66c72..da611249fbc63bb178db1ff95656a8b2c5d9dd13 100644 (file)
@@ -28,6 +28,8 @@ main()
 
     rollback();
 
+    check_rollback_errors(0, 0, 0);
+
     check_first();
 
     exit(EXIT_SUCCESS);
index 8b516aa6d5f1fbcca0da22f273e22bfd25be9978..5df763cee7e439708dd40be21a5b7874cdbcef7b 100755 (executable)
@@ -28,3 +28,5 @@ run permissions2
 run owner1
 run owner2
 
+run error1
+
index e9087bc0a81ba970304410530bd977f9bac41a00..21abcbf20e2a3cb3952c6543bb0c8abde12d08ba 100644 (file)
@@ -32,6 +32,8 @@ main()
 
     rollback();
 
+    check_rollback_errors(0, 0, 0);
+
     check_first();
 
     exit(EXIT_SUCCESS);
index 7de47e11dfbaedce32ae81146a62eb0a687dd52a..567d2122fa95ba5328c0eed36828ec595d47850d 100644 (file)
@@ -706,12 +706,16 @@ CompareCallbackImpl compare_callback_impl;
 
 struct RollbackCallbackImpl : public RollbackCallback
 {
-    void start() { if (!verbose) cout << "running rollback..." << flush; }
-    void stop() { if (!verbose) cout << " done" << endl; }
+    void start() { cout << "running rollback..." << endl; }
+    void stop() { cout << "rollback done" << endl; }
 
-    void createInfo(const string& name) { if (verbose) cout << "create " << name << endl; }
-    void modifyInfo(const string& name) { if (verbose) cout << "modify " << name << endl; }
-    void deleteInfo(const string& name) { if (verbose) cout << "delete " << name << endl; }
+    void createInfo(const string& name) { if (verbose) cout << "creating " << name << endl; }
+    void modifyInfo(const string& name) { if (verbose) cout << "modifying " << name << endl; }
+    void deleteInfo(const string& name) { if (verbose) cout << "deleting " << name << endl; }
+
+    void createError(const string& name) { cerr << "failed to create " << name << endl; }
+    void modifyError(const string& name) { cerr << "failed to modify " << name << endl; }
+    void deleteError(const string& name) { cerr << "failed to delete " << name << endl; }
 };
 
 RollbackCallbackImpl rollback_callback_impl;