Hello community,

here is the log from the commit of package snapper for openSUSE:Factory checked 
in at 2014-03-06 19:18:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/snapper (Old)
 and      /work/SRC/openSUSE:Factory/.snapper.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "snapper"

Changes:
--------
--- /work/SRC/openSUSE:Factory/snapper/snapper.changes  2014-02-21 
19:43:24.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.snapper.new/snapper.changes     2014-03-06 
19:18:16.000000000 +0100
@@ -1,0 +2,10 @@
+Mon Mar 03 17:20:41 CET 2014 - aschn...@suse.de
+
+- fixed empty-pre-post cleanup algorithm
+
+-------------------------------------------------------------------
+Fri Feb 28 11:47:22 CET 2014 - aschn...@suse.de
+
+- fixed setting setuid bit during undochange (bnc#862964)
+
+-------------------------------------------------------------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ snapper-0.2.1.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/client/cleanup.cc 
new/snapper-0.2.1/client/cleanup.cc
--- old/snapper-0.2.1/client/cleanup.cc 2014-01-29 16:48:30.000000000 +0100
+++ new/snapper-0.2.1/client/cleanup.cc 2014-03-03 17:32:41.000000000 +0100
@@ -362,6 +362,8 @@
                    tmp.push_back(it1);
                    tmp.push_back(it2);
                }
+
+               command_delete_xcomparison(conn, config_name, it1->getNum(), 
it2->getNum());
            }
        }
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/client/commands.cc 
new/snapper-0.2.1/client/commands.cc
--- old/snapper-0.2.1/client/commands.cc        2014-01-29 16:48:30.000000000 
+0100
+++ new/snapper-0.2.1/client/commands.cc        2014-03-03 17:32:41.000000000 
+0100
@@ -294,6 +294,19 @@
 }
 
 
+void
+command_delete_xcomparison(DBus::Connection& conn, const string& config_name, 
unsigned int number1,
+                          unsigned int number2)
+{
+    DBus::MessageMethodCall call(SERVICE, OBJECT, INTERFACE, 
"DeleteComparison");
+
+    DBus::Hoho hoho(call);
+    hoho << config_name << number1 << number2;
+
+    conn.send_with_reply_and_block(call);
+}
+
+
 list<XFile>
 command_get_xfiles(DBus::Connection& conn, const string& config_name, unsigned 
int number1,
                   unsigned int number2)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/client/commands.h 
new/snapper-0.2.1/client/commands.h
--- old/snapper-0.2.1/client/commands.h 2014-01-29 16:48:30.000000000 +0100
+++ new/snapper-0.2.1/client/commands.h 2014-03-03 17:32:41.000000000 +0100
@@ -95,6 +95,10 @@
 command_create_xcomparison(DBus::Connection& conn, const string& config_name, 
unsigned int number1,
                           unsigned int number2);
 
+void
+command_delete_xcomparison(DBus::Connection& conn, const string& config_name, 
unsigned int number1,
+                          unsigned int number2);
+
 list<XFile>
 command_get_xfiles(DBus::Connection& conn, const string& config_name, unsigned 
int number1,
                   unsigned int number2);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/doc/snapper.xml.in 
new/snapper-0.2.1/doc/snapper.xml.in
--- old/snapper-0.2.1/doc/snapper.xml.in        2014-01-31 10:38:25.000000000 
+0100
+++ new/snapper-0.2.1/doc/snapper.xml.in        2014-02-27 14:50:22.000000000 
+0100
@@ -422,6 +422,38 @@
              </listitem>
            </varlistentry>
          </variablelist>
+         <para>The output consists of a string encoding the status followed by
+         the filename. The characters of the status string are:</para>
+         <orderedlist>
+           <listitem>
+             <para>A "<computeroutput>+</computeroutput>" means the file was
+             created, a "<computeroutput>-</computeroutput>" means the file 
was deleted. A
+             "<computeroutput>c</computeroutput>" means the content of the 
file has changed
+             and a "<computeroutput>t</computeroutput>" means the type of the 
file has
+             changed (e.g. from regular file to directory).</para>
+           </listitem>
+           <listitem>
+             <para>A "<computeroutput>p</computeroutput>" means the permissions
+             are have changed.</para>
+           </listitem>
+           <listitem>
+             <para>An "<computeroutput>u</computeroutput>" means the user
+             ownership has changed.</para>
+           </listitem>
+           <listitem>
+             <para>A "<computeroutput>g</computeroutput>" means the group
+             ownership has changed.</para>
+           </listitem>
+           <listitem>
+             <para>A "<computeroutput>x</computeroutput>" means the extended
+             attribute information has changed.</para>
+           </listitem>
+           <listitem>
+             <para>An "<computeroutput>a</computeroutput>" means the ACL
+             information has changed.</para>
+           </listitem>
+         </orderedlist>
+         <para>If there is no change a "." is outputted.</para>
        </listitem>
       </varlistentry>
 
@@ -462,11 +494,9 @@
       <varlistentry>
        <term><option>xadiff 
<replaceable>number1</replaceable>..<replaceable>number2</replaceable> 
[files]</option></term>
        <listitem>
-
          <para>Compare the extended attributes between snapshot
          <replaceable>number1</replaceable> and
          <replaceable>number2</replaceable>. See examples below:</para>
-
          <itemizedlist>
            <listitem>
              <para><computeroutput> +:user.foo</computeroutput> for created 
