]> git.ipfire.org Git - people/stevee/pakfire.git/commitdiff
file: Copy more stat attributes
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 6 Dec 2022 12:26:01 +0000 (12:26 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 6 Dec 2022 12:26:01 +0000 (12:26 +0000)
This is useful for any hardlink detection

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/file.c
src/libpakfire/include/pakfire/file.h
src/libpakfire/libpakfire.sym

index 77883b908fa0f3b378f1d20af793176bbca6c3e3..e29e91058911d39ba9dda394ebf25a8a34ba87ee 100644 (file)
@@ -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;
 }
index f280bfb8539feb8df3d5636659015792c93df49d..8e71849c989fd8ad4561ced6b04fcdc32141a327 100644 (file)
@@ -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);
index 15266b35d6d372966baad5563c566349789de479..5d7eaf45b34ff69169884419625b444afb4430b9 100644 (file)
@@ -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;