]> git.ipfire.org Git - pakfire.git/commitdiff
file: Use struct stat to store own stat data
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 23 Aug 2022 17:18:21 +0000 (17:18 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 23 Aug 2022 17:18:21 +0000 (17:18 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/file.c

index 17012a5e9c6f1cf62bae647f8a8c66acde485026..b4cea79a7aa09c0517b8d000ea874ccec0018c64 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/limits.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <time.h>
 
@@ -66,18 +67,8 @@ struct pakfire_file {
        char user[LOGIN_NAME_MAX];
        char group[LOGIN_NAME_MAX];
 
-       // File Size
-       ssize_t size;
-
-       // File Mode
-       mode_t mode;
-
-       // Dev Minor/Major
-       dev_t dev;
-
-       // Creation/Modification Time
-       time_t ctime;
-       time_t mtime;
+       // Stat
+       struct stat st;
 
        // Link destinations
        char hardlink[PATH_MAX];
@@ -336,15 +327,15 @@ PAKFIRE_EXPORT void pakfire_file_set_symlink(struct pakfire_file* file, const ch
 }
 
 PAKFIRE_EXPORT int pakfire_file_get_type(struct pakfire_file* file) {
-       return file->mode & S_IFMT;
+       return file->st.st_mode & S_IFMT;
 }
 
-PAKFIRE_EXPORT ssize_t pakfire_file_get_size(struct pakfire_file* file) {
-       return file->size;
+PAKFIRE_EXPORT off_t pakfire_file_get_size(struct pakfire_file* file) {
+       return file->st.st_size;
 }
 
-PAKFIRE_EXPORT void pakfire_file_set_size(struct pakfire_file* file, ssize_t size) {
-       file->size = size;
+PAKFIRE_EXPORT void pakfire_file_set_size(struct pakfire_file* file, off_t size) {
+       file->st.st_size = size;
 }
 
 PAKFIRE_EXPORT const char* pakfire_file_get_user(struct pakfire_file* file) {
@@ -364,47 +355,47 @@ PAKFIRE_EXPORT int pakfire_file_set_group(struct pakfire_file* file, const char*
 }
 
 PAKFIRE_EXPORT mode_t pakfire_file_get_mode(struct pakfire_file* file) {
-       return file->mode;
+       return file->st.st_mode;
 }
 
 PAKFIRE_EXPORT void pakfire_file_set_mode(struct pakfire_file* file, mode_t mode) {
-       file->mode = mode;
+       file->st.st_mode = mode;
 }
 
 PAKFIRE_EXPORT mode_t pakfire_file_get_perms(struct pakfire_file* file) {
-       return file->mode & ~AE_IFMT;
+       return file->st.st_mode & ~AE_IFMT;
 }
 
 PAKFIRE_EXPORT void pakfire_file_set_perms(struct pakfire_file* file, const mode_t perms) {
        // Clear any previous permissions
-       file->mode &= S_IFMT;
+       file->st.st_mode &= S_IFMT;
 
        // Set new bits (with format cleared)
-       file->mode |= ~S_IFMT & perms;
+       file->st.st_mode |= ~S_IFMT & perms;
 }
 
 PAKFIRE_EXPORT dev_t pakfire_file_get_dev(struct pakfire_file* file) {
-       return file->dev;
+       return file->st.st_dev;
 }
 
 PAKFIRE_EXPORT void pakfire_file_set_dev(struct pakfire_file* file, dev_t dev) {
-       file->dev = dev;
+       file->st.st_dev = dev;
 }
 
 PAKFIRE_EXPORT time_t pakfire_file_get_ctime(struct pakfire_file* file) {
-       return file->ctime;
+       return file->st.st_ctime;
 }
 
 PAKFIRE_EXPORT void pakfire_file_set_ctime(struct pakfire_file* file, time_t time) {
-       file->ctime = time;
+       file->st.st_ctime = time;
 }
 
 PAKFIRE_EXPORT time_t pakfire_file_get_mtime(struct pakfire_file* file) {
-       return file->mtime;
+       return file->st.st_mtime;
 }
 
 PAKFIRE_EXPORT void pakfire_file_set_mtime(struct pakfire_file* file, time_t time) {
-       file->mtime = time;
+       file->st.st_mtime = time;
 }
 
 /*
@@ -574,15 +565,19 @@ int pakfire_file_cleanup(struct pakfire_file* file) {
 }
 
 static int pakfire_file_verify_mode(struct pakfire_file* file, const struct stat* st) {
+       const mode_t type = pakfire_file_get_type(file);
+
        // Did the type change?
-       if ((file->mode & S_IFMT) != (st->st_mode & S_IFMT)) {
+       if (type != (st->st_mode & S_IFMT)) {
                file->verify_status |= PAKFIRE_FILE_TYPE_CHANGED;
 
                DEBUG(file->pakfire, "%s: File Type changed\n", file->path);
        }
 
+       const mode_t perms = pakfire_file_get_perms(file);
+
        // Check permissions
-       if ((file->mode & 0777) != (st->st_mode & 0777)) {
+       if (perms != (st->st_mode & 0777)) {
                file->verify_status |= PAKFIRE_FILE_PERMISSIONS_CHANGED;
 
                DEBUG(file->pakfire, "%s: Permissions changed\n", file->path);
@@ -590,7 +585,9 @@ static int pakfire_file_verify_mode(struct pakfire_file* file, const struct stat
 
        // Check if device node changed
        if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) {
-               if (file->dev != st->st_dev) {
+               const dev_t dev = pakfire_file_get_dev(file);
+
+               if (dev != st->st_dev) {
                        file->verify_status |= PAKFIRE_FILE_DEV_CHANGED;
 
                        DEBUG(file->pakfire, "%s: Device Node changed\n", file->path);
@@ -602,14 +599,14 @@ static int pakfire_file_verify_mode(struct pakfire_file* file, const struct stat
 
 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)
+       if (file->st.st_size == st->st_size)
                return 0;
 
        // Size differs
        file->verify_status |= PAKFIRE_FILE_SIZE_CHANGED;
 
        DEBUG(file->pakfire, "%s: Filesize differs (expected %zu, got %zu byte(s))\n",
-               file->path, file->size, st->st_size);
+               file->path, file->st.st_size, st->st_size);
 
        return 0;
 }
@@ -647,14 +644,14 @@ static int pakfire_file_verify_ownership(struct pakfire_file* file, const struct
 
 static int pakfire_file_verify_timestamps(struct pakfire_file* file, const struct stat* st) {
        // Check creation time
-       if (file->ctime != st->st_ctime) {
+       if (file->st.st_ctime != st->st_ctime) {
                file->verify_status |= PAKFIRE_FILE_CTIME_CHANGED;
 
                DEBUG(file->pakfire, "%s: Creation time changed\n", file->path);
        }
 
        // Check modification time
-       if (file->mtime != st->st_mtime) {
+       if (file->st.st_mtime != st->st_mtime) {
                file->verify_status |= PAKFIRE_FILE_MTIME_CHANGED;
 
                DEBUG(file->pakfire, "%s: Modification time changed\n", file->path);