attributes</para>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/Acls.cc 
new/snapper-0.2.1/snapper/Acls.cc
--- old/snapper-0.2.1/snapper/Acls.cc   1970-01-01 01:00:00.000000000 +0100
+++ new/snapper-0.2.1/snapper/Acls.cc   2014-02-26 11:17:13.000000000 +0100
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) [2014] Red Hat, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as published
+ * by the Free Software Foundation.
+ *
+ * This program 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
USA.
+ *
+ */
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "snapper/Acls.h"
+#include "snapper/AppUtil.h"
+#include "snapper/Exception.h"
+#include "snapper/Log.h"
+#include "snapper/SnapperTmpl.h"
+
+namespace snapper
+{
+    bool
+    is_acl_signature(const std::string& name)
+    {
+       return contains(_acl_signatures, name);
+    }
+
+    Acls::Acls(const string& path)
+    : allowed_types(0x0), acl_access(NULL), acl_default(NULL)
+    {
+       struct stat buf;
+
+       int fd = ::open(path.c_str(), O_RDONLY | O_NOFOLLOW | O_NONBLOCK | 
O_NOATIME |
+                         O_CLOEXEC);
+       if (fd < 0)
+       {
+           if (errno == ELOOP)
+           {
+               y2deb("can't read ACLs from symlink '" << path << "' itself");
+               return;
+           }
+
+           if (stat(path.c_str(), &buf) < 0)
+           {
+               y2err("stat failed errno: " << errno << " (" << 
stringerror(errno) << ")");
+               throw AclException();
+           }
+       }
+       else
+       {
+           if (fstat(fd, &buf) < 0)
+           {
+               y2err("fstat failed errno: " << errno << " (" << 
stringerror(errno) << ")");
+               ::close(fd);
+               throw AclException();
+           }
+
+           acl_access = acl_get_fd(fd);
+           if (!acl_access)
+           {
+               y2err("acl_get_fd failed errno: " << errno << " (" << 
stringerror(errno) << ")");
+               ::close(fd);
+               throw AclException();
+           }
+
+           ::close(fd);
+           allowed_types = ACL_TYPE_ACCESS;
+       }
+
+       allowed_types |= (S_ISDIR(buf.st_mode)) ? ACL_TYPE_DEFAULT : 0x0;
+
+       // in case open failed for some reason
+       if (!(allowed_types & ACL_TYPE_ACCESS))
+       {
+           allowed_types |= ACL_TYPE_ACCESS;
+           acl_access = acl_get_file(path.c_str(), ACL_TYPE_ACCESS);
+           if (!acl_access)
+           {
+               y2err("acl_get_file failed errno: " << errno << " (" << 
stringerror(errno) << ")");
+               throw AclException();
+           }
+       }
+
+       // ACL_TYPE_DEFAULT can't be read from fd
+       if (allowed_types & ACL_TYPE_DEFAULT)
+       {
+           acl_default = acl_get_file(path.c_str(), ACL_TYPE_DEFAULT);
+           if (!acl_default)
+           {
+               y2err("acl_get_file failed errno: " << errno << " (" << 
stringerror(errno) << ")");
+               if (acl_free(acl_access))
+               {
+                   y2err("acl_free failed errno: " << errno << " (" << 
stringerror(errno) << ")");
+               }
+
+               throw AclException();
+           }
+       }
+    }
+
+
+    Acls::~Acls()
+    {
+       if (acl_access)
+           acl_free(acl_access);
+       if (acl_default)
+           acl_free(acl_default);
+    }
+
+
+    void
+    Acls::serializeTo(const string& path) const
+    {
+       if (empty())
+           return;
+
+       if (acl_set_file(path.c_str(), ACL_TYPE_ACCESS, acl_access))
+       {
+           y2err("acl_set_file failed errno: " << errno << " (" << 
stringerror(errno) << ")");
+           throw AclException();
+       }
+
+       if (get_acl_types() & ACL_TYPE_DEFAULT)
+       {
+           if (acl_set_file(path.c_str(), ACL_TYPE_DEFAULT, acl_default))
+           {
+               y2err("acl_set_file failed errno: " << errno << " (" << 
stringerror(errno) << ")");
+               throw AclException();
+           }
+       }
+    }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/Acls.h 
new/snapper-0.2.1/snapper/Acls.h
--- old/snapper-0.2.1/snapper/Acls.h    1970-01-01 01:00:00.000000000 +0100
+++ new/snapper-0.2.1/snapper/Acls.h    2014-02-26 11:17:13.000000000 +0100
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) [2014] Red Hat, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as published
+ * by the Free Software Foundation.
+ *
+ * This program 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
USA.
+ *
+ */
+
+#ifndef SNAPPER_ACLS_H
+#define SNAPPER_ACLS_H
+
+#include <string>
+#include <vector>
+#include <sys/acl.h>
+
+#include <boost/assign/list_of.hpp>
+
+#ifndef ENABLE_ACL_SIGNATURES
+#define ENABLE_ACL_SIGNATURES  ("system.posix_acl_access") \
+                               ("system.posix_acl_default") \
+                               ("trusted.SGI_ACL_FILE") \
+                               ("trusted.SGI_ACL_DEFAULT")
+#endif
+
+namespace snapper
+{
+    using std::string;
+
+    const std::vector<string> _acl_signatures = boost::assign::list_of 
ENABLE_ACL_SIGNATURES;
+
+    bool is_acl_signature(const string& name);
+
+    class Acls
+    {
+    public:
+
+       Acls(const string& path);
+       ~Acls();
+
+       acl_type_t get_acl_types() const { return allowed_types; }
+       bool empty() const { return allowed_types == 0x0; }
+       void serializeTo(const string& path) const;
+
+    private:
+
+       acl_type_t allowed_types;
+       acl_t acl_access;
+       acl_t acl_default;
+    };
+
+}
+#endif //SNAPPER_ACLS_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/Btrfs.cc 
new/snapper-0.2.1/snapper/Btrfs.cc
--- old/snapper-0.2.1/snapper/Btrfs.cc  2014-02-03 16:47:51.000000000 +0100
+++ new/snapper-0.2.1/snapper/Btrfs.cc  2014-02-26 18:11:56.000000000 +0100
@@ -47,6 +47,7 @@
 #include "snapper/Snapper.h"
 #include "snapper/SnapperTmpl.h"
 #include "snapper/SnapperDefines.h"
+#include "snapper/Acls.h"
 
 
 namespace snapper
@@ -450,10 +451,10 @@
        if (status & CREATED) status = CREATED;
        if (status & DELETED) status = DELETED;
 
-       if (status & (CONTENT | PERMISSIONS | USER | GROUP | XATTRS))
+       if (status & (CONTENT | PERMISSIONS | OWNER | GROUP | XATTRS | ACL))
        {
            // TODO check for content sometimes not required
-           status &= ~(CONTENT | PERMISSIONS | USER | GROUP | XATTRS);
+           status &= ~(CONTENT | PERMISSIONS | OWNER | GROUP | XATTRS | ACL);
 
            string dirname = snapper::dirname(name);
            string basename = snapper::basename(name);
@@ -546,7 +547,7 @@
        else
        {
            node->status &= ~(CREATED | DELETED);
-           node->status |= CONTENT | PERMISSIONS | USER | GROUP | XATTRS;
+           node->status |= CONTENT | PERMISSIONS | OWNER | GROUP | XATTRS | 
ACL;
        }
     }
 
@@ -679,7 +680,7 @@
                else
                {
                    node->status &= ~(CREATED | DELETED);
-                   node->status |= CONTENT | PERMISSIONS | USER | GROUP | 
XATTRS;
+                   node->status |= CONTENT | PERMISSIONS | OWNER | GROUP | 
XATTRS | ACL;
                }
 
                merge(processor, &it->second, from, to, x);
