From: Michael Tremer Date: Tue, 23 Aug 2022 17:18:21 +0000 (+0000) Subject: file: Use struct stat to store own stat data X-Git-Tag: 0.9.28~387 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a09b95e0d91825b0b0a30036c75198749dcc99b4;p=pakfire.git file: Use struct stat to store own stat data Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/file.c b/src/libpakfire/file.c index 17012a5e9..b4cea79a7 100644 --- a/src/libpakfire/file.c +++ b/src/libpakfire/file.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -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);