]> git.ipfire.org Git - pakfire.git/commitdiff
file: Verify file mode
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 19 Aug 2022 14:49:36 +0000 (14:49 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 19 Aug 2022 14:49:36 +0000 (14:49 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/file.c

index d90bdee5267c981d76f7452a9a0ffe5d0d5153d5..1c5518f1d73adee129a1d5c907b9f9a2fc77ea50 100644 (file)
 
 enum pakfire_file_verification_status {
        PAKFIRE_FILE_NOENT                = (1 << 0),
-       PAKFIRE_FILE_SIZE_CHANGED         = (1 << 1),
-       PAKFIRE_FILE_OWNER_CHANGED        = (1 << 2),
-       PAKFIRE_FILE_GROUP_CHANGED        = (1 << 3),
+       PAKFIRE_FILE_TYPE_CHANGED         = (1 << 1),
+       PAKFIRE_FILE_PERMISSIONS_CHANGED  = (1 << 2),
+       PAKFIRE_FILE_DEV_CHANGED          = (1 << 3),
+       PAKFIRE_FILE_SIZE_CHANGED         = (1 << 4),
+       PAKFIRE_FILE_OWNER_CHANGED        = (1 << 5),
+       PAKFIRE_FILE_GROUP_CHANGED        = (1 << 6),
 };
 
 struct pakfire_file {
@@ -538,6 +541,33 @@ int pakfire_file_cleanup(struct pakfire_file* file) {
        return 0;
 }
 
+static int pakfire_file_verify_mode(struct pakfire_file* file, const struct stat* st) {
+       // Did the type change?
+       if ((file->mode & S_IFMT) != (st->st_mode & S_IFMT)) {
+               file->verify_status |= PAKFIRE_FILE_TYPE_CHANGED;
+
+               DEBUG(file->pakfire, "%s: File Type changed\n", file->path);
+       }
+
+       // Check permissions
+       if ((file->mode & 0777) != (st->st_mode & 0777)) {
+               file->verify_status |= PAKFIRE_FILE_PERMISSIONS_CHANGED;
+
+               DEBUG(file->pakfire, "%s: Permissions changed\n", file->path);
+       }
+
+       // Check if device node changed
+       if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
+               if (file->dev != st->st_dev) {
+                       file->verify_status |= PAKFIRE_FILE_DEV_CHANGED;
+
+                       DEBUG(file->pakfire, "%s: Device Node changed\n", file->path);
+               }
+       }
+
+       return 0;
+}
+
 static int pakfire_file_verify_size(struct pakfire_file* file, const struct stat* st) {
        // Nothing to do if size matches
        if (file->size == st->st_size)
@@ -605,6 +635,11 @@ int pakfire_file_verify(struct pakfire_file* file, int* status) {
                return r;
        }
 
+       // Verify mode
+       r = pakfire_file_verify_mode(file, &st);
+       if (r)
+               return r;
+
        // Verify size
        r = pakfire_file_verify_size(file, &st);
        if (r)