]> git.ipfire.org Git - people/stevee/pakfire.git/commitdiff
file: Store hardlink/symlink targets
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 17 Aug 2022 13:01:52 +0000 (13:01 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 17 Aug 2022 13:01:52 +0000 (13:01 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/file.c
src/libpakfire/include/pakfire/file.h

index 89aa0a29264540234a60680bb569a47f06d6ee55..1af0b661dd96bf0221e6ade85b766c59c265a47a 100644 (file)
@@ -63,6 +63,10 @@ struct pakfire_file {
        time_t ctime;
        time_t mtime;
 
+       // Link destinations
+       char hardlink[PATH_MAX];
+       char symlink[PATH_MAX];
+
        // Digests
        struct pakfire_file_digest digests[MAX_DIGESTS];
 
@@ -130,6 +134,10 @@ int pakfire_file_copy_archive_entry(struct pakfire_file* file, struct archive_en
                pakfire_file_set_path(file, path);
        }
 
+       // Set links
+       pakfire_file_set_hardlink(file, archive_entry_hardlink(entry));
+       pakfire_file_set_symlink(file, archive_entry_symlink(entry));
+
        // Set size
        pakfire_file_set_size(file, archive_entry_size(entry));
 
@@ -216,6 +224,34 @@ PAKFIRE_EXPORT int pakfire_file_set_path(struct pakfire_file* file, const char*
        return pakfire_string_set(file->path, path);
 }
 
+PAKFIRE_EXPORT const char* pakfire_file_get_hardlink(struct pakfire_file* file) {
+       if (!*file->hardlink)
+               return NULL;
+
+       return file->hardlink;
+}
+
+PAKFIRE_EXPORT void pakfire_file_set_hardlink(struct pakfire_file* file, const char* link) {
+       if (!link || !*link)
+               *file->hardlink = '\0';
+       else
+               pakfire_string_set(file->hardlink, link);
+}
+
+PAKFIRE_EXPORT const char* pakfire_file_get_symlink(struct pakfire_file* file) {
+       if (!*file->symlink)
+               return NULL;
+
+       return file->symlink;
+}
+
+PAKFIRE_EXPORT void pakfire_file_set_symlink(struct pakfire_file* file, const char* link) {
+       if (!link || !*link)
+               *file->hardlink = '\0';
+       else
+               pakfire_string_set(file->symlink, link);
+}
+
 PAKFIRE_EXPORT int pakfire_file_get_type(struct pakfire_file* file) {
        return file->mode & S_IFMT;
 }
index c1f5d1417a85c434e4462e21b6dfb77b9e3dac3f..19a5375a5f9f5f1fd1c871b4adef27b22cf66bcc 100644 (file)
@@ -39,6 +39,11 @@ int pakfire_file_cmp(struct pakfire_file* file1, struct pakfire_file* file2);
 const char* pakfire_file_get_path(struct pakfire_file* file);
 int pakfire_file_set_path(struct pakfire_file* file, const char* path);
 
+const char* pakfire_file_get_hardlink(struct pakfire_file* file);
+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);
+
 int pakfire_file_get_type(struct pakfire_file* file);
 
 ssize_t pakfire_file_get_size(struct pakfire_file* file);