@@ -697,7 +698,7 @@
                else
                {
                    node->status &= ~(CREATED | DELETED);
-                   node->status |= CONTENT | PERMISSIONS | USER | GROUP | 
XATTRS;
+                   node->status |= CONTENT | PERMISSIONS | OWNER | GROUP | 
XATTRS | ACL;
                }
 
                merge(processor, &it->second, from, to, x);
@@ -854,6 +855,14 @@
 
        tree_node* node = processor->files.insert(path);
        node->status |= XATTRS;
+
+       if (is_acl_signature(name))
+       {
+           #ifdef DEBUG_PROCESS
+               y2deb("adding acl flag, signature:'" << name << "'");
+           #endif
+           node->status |= ACL;
+       }
 #endif
 
        return 0;
@@ -872,6 +881,14 @@
 
        tree_node* node = processor->files.insert(path);
        node->status |= XATTRS;
+
+       if (is_acl_signature(name))
+       {
+           #ifdef DEBUG_PROCESS
+               y2deb("adding acl flag, signature:'" << name << "'");
+           #endif
+           node->status |= ACL;
+       }
 #endif
 
        return 0;
@@ -920,7 +937,7 @@
 #endif
 
        tree_node* node = processor->files.insert(path);
-       node->status |= USER | GROUP;
+       node->status |= OWNER | GROUP;
 
        return 0;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/Compare.cc 
new/snapper-0.2.1/snapper/Compare.cc
--- old/snapper-0.2.1/snapper/Compare.cc        2014-01-29 16:48:30.000000000 
+0100
+++ new/snapper-0.2.1/snapper/Compare.cc        2014-02-26 18:11:56.000000000 
+0100
@@ -38,6 +38,7 @@
 #include "snapper/Compare.h"
 #include "snapper/Exception.h"
 #include "snapper/XAttributes.h"
+#include "snapper/Acls.h"
 
 
 namespace snapper
@@ -211,7 +212,7 @@
 
        if (stat1.st_uid != stat2.st_uid)
        {
-           status |= USER;
+           status |= OWNER;
        }
 
        if (stat1.st_gid != stat2.st_gid)
@@ -222,10 +223,7 @@
 #ifdef ENABLE_XATTRS
        if (file1.xaSupported() && file2.xaSupported())
        {
-           if (!cmpFilesXattrs(file1, file2))
-           {
-               status |= XATTRS;
-           }
+           status |= cmpFilesXattrs(file1, file2);
        }
 #endif
 
@@ -467,19 +465,34 @@
     }
 
 
-    bool
+    unsigned int
     cmpFilesXattrs(const SFile& file1, const SFile& file2)
     {
         try
         {
            XAttributes xa(file1);
            XAttributes xb(file2);
-           return xa == xb;
+
+           if (xa == xb)
+           {
+               return 0;
+           }
+           else
+           {
+               unsigned int status = XATTRS;
+
+               CompareAcls acl_a(xa);
+               CompareAcls acl_b(xb);
+
+               status |= (acl_a == acl_b) ? 0 : ACL;
+
+               return status;
+           }
         }
        catch (const XAttributesException& e)
         {
-            y2err("extended attributes compare failed");
-           return false;
+           y2err("extended attributes or ACL compare failed");
+           return (XATTRS | ACL);
        }
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/Compare.h 
new/snapper-0.2.1/snapper/Compare.h
--- old/snapper-0.2.1/snapper/Compare.h 2014-01-29 16:48:30.000000000 +0100
+++ new/snapper-0.2.1/snapper/Compare.h 2014-02-26 11:17:13.000000000 +0100
@@ -48,7 +48,9 @@
     void
     cmpDirs(const SDir& dir1, const SDir& dir2, cmpdirs_cb_t cb);
 
-    bool
+    /* Compares the two files extended attributes and ACLs.
+       Returns 0 or XATTRS or (XATTRS | ACL) */
+    unsigned int
     cmpFilesXattrs(const SFile&, const SFile&);
 
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/File.cc 
new/snapper-0.2.1/snapper/File.cc
--- old/snapper-0.2.1/snapper/File.cc   2014-01-29 16:48:30.000000000 +0100
+++ new/snapper-0.2.1/snapper/File.cc   2014-02-28 13:36:50.000000000 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) [2011-2013] Novell, Inc.
+ * Copyright (c) [2011-2014] Novell, Inc.
  *
  * All Rights Reserved.
  *
@@ -40,6 +40,7 @@
 #include "snapper/Compare.h"
 #include "snapper/Exception.h"
 #include "snapper/XAttributes.h"
+#include "snapper/Acls.h"
 
 
 namespace snapper
@@ -333,16 +334,16 @@
            }
        }
 
-       if (chmod(getAbsolutePath(LOC_SYSTEM).c_str(), mode) != 0)
+       if (chown(getAbsolutePath(LOC_SYSTEM).c_str(), owner, group) != 0)
        {
-           y2err("chmod failed path:" << getAbsolutePath(LOC_SYSTEM) << " 
errno:" << errno <<
+           y2err("chown failed path:" << getAbsolutePath(LOC_SYSTEM) << " 
errno:" << errno <<
                  " (" << stringerror(errno) << ")");
            return false;
        }
 
-       if (chown(getAbsolutePath(LOC_SYSTEM).c_str(), owner, group) != 0)
+       if (chmod(getAbsolutePath(LOC_SYSTEM).c_str(), mode) != 0)
        {
-           y2err("chown failed path:" << getAbsolutePath(LOC_SYSTEM) << " 
errno:" << errno <<
+           y2err("chmod failed path:" << getAbsolutePath(LOC_SYSTEM) << " 
errno:" << errno <<
                  " (" << stringerror(errno) << ")");
            return false;
        }
@@ -370,19 +371,19 @@
            return false;
        }
 
-       int r1 = fchmod(dest_fd, mode);
+       int r1 = fchown(dest_fd, owner, group);
        if (r1 != 0)
        {
-           y2err("fchmod failed errno:" << errno << " (" << stringerror(errno) 
<< ")");
+           y2err("fchown failed errno:" << errno << " (" << stringerror(errno) 
<< ")");
            close(dest_fd);
            close(src_fd);
            return false;
        }
 
-       int r2 = fchown(dest_fd, owner, group);
+       int r2 = fchmod(dest_fd, mode);
        if (r2 != 0)
        {
-           y2err("fchown failed errno:" << errno << " (" << stringerror(errno) 
<< ")");
+           y2err("fchmod failed errno:" << errno << " (" << stringerror(errno) 
<< ")");
            close(dest_fd);
            close(src_fd);
            return false;
@@ -503,23 +504,26 @@
                }
            }
 
