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