]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
archive: constify the archive::vtable dispatch
authorEmil Velikov <emil.l.velikov@gmail.com>
Wed, 26 Feb 2020 16:11:38 +0000 (16:11 +0000)
committerEmil Velikov <emil.l.velikov@gmail.com>
Sat, 23 Oct 2021 18:26:18 +0000 (19:26 +0100)
Currently we have a constant dispatch/vtable that we populate at runtime
for unknown reason.

Remove the functions doing all the work and use a simple static const
struct archive_vtable.

Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
libarchive/archive_private.h
libarchive/archive_read.c
libarchive/archive_read_disk_posix.c
libarchive/archive_read_disk_windows.c
libarchive/archive_write.c
libarchive/archive_write_disk_posix.c
libarchive/archive_write_disk_windows.c

index 55a8da18eab6623a230a63a3a9e1efe20bffaf89..88ad848efc108edb977d80392327f6ee12b52dc0 100644 (file)
@@ -107,7 +107,7 @@ struct archive {
         * Some public API functions depend on the "real" type of the
         * archive object.
         */
-       struct archive_vtable *vtable;
+       const struct archive_vtable *vtable;
 
        int               archive_format;
        const char       *archive_format_name;
index c59f05153491fb3305d1af34da8933cd15f83051..38fc77d2921dd0045032d524c4d05ffb1bb548c2 100644 (file)
@@ -58,7 +58,6 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_read.c 201157 2009-12-29 05:30:2
 static int     choose_filters(struct archive_read *);
 static int     choose_format(struct archive_read *);
 static int     close_filters(struct archive_read *);
-static struct archive_vtable *archive_read_vtable(void);
 static int64_t _archive_filter_bytes(struct archive *, int);
 static int     _archive_filter_code(struct archive *, int);
 static const char *_archive_filter_name(struct archive *, int);
@@ -73,26 +72,18 @@ static int  _archive_read_next_header2(struct archive *,
                    struct archive_entry *);
 static int64_t  advance_file_pointer(struct archive_read_filter *, int64_t);
 
-static struct archive_vtable *
-archive_read_vtable(void)
-{
-       static struct archive_vtable av;
-       static int inited = 0;
-
-       if (!inited) {
-               av.archive_filter_bytes = _archive_filter_bytes;
-               av.archive_filter_code = _archive_filter_code;
-               av.archive_filter_name = _archive_filter_name;
-               av.archive_filter_count = _archive_filter_count;
-               av.archive_read_data_block = _archive_read_data_block;
-               av.archive_read_next_header = _archive_read_next_header;
-               av.archive_read_next_header2 = _archive_read_next_header2;
-               av.archive_free = _archive_read_free;
-               av.archive_close = _archive_read_close;
-               inited = 1;
-       }
-       return (&av);
-}
+static const struct archive_vtable
+archive_read_vtable = {
+       .archive_filter_bytes = _archive_filter_bytes,
+       .archive_filter_code = _archive_filter_code,
+       .archive_filter_name = _archive_filter_name,
+       .archive_filter_count = _archive_filter_count,
+       .archive_read_data_block = _archive_read_data_block,
+       .archive_read_next_header = _archive_read_next_header,
+       .archive_read_next_header2 = _archive_read_next_header2,
+       .archive_free = _archive_read_free,
+       .archive_close = _archive_read_close,
+};
 
 /*
  * Allocate, initialize and return a struct archive object.
@@ -109,7 +100,7 @@ archive_read_new(void)
 
        a->archive.state = ARCHIVE_STATE_NEW;
        a->entry = archive_entry_new2(&a->archive);
-       a->archive.vtable = archive_read_vtable();
+       a->archive.vtable = &archive_read_vtable;
 
        a->passphrases.last = &a->passphrases.first;
 
index 3ee6269ff3ce6cb64b7850a1ed27d91037c6e3ba..002e024aa5d37a8092c60c51877f569116d22192 100644 (file)
@@ -369,22 +369,14 @@ static int        open_on_current_dir(struct tree *, const char *, int);
 static int     tree_dup(int);
 
 
-static struct archive_vtable *
-archive_read_disk_vtable(void)
-{
-       static struct archive_vtable av;
-       static int inited = 0;
-
-       if (!inited) {
-               av.archive_free = _archive_read_free;
-               av.archive_close = _archive_read_close;
-               av.archive_read_data_block = _archive_read_data_block;
-               av.archive_read_next_header = _archive_read_next_header;
-               av.archive_read_next_header2 = _archive_read_next_header2;
-               inited = 1;
-       }
-       return (&av);
-}
+static const struct archive_vtable
+archive_read_disk_vtable = {
+       .archive_free = _archive_read_free,
+       .archive_close = _archive_read_close,
+       .archive_read_data_block = _archive_read_data_block,
+       .archive_read_next_header = _archive_read_next_header,
+       .archive_read_next_header2 = _archive_read_next_header2,
+};
 
 const char *
 archive_read_disk_gname(struct archive *_a, la_int64_t gid)
@@ -461,7 +453,7 @@ archive_read_disk_new(void)
                return (NULL);
        a->archive.magic = ARCHIVE_READ_DISK_MAGIC;
        a->archive.state = ARCHIVE_STATE_NEW;
-       a->archive.vtable = archive_read_disk_vtable();
+       a->archive.vtable = &archive_read_disk_vtable;
        a->entry = archive_entry_new2(&a->archive);
        a->lookup_uname = trivial_lookup_uname;
        a->lookup_gname = trivial_lookup_gname;
index 877bc449a765c32df472af0104c5e6e365a0882f..00a8714efa6e67c31e339f82384c297edb537d67 100644 (file)
@@ -449,22 +449,14 @@ entry_symlink_from_pathw(struct archive_entry *entry, const wchar_t *path)
        return;
 }
 
-static struct archive_vtable *
-archive_read_disk_vtable(void)
-{
-       static struct archive_vtable av;
-       static int inited = 0;
-
-       if (!inited) {
-               av.archive_free = _archive_read_free;
-               av.archive_close = _archive_read_close;
-               av.archive_read_data_block = _archive_read_data_block;
-               av.archive_read_next_header = _archive_read_next_header;
-               av.archive_read_next_header2 = _archive_read_next_header2;
-               inited = 1;
-       }
-       return (&av);
-}
+static const struct archive_vtable
+archive_read_disk_vtable = {
+       .archive_free = _archive_read_free,
+       .archive_close = _archive_read_close,
+       .archive_read_data_block = _archive_read_data_block,
+       .archive_read_next_header = _archive_read_next_header,
+       .archive_read_next_header2 = _archive_read_next_header2,
+};
 
 const char *
 archive_read_disk_gname(struct archive *_a, la_int64_t gid)
@@ -541,7 +533,7 @@ archive_read_disk_new(void)
                return (NULL);
        a->archive.magic = ARCHIVE_READ_DISK_MAGIC;
        a->archive.state = ARCHIVE_STATE_NEW;
-       a->archive.vtable = archive_read_disk_vtable();
+       a->archive.vtable = &archive_read_disk_vtable;
        a->entry = archive_entry_new2(&a->archive);
        a->lookup_uname = trivial_lookup_uname;
        a->lookup_gname = trivial_lookup_gname;
index 38c14cba784a95525eebddce87168a3bf75e6bb5..66592e8268ab4354b95530b6714b6d21d8d65554 100644 (file)
@@ -60,8 +60,6 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_write.c 201099 2009-12-28 03:03:
 #include "archive_private.h"
 #include "archive_write_private.h"
 
-static struct archive_vtable *archive_write_vtable(void);
-
 static int     _archive_filter_code(struct archive *, int);
 static const char *_archive_filter_name(struct archive *, int);
 static int64_t _archive_filter_bytes(struct archive *, int);
@@ -79,26 +77,18 @@ struct archive_none {
        char *next;
 };
 
-static struct archive_vtable *
-archive_write_vtable(void)
-{
-       static struct archive_vtable av;
-       static int inited = 0;
-
-       if (!inited) {
-               av.archive_close = _archive_write_close;
-               av.archive_filter_bytes = _archive_filter_bytes;
-               av.archive_filter_code = _archive_filter_code;
-               av.archive_filter_name = _archive_filter_name;
-               av.archive_filter_count = _archive_write_filter_count;
-               av.archive_free = _archive_write_free;
-               av.archive_write_header = _archive_write_header;
-               av.archive_write_finish_entry = _archive_write_finish_entry;
-               av.archive_write_data = _archive_write_data;
-               inited = 1;
-       }
-       return (&av);
-}
+static const struct archive_vtable
+archive_write_vtable = {
+       .archive_close = _archive_write_close,
+       .archive_filter_bytes = _archive_filter_bytes,
+       .archive_filter_code = _archive_filter_code,
+       .archive_filter_name = _archive_filter_name,
+       .archive_filter_count = _archive_write_filter_count,
+       .archive_free = _archive_write_free,
+       .archive_write_header = _archive_write_header,
+       .archive_write_finish_entry = _archive_write_finish_entry,
+       .archive_write_data = _archive_write_data,
+};
 
 /*
  * Allocate, initialize and return an archive object.
@@ -114,7 +104,7 @@ archive_write_new(void)
                return (NULL);
        a->archive.magic = ARCHIVE_WRITE_MAGIC;
        a->archive.state = ARCHIVE_STATE_NEW;
-       a->archive.vtable = archive_write_vtable();
+       a->archive.vtable = &archive_write_vtable;
        /*
         * The value 10240 here matches the traditional tar default,
         * but is otherwise arbitrary.
index aadc58718f9b69c7d47de74e667076ab8dc83c94..7050383e8e59da3a1d3395e3ff38ce482e71a614 100644 (file)
@@ -396,8 +396,6 @@ static struct fixup_entry *sort_dir_list(struct fixup_entry *p);
 static ssize_t write_data_block(struct archive_write_disk *,
                    const char *, size_t);
 
-static struct archive_vtable *archive_write_disk_vtable(void);
-
 static int     _archive_write_disk_close(struct archive *);
 static int     _archive_write_disk_free(struct archive *);
 static int     _archive_write_disk_header(struct archive *,
@@ -489,25 +487,16 @@ lazy_stat(struct archive_write_disk *a)
        return (ARCHIVE_WARN);
 }
 
-static struct archive_vtable *
-archive_write_disk_vtable(void)
-{
-       static struct archive_vtable av;
-       static int inited = 0;
-
-       if (!inited) {
-               av.archive_close = _archive_write_disk_close;
-               av.archive_filter_bytes = _archive_write_disk_filter_bytes;
-               av.archive_free = _archive_write_disk_free;
-               av.archive_write_header = _archive_write_disk_header;
-               av.archive_write_finish_entry
-                   = _archive_write_disk_finish_entry;
-               av.archive_write_data = _archive_write_disk_data;
-               av.archive_write_data_block = _archive_write_disk_data_block;
-               inited = 1;
-       }
-       return (&av);
-}
+static const struct archive_vtable
+archive_write_disk_vtable = {
+       .archive_close = _archive_write_disk_close,
+       .archive_filter_bytes = _archive_write_disk_filter_bytes,
+       .archive_free = _archive_write_disk_free,
+       .archive_write_header = _archive_write_disk_header,
+       .archive_write_finish_entry = _archive_write_disk_finish_entry,
+       .archive_write_data = _archive_write_disk_data,
+       .archive_write_data_block = _archive_write_disk_data_block,
+};
 
 static int64_t
 _archive_write_disk_filter_bytes(struct archive *_a, int n)
@@ -1956,7 +1945,7 @@ archive_write_disk_new(void)
        a->archive.magic = ARCHIVE_WRITE_DISK_MAGIC;
        /* We're ready to write a header immediately. */
        a->archive.state = ARCHIVE_STATE_HEADER;
-       a->archive.vtable = archive_write_disk_vtable();
+       a->archive.vtable = &archive_write_disk_vtable;
        a->start_time = time(NULL);
        /* Query and restore the umask. */
        umask(a->user_umask = umask(0));
index 0c600176cd54325b3c1452f1b84624bb73a1c4a1..1df7010e4cf8e90ccc1fe6cea5aef157a085440f 100644 (file)
@@ -238,8 +238,6 @@ static struct fixup_entry *sort_dir_list(struct fixup_entry *p);
 static ssize_t write_data_block(struct archive_write_disk *,
                    const char *, size_t);
 
-static struct archive_vtable *archive_write_disk_vtable(void);
-
 static int     _archive_write_disk_close(struct archive *);
 static int     _archive_write_disk_free(struct archive *);
 static int     _archive_write_disk_header(struct archive *,
@@ -759,25 +757,16 @@ lazy_stat(struct archive_write_disk *a)
        return (ARCHIVE_WARN);
 }
 
-static struct archive_vtable *
-archive_write_disk_vtable(void)
-{
-       static struct archive_vtable av;
-       static int inited = 0;
-
-       if (!inited) {
-               av.archive_close = _archive_write_disk_close;
-               av.archive_filter_bytes = _archive_write_disk_filter_bytes;
-               av.archive_free = _archive_write_disk_free;
-               av.archive_write_header = _archive_write_disk_header;
-               av.archive_write_finish_entry
-                   = _archive_write_disk_finish_entry;
-               av.archive_write_data = _archive_write_disk_data;
-               av.archive_write_data_block = _archive_write_disk_data_block;
-               inited = 1;
-       }
-       return (&av);
-}
+static const struct archive_vtable
+archive_write_disk_vtable = {
+       .archive_close = _archive_write_disk_close,
+       .archive_filter_bytes = _archive_write_disk_filter_bytes,
+       .archive_free = _archive_write_disk_free,
+       .archive_write_header = _archive_write_disk_header,
+       .archive_write_finish_entry = _archive_write_disk_finish_entry,
+       .archive_write_data = _archive_write_disk_data,
+       .archive_write_data_block = _archive_write_disk_data_block,
+};
 
 static int64_t
 _archive_write_disk_filter_bytes(struct archive *_a, int n)
@@ -1373,7 +1362,7 @@ archive_write_disk_new(void)
        a->archive.magic = ARCHIVE_WRITE_DISK_MAGIC;
        /* We're ready to write a header immediately. */
        a->archive.state = ARCHIVE_STATE_HEADER;
-       a->archive.vtable = archive_write_disk_vtable();
+       a->archive.vtable = &archive_write_disk_vtable;
        a->start_time = time(NULL);
        /* Query and restore the umask. */
        umask(a->user_umask = umask(0));