-           if (getPreToPostStatus() & PERMISSIONS)
+           if (getPreToPostStatus() & (OWNER | GROUP))
            {
-               if (chmod(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_mode) != 0)
+               if (lchown(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_uid, 
fs.st_gid) != 0)
                {
-                   y2err("chmod failed path:" << getAbsolutePath(LOC_SYSTEM) 
<< " errno:" <<
-                         errno << " (" << stringerror(errno) << ")");
+                   y2err("lchown failed path:" << getAbsolutePath(LOC_SYSTEM) 
<< " errno:" <<
+                         errno <<  " (" << stringerror(errno) << ")");
                    return false;
                }
            }
 
-           if (getPreToPostStatus() & (USER | GROUP))
+           if (getPreToPostStatus() & (OWNER | GROUP | PERMISSIONS))
            {
-               if (lchown(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_uid, 
fs.st_gid) != 0)
+               if (!S_ISLNK(fs.st_mode))
                {
-                   y2err("lchown failed path:" << getAbsolutePath(LOC_SYSTEM) 
<< " errno:" <<
-                         errno <<  " (" << stringerror(errno) << ")");
-                   return false;
+                   if (chmod(getAbsolutePath(LOC_SYSTEM).c_str(), fs.st_mode) 
!= 0)
+                   {
+                       y2err("chmod failed path:" << 
getAbsolutePath(LOC_SYSTEM) << " errno:" <<
+                             errno << " (" << stringerror(errno) << ")");
+                       return false;
+                   }
                }
            }
        }
@@ -540,6 +544,8 @@
             XAModification xa_mod(xa_src, xa_dest);
             y2deb("xa_modmap(xa_dest) object: " << xa_mod);
 
+           xa_mod.filterOutAcls();
+
             xaCreated = xa_mod.getXaCreateNum();
             xaDeleted = xa_mod.getXaDeleteNum();
             xaReplaced = xa_mod.getXaReplaceNum();
@@ -556,6 +562,28 @@
         return ret_val;
     }
 
+
+    bool
+    File::modifyAcls()
+    {
+       bool ret_val;
+
+       try
+       {
+           Acls acl(getAbsolutePath(LOC_PRE));
+           acl.serializeTo(getAbsolutePath(LOC_SYSTEM));
+
+           ret_val = true;
+       }
+       catch (const AclException& e)
+       {
+           ret_val = false;
+       }
+
+       return ret_val;
+    }
+
+
     XAUndoStatistic& operator+=(XAUndoStatistic &out, const XAUndoStatistic 
&src)
     {
         out.numCreate += src.numCreate;
@@ -611,7 +639,7 @@
                error = true;
        }
 
-       if (getPreToPostStatus() & (CONTENT | PERMISSIONS | USER | GROUP))
+       if (getPreToPostStatus() & (CONTENT | PERMISSIONS | OWNER | GROUP))
        {
            if (!modifyAllTypes())
                error = true;
@@ -628,6 +656,12 @@
             if (!modifyXattributes())
                 error = true;
         }
+
+        if (getPreToPostStatus() & (ACL | TYPE | DELETED))
+       {
+           if (!modifyAcls())
+               error = true;
+       }
 #endif
 
        pre_to_system_status = (unsigned int) -1;
@@ -711,6 +745,9 @@
     string
     statusToString(unsigned int status)
     {
+       // If possible keep the characters in sync with e.g. rpm or
+       // rsync. Unfortunately rpm and rsync are not consistent.
+
        string ret;
 
        if (status & CREATED)
@@ -725,9 +762,10 @@
            ret += ".";
 
        ret += status & PERMISSIONS ? "p" : ".";
-       ret += status & USER ? "u" : ".";
+       ret += status & OWNER ? "u" : ".";
        ret += status & GROUP ? "g" : ".";
-        ret += status & XATTRS ? "x" : ".";
+       ret += status & XATTRS ? "x" : ".";
+       ret += status & ACL ? "a" : ".";
 
        return ret;
     }
@@ -758,7 +796,7 @@
        if (str.length() >= 3)
        {
            if (str[2] == 'u')
-               ret |= USER;
+               ret |= OWNER;
        }
 
        if (str.length() >= 4)
@@ -768,10 +806,16 @@
        }
 
        if (str.length() >= 5)
-        {
-            if (str[4] == 'x')
-                ret |= XATTRS;
-        }
+       {
+           if (str[4] == 'x')
+               ret |= XATTRS;
+       }
+
+       if (str.length() >= 6)
+       {
+           if (str[5] == 'a')
+               ret |= ACL;
+       }
 
        return ret;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/File.h 
new/snapper-0.2.1/snapper/File.h
--- old/snapper-0.2.1/snapper/File.h    2014-01-29 16:48:30.000000000 +0100
+++ new/snapper-0.2.1/snapper/File.h    2014-02-26 18:11:56.000000000 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) [2011-2012] Novell, Inc.
+ * Copyright (c) [2011-2014] Novell, Inc.
  *
  * All Rights Reserved.
  *
@@ -38,8 +38,16 @@
 
     enum StatusFlags
     {
-       CREATED = 1, DELETED = 2, TYPE = 4, CONTENT = 8, PERMISSIONS = 16, USER 
= 32,
-       GROUP = 64, XATTRS = 128
+       CREATED = 1,            // created
+       DELETED = 2,            // deleted
+       TYPE = 4,               // type has changed
+       CONTENT = 8,            // content has changed
+       PERMISSIONS = 16,       // permissions have changed, see chmod(2)
+       OWNER = 32,             // owner has changed, see chown(2)
+       USER = 32,              // deprecated - alias for OWNER
+       GROUP = 64,             // group has changed, see chown(2)
+       XATTRS = 128,           // extended attributes changed, see attr(5)
+       ACL = 256               // access control list changed, see acl(5)
     };
 
     enum Cmp
@@ -156,6 +164,7 @@
        bool undo;
 
        bool modifyXattributes();
+       bool modifyAcls();
 
        unsigned int xaCreated;
        unsigned int xaDeleted;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/Makefile.am 
new/snapper-0.2.1/snapper/Makefile.am
--- old/snapper-0.2.1/snapper/Makefile.am       2014-01-29 16:48:30.000000000 
+0100
+++ new/snapper-0.2.1/snapper/Makefile.am       2014-02-26 11:17:13.000000000 
+0100
@@ -26,12 +26,12 @@
        SystemCmd.cc            SystemCmd.h             \
        AsciiFile.cc            AsciiFile.h             \
        Regex.cc                Regex.h                 \
+       Acls.cc                 Acls.h                  \
        Exception.h                                     \
        SnapperTmpl.h                                   \
        SnapperTypes.h                                  \
        SnapperDefines.h                                \
