From: Michael Tremer Date: Fri, 19 Aug 2022 14:49:36 +0000 (+0000) Subject: file: Verify file mode X-Git-Tag: 0.9.28~419 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9e09e361e9d01c0dd5b96ef051e5691e2afd8d8f;p=people%2Fms%2Fpakfire.git file: Verify file mode Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/file.c b/src/libpakfire/file.c index d90bdee52..1c5518f1d 100644 --- a/src/libpakfire/file.c +++ b/src/libpakfire/file.c @@ -40,9 +40,12 @@ 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)