We currently only warn if a directories permissions differ, but using -Qkk
on my system shows that directory permissions tend to change in packages
reasonably frequently without noitce.  Provide a warning in such cases
so that it can be altered.  Example output:

(1/1) reinstalling nginx
warning: directory ownership differs on /var/lib/nginx/proxy/
filesystem: 33:0  package: 0:0

Signed-off-by: Allan McRae <[email protected]>
---
 lib/libalpm/add.c  | 16 +++++++++++++++-
 src/pacman/check.c | 18 ++++++++++++------
 2 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index df39274..ac4e36a 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -215,18 +215,32 @@ static int extract_single_file(alpm_handle_t *handle, 
struct archive *archive,
        } else {
                if(S_ISDIR(lsbuf.st_mode)) {
                        if(S_ISDIR(entrymode)) {
+                               uid_t entryuid = archive_entry_uid(entry);
+                               gid_t entrygid = archive_entry_gid(entry);
+
                                /* case 6: existing dir, ignore it */
                                if(lsbuf.st_mode != entrymode) {
                                        /* if filesystem perms are different 
than pkg perms, warn user */
                                        mode_t mask = 07777;
                                        _alpm_log(handle, ALPM_LOG_WARNING, 
_("directory permissions differ on %s\n"
-                                                               "filesystem: %o 
 package: %o\n"), filename, lsbuf.st_mode & mask,
+                                                       "filesystem: %o  
package: %o\n"), filename, lsbuf.st_mode & mask,
                                                        entrymode & mask);
                                        alpm_logaction(handle, 
ALPM_CALLER_PREFIX,
                                                        "warning: directory 
permissions differ on %s\n"
                                                        "filesystem: %o  
package: %o\n", filename, lsbuf.st_mode & mask,
                                                        entrymode & mask);
                                }
+
+                               if((entryuid != lsbuf.st_uid) || (entrygid != 
lsbuf.st_gid)) {
+                                       _alpm_log(handle, ALPM_LOG_WARNING, 
_("directory ownership differs on %s\n"
+                                                       "filesystem: %u:%u  
package: %u:%u\n"), filename,
+                                                       lsbuf.st_uid, 
lsbuf.st_gid, entryuid, entrygid);
+                                       alpm_logaction(handle, 
ALPM_CALLER_PREFIX,
+                                                       "warning: directory 
ownership differs on %s\n"
+                                                       "filesystem: %u:%u  
package: %u:%u\n", filename,
+                                                       lsbuf.st_uid, 
lsbuf.st_gid, entryuid, entrygid);
+                               }
+
                                _alpm_log(handle, ALPM_LOG_DEBUG, "extract: 
skipping dir extraction of %s\n",
                                                filename);
                                archive_read_data_skip(archive);
diff --git a/src/pacman/check.c b/src/pacman/check.c
index cdd3744..6c8889f 100644
--- a/src/pacman/check.c
+++ b/src/pacman/check.c
@@ -106,9 +106,12 @@ static int check_file_time(const char *pkgname, const char 
*filepath,
 {
        if(st->st_mtime != archive_entry_mtime(entry)) {
                if(backup) {
-                       printf("%s%s%s: ", config->colstr.title, _("backup 
file"), config->colstr.nocolor);
-                       printf(_("%s: %s (Modification time mismatch)\n"),
-                                       pkgname, filepath);
+                       if(!config->quiet) {
+                               printf("%s%s%s: ", config->colstr.title, 
_("backup file"),
+                                               config->colstr.nocolor);
+                               printf(_("%s: %s (Modification time 
mismatch)\n"),
+                                               pkgname, filepath);
+                       }
                        return 0;
                }
                if(!config->quiet) {
@@ -150,9 +153,12 @@ static int check_file_size(const char *pkgname, const char 
*filepath,
 {
        if(st->st_size != archive_entry_size(entry)) {
                if(backup) {
-                       printf("%s%s%s: ", config->colstr.title, _("backup 
file"), config->colstr.nocolor);
-                       printf(_("%s: %s (Size mismatch)\n"),
-                                       pkgname, filepath);
+                       if(!config->quiet) {
+                               printf("%s%s%s: ", config->colstr.title, 
_("backup file"),
+                                               config->colstr.nocolor);
+                               printf(_("%s: %s (Size mismatch)\n"),
+                                               pkgname, filepath);
+                       }
                        return 0;
                }
                if(!config->quiet) {
-- 
1.8.3.3


Reply via email to