-       Version.h                                       \
-       $(TMP_XA)
+       Version.h
 
 
 if ENABLE_BTRFS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/Makefile.in 
new/snapper-0.2.1/snapper/Makefile.in
--- old/snapper-0.2.1/snapper/Makefile.in       2014-02-11 14:40:13.000000000 
+0100
+++ new/snapper-0.2.1/snapper/Makefile.in       2014-03-03 17:33:12.000000000 
+0100
@@ -141,18 +141,18 @@
        Enum.cc Enum.h AppUtil.cc AppUtil.h FileUtils.cc FileUtils.h \
        XAttributes.cc XAttributes.h Log.cc Log.h Logger.cc Logger.h \
        Compare.cc Compare.h SystemCmd.cc SystemCmd.h AsciiFile.cc \
-       AsciiFile.h Regex.cc Regex.h Exception.h SnapperTmpl.h \
-       SnapperTypes.h SnapperDefines.h Version.h Btrfs.cc Btrfs.h \
-       BtrfsUtils.cc BtrfsUtils.h Ext4.cc Ext4.h Lvm.cc Lvm.h \
-       LvmCache.cc LvmCache.h
+       AsciiFile.h Regex.cc Regex.h Acls.cc Acls.h Exception.h \
+       SnapperTmpl.h SnapperTypes.h SnapperDefines.h Version.h \
+       Btrfs.cc Btrfs.h BtrfsUtils.cc BtrfsUtils.h Ext4.cc Ext4.h \
+       Lvm.cc Lvm.h LvmCache.cc LvmCache.h
 @ENABLE_BTRFS_TRUE@am__objects_1 = Btrfs.lo BtrfsUtils.lo
 @ENABLE_EXT4_TRUE@am__objects_2 = Ext4.lo
 @ENABLE_LVM_TRUE@am__objects_3 = Lvm.lo LvmCache.lo
 am_libsnapper_la_OBJECTS = Factory.lo Snapper.lo Snapshot.lo \
        Comparison.lo Filesystem.lo File.lo XmlFile.lo Enum.lo \
        AppUtil.lo FileUtils.lo XAttributes.lo Log.lo Logger.lo \
-       Compare.lo SystemCmd.lo AsciiFile.lo Regex.lo $(am__objects_1) \
-       $(am__objects_2) $(am__objects_3)
+       Compare.lo SystemCmd.lo AsciiFile.lo Regex.lo Acls.lo \
+       $(am__objects_1) $(am__objects_2) $(am__objects_3)
 libsnapper_la_OBJECTS = $(am_libsnapper_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -394,8 +394,8 @@
        Enum.cc Enum.h AppUtil.cc AppUtil.h FileUtils.cc FileUtils.h \
        XAttributes.cc XAttributes.h Log.cc Log.h Logger.cc Logger.h \
        Compare.cc Compare.h SystemCmd.cc SystemCmd.h AsciiFile.cc \
-       AsciiFile.h Regex.cc Regex.h Exception.h SnapperTmpl.h \
-       SnapperTypes.h SnapperDefines.h Version.h $(TMP_XA) \
+       AsciiFile.h Regex.cc Regex.h Acls.cc Acls.h Exception.h \
+       SnapperTmpl.h SnapperTypes.h SnapperDefines.h Version.h \
        $(am__append_1) $(am__append_2) $(am__append_3)
 libsnapper_la_LDFLAGS = -version-info @LIBVERSION_INFO@
 libsnapper_la_LIBADD = -lboost_thread-mt -lboost_system-mt -lxml2 -lacl -lz -lm
@@ -491,6 +491,7 @@
 distclean-compile:
        -rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Acls.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AppUtil.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/AsciiFile.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Btrfs.Plo@am__quote@
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/XAttributes.cc 
new/snapper-0.2.1/snapper/XAttributes.cc
--- old/snapper-0.2.1/snapper/XAttributes.cc    2014-01-29 16:48:30.000000000 
+0100
+++ new/snapper-0.2.1/snapper/XAttributes.cc    2014-02-26 11:17:13.000000000 
+0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) [2013] Red Hat, Inc.
+ * Copyright (c) [2013-2014] Red Hat, Inc.
  *
  * All Rights Reserved.
  *
@@ -29,15 +29,51 @@
 #include <errno.h>
 #include <iomanip>
 #include <boost/scoped_array.hpp>
+#include <algorithm>
 
 #include "snapper/AppUtil.h"
 #include "snapper/Exception.h"
 #include "snapper/Log.h"
 #include "snapper/XAttributes.h"
+#include "snapper/Acls.h"
+#include "snapper/SnapperTmpl.h"
 
 
 namespace snapper
 {
+    struct FilterAclsHelper
+    {
+       FilterAclsHelper(const vector<string>& acl_sigs)
+           : acl_sigs(acl_sigs) {}
+
+       bool operator()(const xa_pair_t& pair)
+       {
+           return contains(acl_sigs, pair.first);
+       }
+
+       bool operator()(const string& name)
+       {
+           return contains(acl_sigs, name);
+       }
+
+       const vector<string>& acl_sigs;
+    };
+
+
+    struct InsertAclsHelper
+    {
+       InsertAclsHelper(xa_map_t& xamap, const vector<string>& acl_sigs)
+       : map(xamap), acl_sigs(acl_sigs) {}
+       void operator()(const xa_pair_t& xapair)
+       {
+           if (contains(acl_sigs, xapair.first))
+               map.insert(xapair);
+       }
+
+       xa_map_t& map;
+       const vector<string>& acl_sigs;
+    };
+
 
     XAttributes::XAttributes(const string &path)
     {
@@ -73,6 +109,7 @@
             // move beyond separating '\0' char
             pos += name.length() + 1;
 
+
             ssize_t v_size = lgetxattr(path.c_str(), name.c_str(), NULL, 0);
             if (v_size < 0)
             {
@@ -180,6 +217,7 @@
         return (this == &xa) ? true : (this->xamap == xa.xamap);
     }
 
+
     ostream&
     operator<<(ostream &out, const XAttributes &xa)
     {
@@ -194,6 +232,7 @@
         return out;
     }
 
+
     ostream&
     operator<<(ostream &out, const xa_value_t &xavalue)
     {
@@ -262,14 +301,17 @@
            y2deb("adding create operation for " << src_cit->first);
             create_vec.push_back(xa_pair_t(src_cit->first, src_cit->second));
        }
+
     }
 
+
     bool
     XAModification::empty() const
     {
        return create_vec.empty() && delete_vec.empty() && replace_vec.empty();
     }
 
+
     bool
     XAModification::serializeTo(const string &dest) const
     {
@@ -336,24 +378,28 @@
        return true;
     }
 
+
     unsigned int
     XAModification::getXaCreateNum() const
     {
         return create_vec.size();
     }
 
+
     unsigned int
     XAModification::getXaDeleteNum() const
     {
         return delete_vec.size();
     }
 
+
     unsigned int
     XAModification::getXaReplaceNum() const
     {
         return replace_vec.size();
     }
 
+
     void
     XAModification::printTo(ostream& out, bool diff) const
     {
@@ -381,16 +427,46 @@
        }
     }
 
