#include <linux/limits.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
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];
}
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) {
}
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;
}
/*
}
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);
// 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);
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;
}
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);