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 {
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)
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)