+
     void
     XAModification::dumpDiffReport(ostream& out) const
     {
        printTo(out, true);
     }
 
+
     ostream&
     operator<<(ostream &out, const XAModification &xa_mod)
     {
        xa_mod.printTo(out, false);
         return out;
     }
+
+
+    CompareAcls::CompareAcls(const XAttributes& xa)
+    {
+       std::for_each(xa.cbegin(), xa.cend(), InsertAclsHelper(xamap, 
_acl_signatures));
+    }
+
+
+    bool
+    CompareAcls::operator==(const CompareAcls& acls) const
+    {
+       return (this == &acls) ? true : (this->xamap == acls.xamap);
+    }
+
+
+    void
+    XAModification::filterOutAcls()
+    {
+       FilterAclsHelper fhelper(_acl_signatures);
+
+       create_vec.erase(std::remove_if(create_vec.begin(), create_vec.end(), 
fhelper),
+                        create_vec.end());
+       delete_vec.erase(std::remove_if(delete_vec.begin(), delete_vec.end(), 
fhelper),
+                        delete_vec.end());
+       replace_vec.erase(std::remove_if(replace_vec.begin(), 
replace_vec.end(), fhelper),
+                         replace_vec.end());
+    }
+
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/snapper/XAttributes.h 
new/snapper-0.2.1/snapper/XAttributes.h
--- old/snapper-0.2.1/snapper/XAttributes.h     2014-01-29 16:48:30.000000000 
+0100
+++ new/snapper-0.2.1/snapper/XAttributes.h     2014-02-26 11:17:13.000000000 
+0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) [2013] Red Hat, Inc.
+ * Copyright (c) [2013-2014] Red Hat, Inc.
  *
  * All Rights Reserved.
  *
@@ -33,65 +33,76 @@
 
 namespace snapper
 {
-       using std::map;
-       using std::string;
-       using std::pair;
-       using std::ostream;
-       using std::vector;
-
-       typedef vector<uint8_t> xa_value_t;
-       typedef map<string, xa_value_t> xa_map_t;
-       typedef pair<string, xa_value_t> xa_pair_t;
-        typedef vector<xa_pair_t> xa_mod_vec_t;
-       typedef vector<string> xa_del_vec_t;
-
-        // iterators
-       typedef xa_map_t::const_iterator xa_map_citer;
-        typedef xa_mod_vec_t::const_iterator xa_mod_vec_citer;
-       typedef xa_del_vec_t::const_iterator xa_del_vec_citer;
-
-       class XAttributes
-       {
-       private:
-            xa_map_t xamap;
-        public:
-            XAttributes(const string&);
-           XAttributes(const SFile& dir);
-
-            xa_map_citer cbegin() const { return xamap.begin(); }
-            xa_map_citer cend() const { return xamap.end(); }
-
-            bool operator==(const XAttributes&) const;
-       };
-
-        class XAModification
-        {
-        private:
-           xa_mod_vec_t create_vec;
-           xa_del_vec_t delete_vec;
-           xa_mod_vec_t replace_vec;
-
-           void printTo(ostream&, bool) const;
-        public:
-
-            XAModification(const XAttributes&, const XAttributes&);
-
-            bool empty() const;
-            bool serializeTo(const string&) const;
-
-            unsigned int getXaCreateNum() const;
-            unsigned int getXaDeleteNum() const;
-            unsigned int getXaReplaceNum() const;
-
-           // this will generate diff report
-           void dumpDiffReport(ostream&) const;
-
-           // this will print out the class content
-            friend ostream& operator<<(ostream&, const XAModification&);
-        };
+    using std::map;
+    using std::string;
+    using std::pair;
+    using std::ostream;
+    using std::vector;
+
+    typedef vector<uint8_t> xa_value_t;
+    typedef map<string, xa_value_t> xa_map_t;
+    typedef pair<string, xa_value_t> xa_pair_t;
+    typedef vector<xa_pair_t> xa_mod_vec_t;
+    typedef vector<string> xa_del_vec_t;
+
+    // iterators
+    typedef xa_map_t::const_iterator xa_map_citer;
+    typedef xa_mod_vec_t::const_iterator xa_mod_vec_citer;
+    typedef xa_del_vec_t::const_iterator xa_del_vec_citer;
+
+    class XAttributes
+    {
+    private:
+       xa_map_t xamap;
+    public:
+       XAttributes(const string&);
+       XAttributes(const SFile& dir);
+
+       xa_map_citer cbegin() const { return xamap.begin(); }
+       xa_map_citer cend() const { return xamap.end(); }
+
+       bool operator==(const XAttributes&) const;
+    };
+
+    class XAModification
+    {
+    private:
+       xa_mod_vec_t create_vec;
+       xa_del_vec_t delete_vec;
+       xa_mod_vec_t replace_vec;
+
+       void printTo(ostream&, bool) const;
+    public:
+
+       XAModification(const XAttributes&, const XAttributes&);
+
+       bool empty() const;
+       void filterOutAcls();
+       bool serializeTo(const string&) const;
+
+       unsigned int getXaCreateNum() const;
+       unsigned int getXaDeleteNum() const;
+       unsigned int getXaReplaceNum() const;
+
+       // this will generate diff report
+       void dumpDiffReport(ostream&) const;
+
+       // this will print out the class content
+       friend ostream& operator<<(ostream&, const XAModification&);
+    };
+
+    ostream& operator<<(ostream&, const XAttributes&);
+    ostream& operator<<(ostream&, const xa_value_t&);
+
+    class CompareAcls
+    {
+    private:
+       xa_map_t xamap;
+    public:
+       CompareAcls(const XAttributes& xa);
 
-        ostream& operator<<(ostream&, const XAttributes&);
-        ostream& operator<<(ostream&, const xa_value_t&);
+       bool operator==(const CompareAcls&) const;
+    };
 }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/testsuite-real/Makefile.am 
new/snapper-0.2.1/testsuite-real/Makefile.am
--- old/snapper-0.2.1/testsuite-real/Makefile.am        2014-01-29 
16:48:30.000000000 +0100
+++ new/snapper-0.2.1/testsuite-real/Makefile.am        2014-02-28 
13:36:50.000000000 +0100
@@ -9,19 +9,20 @@
 LDADD = ../snapper/libsnapper.la
 
 if HAVE_XATTRS
