From f8733b31ebc6c7eff025acaeb9e7e336e7460da6 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 6 Dec 2022 12:26:01 +0000 Subject: [PATCH] file: Copy more stat attributes This is useful for any hardlink detection Signed-off-by: Michael Tremer --- src/libpakfire/file.c | 44 ++++++++++++++++++++++----- src/libpakfire/include/pakfire/file.h | 12 ++++++-- src/libpakfire/libpakfire.sym | 6 ++++ 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/libpakfire/file.c b/src/libpakfire/file.c index 77883b908..e29e91058 100644 --- a/src/libpakfire/file.c +++ b/src/libpakfire/file.c @@ -124,6 +124,10 @@ static int pakfire_file_from_archive_entry(struct pakfire_file* file, struct arc pakfire_file_set_hardlink(file, archive_entry_hardlink(entry)); pakfire_file_set_symlink(file, archive_entry_symlink(entry)); + pakfire_file_set_nlink(file, archive_entry_nlink(entry)); + pakfire_file_set_inode(file, archive_entry_ino64(entry)); + pakfire_file_set_dev(file, archive_entry_dev(entry)); + // Set size pakfire_file_set_size(file, archive_entry_size(entry)); @@ -293,6 +297,10 @@ struct archive_entry* pakfire_file_archive_entry(struct pakfire_file* file, int if (*file->symlink) archive_entry_set_symlink(entry, file->symlink); + archive_entry_set_nlink(entry, pakfire_file_get_nlink(file)); + archive_entry_set_ino64(entry, pakfire_file_get_inode(file)); + archive_entry_set_dev(entry, pakfire_file_get_dev(file)); + // Set size archive_entry_set_size(entry, pakfire_file_get_size(file)); @@ -612,6 +620,30 @@ PAKFIRE_EXPORT void pakfire_file_set_symlink(struct pakfire_file* file, const ch pakfire_string_set(file->symlink, link); } +PAKFIRE_EXPORT nlink_t pakfire_file_get_nlink(struct pakfire_file* file) { + return file->st.st_nlink; +} + +PAKFIRE_EXPORT void pakfire_file_set_nlink(struct pakfire_file* file, const nlink_t nlink) { + file->st.st_nlink = nlink; +} + +PAKFIRE_EXPORT ino_t pakfire_file_get_inode(struct pakfire_file* file) { + return file->st.st_ino; +} + +PAKFIRE_EXPORT void pakfire_file_set_inode(struct pakfire_file* file, const ino_t ino) { + file->st.st_ino = ino; +} + +PAKFIRE_EXPORT dev_t pakfire_file_get_dev(struct pakfire_file* file) { + return file->st.st_dev; +} + +PAKFIRE_EXPORT void pakfire_file_set_dev(struct pakfire_file* file, const dev_t dev) { + file->st.st_dev = dev; +} + PAKFIRE_EXPORT int pakfire_file_get_type(struct pakfire_file* file) { return file->st.st_mode & S_IFMT; } @@ -660,14 +692,6 @@ PAKFIRE_EXPORT void pakfire_file_set_perms(struct pakfire_file* file, const mode file->st.st_mode |= ~S_IFMT & perms; } -PAKFIRE_EXPORT dev_t pakfire_file_get_dev(struct pakfire_file* file) { - return file->st.st_dev; -} - -PAKFIRE_EXPORT void pakfire_file_set_dev(struct pakfire_file* file, dev_t dev) { - file->st.st_dev = dev; -} - PAKFIRE_EXPORT time_t pakfire_file_get_ctime(struct pakfire_file* file) { return file->st.st_ctime; } @@ -942,6 +966,9 @@ static int pakfire_file_verify_mode(struct pakfire_file* file, const struct stat DEBUG(file->pakfire, "%s: Permissions changed\n", file->path); } +#if 0 + // XXX This does not check what it is supposed to check + // Check if device node changed if (S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) { const dev_t dev = pakfire_file_get_dev(file); @@ -952,6 +979,7 @@ static int pakfire_file_verify_mode(struct pakfire_file* file, const struct stat DEBUG(file->pakfire, "%s: Device Node changed\n", file->path); } } +#endif return 0; } diff --git a/src/libpakfire/include/pakfire/file.h b/src/libpakfire/include/pakfire/file.h index f280bfb85..8e71849c9 100644 --- a/src/libpakfire/include/pakfire/file.h +++ b/src/libpakfire/include/pakfire/file.h @@ -47,6 +47,15 @@ void pakfire_file_set_hardlink(struct pakfire_file* file, const char* link); const char* pakfire_file_get_symlink(struct pakfire_file* file); void pakfire_file_set_symlink(struct pakfire_file* file, const char* link); +nlink_t pakfire_file_get_nlink(struct pakfire_file* file); +void pakfire_file_set_nlink(struct pakfire_file* file, const nlink_t nlink); + +ino_t pakfire_file_get_inode(struct pakfire_file* file); +void pakfire_file_set_inode(struct pakfire_file* file, const ino_t ino); + +dev_t pakfire_file_get_dev(struct pakfire_file* file); +void pakfire_file_set_dev(struct pakfire_file* file, const dev_t dev); + int pakfire_file_get_type(struct pakfire_file* file); ssize_t pakfire_file_get_size(struct pakfire_file* file); @@ -64,9 +73,6 @@ void pakfire_file_set_mode(struct pakfire_file* file, mode_t mode); mode_t pakfire_file_get_perms(struct pakfire_file* file); void pakfire_file_set_perms(struct pakfire_file* file, const mode_t perms); -dev_t pakfire_file_get_dev(struct pakfire_file* file); -void pakfire_file_set_dev(struct pakfire_file* file, dev_t dev); - time_t pakfire_file_get_ctime(struct pakfire_file* file); void pakfire_file_set_ctime(struct pakfire_file* file, time_t time); time_t pakfire_file_get_mtime(struct pakfire_file* file); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 15266b35d..5d7eaf45b 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -84,10 +84,13 @@ global: pakfire_file_cmp; pakfire_file_create; pakfire_file_get_ctime; + pakfire_file_get_dev; pakfire_file_get_digest; pakfire_file_get_gname; + pakfire_file_get_inode; pakfire_file_get_mode; pakfire_file_get_mtime; + pakfire_file_get_nlink; pakfire_file_get_path; pakfire_file_get_perms; pakfire_file_get_size; @@ -95,10 +98,13 @@ global: pakfire_file_get_type; pakfire_file_get_uname; pakfire_file_set_ctime; + pakfire_file_set_dev; pakfire_file_set_digest; pakfire_file_set_gname; + pakfire_file_set_inode; pakfire_file_set_mode; pakfire_file_set_mtime; + pakfire_file_set_nlink; pakfire_file_set_path; pakfire_file_set_perms; pakfire_file_set_size; -- 2.39.5