]> git.ipfire.org Git - pakfire.git/commitdiff
file: Add functions to store a file descriptor
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 25 Oct 2024 11:07:42 +0000 (11:07 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 25 Oct 2024 11:07:42 +0000 (11:07 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/file.c
src/libpakfire/include/pakfire/file.h

index 05c84181f12174c47882cfc177172b62e789e981..ac7b54a1362f917725dbcf7f349ddfca7719a976 100644 (file)
@@ -67,6 +67,9 @@ struct pakfire_file {
        // Use the libarchive entry to store common attributes
        struct archive_entry* entry;
 
+       // File Descriptor
+       int fd;
+
        // Capabilities
        cap_t caps;
 
@@ -385,6 +388,9 @@ PAKFIRE_EXPORT int pakfire_file_create(struct pakfire_file** file, struct pakfir
        // Initialize reference counter
        f->nrefs = 1;
 
+       // Initialize file descriptor
+       f->fd = -EBADF;
+
        // Create a new archive entry
        f->entry = archive_entry_new();
        if (!f->entry) {
@@ -537,6 +543,9 @@ ERROR:
 }
 
 static void pakfire_file_free(struct pakfire_file* file) {
+       if (file->fd >= 0)
+               close(file->fd);
+
        // Free capabilities
        if (file->caps)
                cap_free(file->caps);
@@ -577,6 +586,27 @@ int pakfire_file_set_flags(struct pakfire_file* file, int flag) {
        return 0;
 }
 
+// File Descriptor
+
+int pakfire_file_get_fd(struct pakfire_file* file) {
+       return file->fd;
+}
+
+int pakfire_file_set_fd(struct pakfire_file* file, int fd) {
+       // Close any previously assigned file descriptors
+       if (file->fd >= 0)
+               close(file->fd);
+
+       // Duplicate the file descriptor
+       file->fd = dup(fd);
+       if (file->fd < 0) {
+               CTX_ERROR(file->ctx, "Could not duplicate file descriptor: %m\n");
+               return -errno;
+       }
+
+       return 0;
+}
+
 #define pakfire_file_strmode(file, buffer) \
        __pakfire_file_strmode(file, buffer, sizeof(buffer))
 
index 468fb865735d90380b97f51e8d9b07c62ff4df2a..ad35d0930ec0949fe1517eeb7c3a8cb2e771dfb1 100644 (file)
@@ -132,6 +132,9 @@ enum pakfire_file_classes {
        PAKFIRE_FILE_RUNTIME_LINKER  = (1 << 14),
 };
 
+int pakfire_file_get_fd(struct pakfire_file* file);
+int pakfire_file_set_fd(struct pakfire_file* file, int fd);
+
 int pakfire_file_has_payload(struct pakfire_file* file);
 
 int pakfire_file_read(struct pakfire_file* file, struct archive* reader, const char* path);