-TMP_XATST = xattrs1 xattrs2 xattrs3
+TMP_XATST = xattrs1 xattrs2 xattrs3 xattrs4
 endif
 
 noinst_SCRIPTS = run-all
 
-noinst_PROGRAMS = simple1 permissions1 permissions2 owner1 owner2 owner3       
\
-       directory1 missing-directory1 error1 error2 error4 \
+noinst_PROGRAMS = simple1 permissions1 permissions2 permissions3 owner1 owner2 
\
+       owner3 directory1 missing-directory1 error1 error2 error4 \
        $(TMP_XATST)
 
 simple1_SOURCES = simple1.cc common.h common.cc
 
 permissions1_SOURCES = permissions1.cc common.h common.cc
 permissions2_SOURCES = permissions2.cc common.h common.cc
+permissions3_SOURCES = permissions3.cc common.h common.cc
 
 owner1_SOURCES = owner1.cc common.h common.cc
 owner2_SOURCES = owner2.cc common.h common.cc
@@ -38,6 +39,7 @@
 xattrs1_SOURCES = xattrs1.cc xattrs_utils.cc xattrs_utils.h common.h common.cc
 xattrs2_SOURCES = xattrs2.cc xattrs_utils.cc xattrs_utils.h common.h common.cc
 xattrs3_SOURCES = xattrs3.cc xattrs_utils.cc xattrs_utils.h common.h common.cc
+xattrs4_SOURCES = xattrs4.cc xattrs_utils.cc xattrs_utils.h common.h common.cc
 
 EXTRA_DIST = $(noinst_SCRIPTS)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/testsuite-real/Makefile.in 
new/snapper-0.2.1/testsuite-real/Makefile.in
--- old/snapper-0.2.1/testsuite-real/Makefile.in        2014-02-11 
14:40:13.000000000 +0100
+++ new/snapper-0.2.1/testsuite-real/Makefile.in        2014-03-03 
17:33:12.000000000 +0100
@@ -84,8 +84,8 @@
 build_triplet = @build@
 host_triplet = @host@
 noinst_PROGRAMS = simple1$(EXEEXT) permissions1$(EXEEXT) \
-       permissions2$(EXEEXT) owner1$(EXEEXT) owner2$(EXEEXT) \
-       owner3$(EXEEXT) directory1$(EXEEXT) \
+       permissions2$(EXEEXT) permissions3$(EXEEXT) owner1$(EXEEXT) \
+       owner2$(EXEEXT) owner3$(EXEEXT) directory1$(EXEEXT) \
        missing-directory1$(EXEEXT) error1$(EXEEXT) error2$(EXEEXT) \
        error4$(EXEEXT) $(am__EXEEXT_1)
 subdir = testsuite-real
@@ -100,7 +100,7 @@
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 @HAVE_XATTRS_TRUE@am__EXEEXT_1 = xattrs1$(EXEEXT) xattrs2$(EXEEXT) \
-@HAVE_XATTRS_TRUE@     xattrs3$(EXEEXT)
+@HAVE_XATTRS_TRUE@     xattrs3$(EXEEXT) xattrs4$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 am_directory1_OBJECTS = directory1.$(OBJEXT) common.$(OBJEXT)
 directory1_OBJECTS = $(am_directory1_OBJECTS)
@@ -147,6 +147,10 @@
 permissions2_OBJECTS = $(am_permissions2_OBJECTS)
 permissions2_LDADD = $(LDADD)
 permissions2_DEPENDENCIES = ../snapper/libsnapper.la
+am_permissions3_OBJECTS = permissions3.$(OBJEXT) common.$(OBJEXT)
+permissions3_OBJECTS = $(am_permissions3_OBJECTS)
+permissions3_LDADD = $(LDADD)
+permissions3_DEPENDENCIES = ../snapper/libsnapper.la
 am_simple1_OBJECTS = simple1.$(OBJEXT) common.$(OBJEXT)
 simple1_OBJECTS = $(am_simple1_OBJECTS)
 simple1_LDADD = $(LDADD)
@@ -166,6 +170,11 @@
 xattrs3_OBJECTS = $(am_xattrs3_OBJECTS)
 xattrs3_LDADD = $(LDADD)
 xattrs3_DEPENDENCIES = ../snapper/libsnapper.la
+am_xattrs4_OBJECTS = xattrs4.$(OBJEXT) xattrs_utils.$(OBJEXT) \
+       common.$(OBJEXT)
+xattrs4_OBJECTS = $(am_xattrs4_OBJECTS)
+xattrs4_LDADD = $(LDADD)
+xattrs4_DEPENDENCIES = ../snapper/libsnapper.la
 SCRIPTS = $(noinst_SCRIPTS)
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@@ -223,14 +232,15 @@
        $(error4_SOURCES) $(missing_directory1_SOURCES) \
        $(owner1_SOURCES) $(owner2_SOURCES) $(owner3_SOURCES) \
        $(permissions1_SOURCES) $(permissions2_SOURCES) \
-       $(simple1_SOURCES) $(xattrs1_SOURCES) $(xattrs2_SOURCES) \
-       $(xattrs3_SOURCES)
+       $(permissions3_SOURCES) $(simple1_SOURCES) $(xattrs1_SOURCES) \
+       $(xattrs2_SOURCES) $(xattrs3_SOURCES) $(xattrs4_SOURCES)
 DIST_SOURCES = $(directory1_SOURCES) $(error1_SOURCES) \
        $(error2_SOURCES) $(error4_SOURCES) \
        $(missing_directory1_SOURCES) $(owner1_SOURCES) \
        $(owner2_SOURCES) $(owner3_SOURCES) $(permissions1_SOURCES) \
