Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmil Velikov <emil.l.velikov@gmail.com>2021-01-05 00:36:08 +0000
committerAllan McRae <allan@archlinux.org>2021-01-09 00:14:56 +1000
commit027d76b9f504c61878f0e78bf04847e60f90013c (patch)
tree6ec4cb68c6951f0e222880711fd4ea760f3e4691
parent4472ce55d7e45fdd8cb6c0213a76128fa826a31e (diff)
libalpm: introduce get_sync_pkg_ops() helper
Currently default_pkg_ops is accessed in two different ways. There is get_file_pkg_ops (in be_package.c) creating a local once-off 'tweaked' copy. As well as load_pkg_for_entry (be_sync.c) which modifies in-place and uses default_pkg_ops. This seems rather misleading and fragile approach. Introduce a helper for the second use-case so that default_pkg_ops is handled consistently and essentially remains unchanged throughout. Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com> Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r--lib/libalpm/be_sync.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index 225df76d..37000dec 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -281,6 +281,22 @@ static int _sync_get_validation(alpm_pkg_t *pkg)
return pkg->validation;
}
+/** Package sync operations struct accessor. We implement this as a method
+ * because we want to reuse the majority of the default_pkg_ops struct and
+ * add only a few operations of our own on top.
+ */
+static struct pkg_operations *get_sync_pkg_ops(void)
+{
+ static struct pkg_operations sync_pkg_ops;
+ static int sync_pkg_ops_initalized = 0;
+ if(!sync_pkg_ops_initalized) {
+ sync_pkg_ops = default_pkg_ops;
+ sync_pkg_ops.get_validation = _sync_get_validation;
+ sync_pkg_ops_initalized = 1;
+ }
+ return &sync_pkg_ops;
+}
+
static alpm_pkg_t *load_pkg_for_entry(alpm_db_t *db, const char *entryname,
const char **entry_filename, alpm_pkg_t *likely_pkg)
{
@@ -321,8 +337,7 @@ static alpm_pkg_t *load_pkg_for_entry(alpm_db_t *db, const char *entryname,
pkg->origin = ALPM_PKG_FROM_SYNCDB;
pkg->origin_data.db = db;
- pkg->ops = &default_pkg_ops;
- pkg->ops->get_validation = _sync_get_validation;
+ pkg->ops = get_sync_pkg_ops();
pkg->handle = db->handle;
/* add to the collection */