-       $(permissions2_SOURCES) $(simple1_SOURCES) $(xattrs1_SOURCES) \
-       $(xattrs2_SOURCES) $(xattrs3_SOURCES)
+       $(permissions2_SOURCES) $(permissions3_SOURCES) \
+       $(simple1_SOURCES) $(xattrs1_SOURCES) $(xattrs2_SOURCES) \
+       $(xattrs3_SOURCES) $(xattrs4_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -400,11 +410,12 @@
 top_srcdir = @top_srcdir@
 INCLUDES = -I$(top_srcdir)
 LDADD = ../snapper/libsnapper.la
-@HAVE_XATTRS_TRUE@TMP_XATST = xattrs1 xattrs2 xattrs3
+@HAVE_XATTRS_TRUE@TMP_XATST = xattrs1 xattrs2 xattrs3 xattrs4
 noinst_SCRIPTS = run-all
 simple1_SOURCES = simple1.cc common.h common.cc
 permissions1_SOURCES = permissions1.cc common.h common.cc
 permissions2_SOURCES = permissions2.cc common.h common.cc
+permissions3_SOURCES = permissions3.cc common.h common.cc
 owner1_SOURCES = owner1.cc common.h common.cc
 owner2_SOURCES = owner2.cc common.h common.cc
 owner3_SOURCES = owner3.cc common.h common.cc
@@ -416,6 +427,7 @@
 xattrs1_SOURCES = xattrs1.cc xattrs_utils.cc xattrs_utils.h common.h common.cc
 xattrs2_SOURCES = xattrs2.cc xattrs_utils.cc xattrs_utils.h common.h common.cc
 xattrs3_SOURCES = xattrs3.cc xattrs_utils.cc xattrs_utils.h common.h common.cc
+xattrs4_SOURCES = xattrs4.cc xattrs_utils.cc xattrs_utils.h common.h common.cc
 EXTRA_DIST = $(noinst_SCRIPTS)
 all: all-am
 
@@ -501,6 +513,10 @@
        @rm -f permissions2$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(permissions2_OBJECTS) $(permissions2_LDADD) 
$(LIBS)
 
+permissions3$(EXEEXT): $(permissions3_OBJECTS) $(permissions3_DEPENDENCIES) 
$(EXTRA_permissions3_DEPENDENCIES) 
+       @rm -f permissions3$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(permissions3_OBJECTS) $(permissions3_LDADD) 
$(LIBS)
+
 simple1$(EXEEXT): $(simple1_OBJECTS) $(simple1_DEPENDENCIES) 
$(EXTRA_simple1_DEPENDENCIES) 
        @rm -f simple1$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(simple1_OBJECTS) $(simple1_LDADD) $(LIBS)
@@ -517,6 +533,10 @@
        @rm -f xattrs3$(EXEEXT)
        $(AM_V_CXXLD)$(CXXLINK) $(xattrs3_OBJECTS) $(xattrs3_LDADD) $(LIBS)
 
+xattrs4$(EXEEXT): $(xattrs4_OBJECTS) $(xattrs4_DEPENDENCIES) 
$(EXTRA_xattrs4_DEPENDENCIES) 
+       @rm -f xattrs4$(EXEEXT)
+       $(AM_V_CXXLD)$(CXXLINK) $(xattrs4_OBJECTS) $(xattrs4_LDADD) $(LIBS)
+
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
 
@@ -534,10 +554,12 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/owner3.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permissions1.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permissions2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permissions3.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple1.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xattrs1.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xattrs2.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xattrs3.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xattrs4.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xattrs_utils.Po@am__quote@
 
 .cc.o:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/testsuite-real/permissions3.cc 
new/snapper-0.2.1/testsuite-real/permissions3.cc
--- old/snapper-0.2.1/testsuite-real/permissions3.cc    1970-01-01 
01:00:00.000000000 +0100
+++ new/snapper-0.2.1/testsuite-real/permissions3.cc    2014-02-28 
13:36:50.000000000 +0100
@@ -0,0 +1,38 @@
+
+#include "common.h"
+
+using namespace std;
+
+
+int
+main()
+{
+    setup();
+
+    run_command("echo hello > setuid1");
+    run_command("chmod u+s,a+x setuid1");
+
+    run_command("touch setuid2");
+    run_command("chmod u+s,a+x setuid2");
+
+    first_snapshot();
+
+    run_command("echo world >> setuid1");
+
+    run_command("chown :nobody setuid2");
+    run_command("chmod u+s setuid2");
+
+    second_snapshot();
+
+    check_undo_statistics(0, 2, 0);
+
+    undo();
+
+    check_undo_errors(0, 0, 0);
+
+    check_first();
+
+    cleanup();
+
+    exit(EXIT_SUCCESS);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/testsuite-real/run-all 
new/snapper-0.2.1/testsuite-real/run-all
--- old/snapper-0.2.1/testsuite-real/run-all    2014-01-29 16:48:30.000000000 
+0100
+++ new/snapper-0.2.1/testsuite-real/run-all    2014-02-28 13:36:50.000000000 
+0100
@@ -22,6 +22,7 @@
 
 run permissions1
 run permissions2
+run permissions3
 
 run owner1
 run owner2
@@ -38,3 +39,4 @@
 test -x xattrs1 && run xattrs1
 test -x xattrs2 && run xattrs2
 test -x xattrs3 && run xattrs3
+test -x xattrs4 && run xattrs4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/testsuite-real/xattrs1.cc 
new/snapper-0.2.1/testsuite-real/xattrs1.cc
--- old/snapper-0.2.1/testsuite-real/xattrs1.cc 2014-01-29 16:48:30.000000000 
+0100
+++ new/snapper-0.2.1/testsuite-real/xattrs1.cc 2014-02-26 11:17:13.000000000 
+0100
@@ -28,7 +28,8 @@
 
     check_undo_statistics(0, 1, 0);
 
-    check_xa_undo_statistics(2, 1, 1);
+    // do not count ACLs
+    check_xa_undo_statistics(1, 1, 1);
 
     check_undo_errors(0, 0, 0);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/snapper-0.2.1/testsuite-real/xattrs4.cc 
new/snapper-0.2.1/testsuite-real/xattrs4.cc
--- old/snapper-0.2.1/testsuite-real/xattrs4.cc 1970-01-01 01:00:00.000000000 
+0100
+++ new/snapper-0.2.1/testsuite-real/xattrs4.cc 2014-02-26 11:17:13.000000000 
+0100
@@ -0,0 +1,41 @@
+
+#include "common.h"
+
+using namespace std;
+
+int
+main()
+{
+    setup();
+
+    run_command("touch file1");
+    run_command("mkdir dir1");
+    run_command("mkdir no_default");
+    run_command("setfacl -b file1");
+    run_command("setfacl -k dir1");
+    run_command("setfacl -k no_default");
+    run_command("setfacl -m u:nobody:rw file1");
+    run_command("setfacl -d -m u:nobody:w dir1");
+
+    first_snapshot();
+
+    run_command("setfacl -b file1");
+    run_command("setfacl -k dir1");
+
+    second_snapshot();
+
+    undo();
+
+    check_undo_statistics(0, 2, 0);
+
+    // do not count ACLs
+    check_xa_undo_statistics(0, 0, 0);
+
+    check_undo_errors(0, 0, 0);
+
+    check_first();
+
+    cleanup();
+
+    exit(EXIT_SUCCESS);
+}

-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to