summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJo-Philipp Wich2020-05-03 19:39:56 +0000
committerJo-Philipp Wich2020-05-07 20:24:19 +0000
commitcf4554d6f26c8973916f83c1720aa2fba55c1baa (patch)
tree0ef0ed20a5e7dd1b51a031eafe03b2df373c5e8f
parent2a0210f42b6d90453a1eeeefd0e8e998c3bae1ea (diff)
downloadopkg-lede-cf4554d6f26c8973916f83c1720aa2fba55c1baa.tar.gz
libopkg: support passing callbacks to feed parsing functions
Extend pkg_hash_add_from_file(), pkg_hash_load_feeds() and pkg_hash_load_status_files() to accept a per-package callback function andan associated userdata pointer. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r--libopkg/opkg.c4
-rw-r--r--libopkg/opkg_cmd.c2
-rw-r--r--libopkg/pkg_hash.c20
-rw-r--r--libopkg/pkg_hash.h7
-rw-r--r--src/opkg-cl.c4
-rw-r--r--tests/opkg_hash_test.c4
6 files changed, 23 insertions, 18 deletions
diff --git a/libopkg/opkg.c b/libopkg/opkg.c
index aba6364..3583488 100644
--- a/libopkg/opkg.c
+++ b/libopkg/opkg.c
@@ -87,10 +87,10 @@ int opkg_new()
if (opkg_conf_load())
goto err0;
- if (pkg_hash_load_feeds(0))
+ if (pkg_hash_load_feeds(0, NULL, NULL))
goto err1;
- if (pkg_hash_load_status_files())
+ if (pkg_hash_load_status_files(NULL, NULL))
goto err1;
return 0;
diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c
index c823df8..8de22f3 100644
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -458,7 +458,7 @@ static int opkg_install_cmd(int argc, char **argv)
}
pkg_hash_load_package_details();
- pkg_hash_load_status_files();
+ pkg_hash_load_status_files(NULL, NULL);
if (conf->force_reinstall) {
int saved_force_depends = conf->force_depends;
diff --git a/libopkg/pkg_hash.c b/libopkg/pkg_hash.c
index 611f3b9..52c64ff 100644
--- a/libopkg/pkg_hash.c
+++ b/libopkg/pkg_hash.c
@@ -79,7 +79,7 @@ int dist_hash_add_from_file(const char *lists_dir, pkg_src_t * dist)
sprintf_alloc(&list_file, "%s/%s", lists_dir, subname);
if (file_exists(list_file)) {
- if (pkg_hash_add_from_file(list_file, dist, NULL, 0, 0)) {
+ if (pkg_hash_add_from_file(list_file, dist, NULL, 0, 0, NULL, NULL)) {
free(list_file);
return -1;
}
@@ -95,7 +95,8 @@ int dist_hash_add_from_file(const char *lists_dir, pkg_src_t * dist)
int
pkg_hash_add_from_file(const char *file_name,
- pkg_src_t * src, pkg_dest_t * dest, int is_status_file, int state_flags)
+ pkg_src_t * src, pkg_dest_t * dest, int is_status_file, int state_flags,
+ void (*cb)(pkg_t *, void *), void *priv)
{
pkg_t *pkg;
FILE *fp;
@@ -158,7 +159,10 @@ pkg_hash_add_from_file(const char *file_name,
continue;
}
- hash_insert_pkg(pkg, is_status_file);
+ if (cb)
+ cb(pkg, priv);
+ else
+ hash_insert_pkg(pkg, is_status_file);
} while (!feof(fp));
@@ -174,7 +178,7 @@ pkg_hash_add_from_file(const char *file_name,
/*
* Load in feed files from the cached "src" and/or "src/gz" locations.
*/
-int pkg_hash_load_feeds(int state_flags)
+int pkg_hash_load_feeds(int state_flags, void (*cb)(pkg_t *, void *), void *priv)
{
pkg_src_list_elt_t *iter;
pkg_src_t *src;
@@ -193,7 +197,7 @@ int pkg_hash_load_feeds(int state_flags)
sprintf_alloc(&list_file, "%s/%s", lists_dir, src->name);
if (file_exists(list_file)) {
- if (pkg_hash_add_from_file(list_file, src, NULL, 0, state_flags)) {
+ if (pkg_hash_add_from_file(list_file, src, NULL, 0, state_flags, cb, priv)) {
free(list_file);
return -1;
}
@@ -207,7 +211,7 @@ int pkg_hash_load_feeds(int state_flags)
/*
* Load in status files from the configured "dest"s.
*/
-int pkg_hash_load_status_files(void)
+int pkg_hash_load_status_files(void (*cb)(pkg_t *, void *), void *priv)
{
pkg_dest_list_elt_t *iter;
pkg_dest_t *dest;
@@ -221,7 +225,7 @@ int pkg_hash_load_status_files(void)
if (file_exists(dest->status_file_name)) {
if (pkg_hash_add_from_file
- (dest->status_file_name, NULL, dest, 1, SF_NEED_DETAIL))
+ (dest->status_file_name, NULL, dest, 1, SF_NEED_DETAIL, cb, priv))
return -1;
}
}
@@ -255,7 +259,7 @@ int pkg_hash_load_package_details(void)
int n_need_detail;
while (1) {
- pkg_hash_load_feeds(0);
+ pkg_hash_load_feeds(0, NULL, NULL);
n_need_detail = 0;
hash_table_foreach(&conf->pkg_hash, pkg_hash_load_package_details_helper, &n_need_detail);
diff --git a/libopkg/pkg_hash.h b/libopkg/pkg_hash.h
index e849160..e5ab2e0 100644
--- a/libopkg/pkg_hash.h
+++ b/libopkg/pkg_hash.h
@@ -30,9 +30,10 @@ void pkg_hash_fetch_available(pkg_vec_t * available);
int dist_hash_add_from_file(const char *file_name, pkg_src_t * dist);
int pkg_hash_add_from_file(const char *file_name, pkg_src_t * src,
- pkg_dest_t * dest, int is_status_file, int state_flags);
-int pkg_hash_load_feeds(int state_flags);
-int pkg_hash_load_status_files(void);
+ pkg_dest_t * dest, int is_status_file, int state_flags,
+ void (*cb)(pkg_t *, void *), void *priv);
+int pkg_hash_load_feeds(int state_flags, void (*cb)(pkg_t *, void *), void *priv);
+int pkg_hash_load_status_files(void (*cb)(pkg_t *, void *), void *priv);
int pkg_hash_load_package_details(void);
void hash_insert_pkg(pkg_t * pkg, int set_status);
diff --git a/src/opkg-cl.c b/src/opkg-cl.c
index 351574b..2131883 100644
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -431,11 +431,11 @@ int main(int argc, char *argv[])
if (!nocheckfordirorfile) {
if (!noreadfeedsfile) {
- if (pkg_hash_load_feeds(SF_NEED_DETAIL))
+ if (pkg_hash_load_feeds(SF_NEED_DETAIL, NULL, NULL))
goto err1;
}
- if (pkg_hash_load_status_files())
+ if (pkg_hash_load_status_files(NULL, NULL))
goto err1;
}
diff --git a/tests/opkg_hash_test.c b/tests/opkg_hash_test.c
index 6c67e59..df55bad 100644
--- a/tests/opkg_hash_test.c
+++ b/tests/opkg_hash_test.c
@@ -35,8 +35,8 @@ int main(int argc, char *argv[])
}
pkg_hash_init("test", hash, 1024);
- pkg_hash_add_from_file(&conf, argv[1], NULL, NULL, 0);
- pkg_hash_add_from_file(&conf, argv[2], NULL, NULL, 0);
+ pkg_hash_add_from_file(&conf, argv[1], NULL, NULL, 0, NULL, NULL);
+ pkg_hash_add_from_file(&conf, argv[2], NULL, NULL, 0, NULL, NULL);
if (argc < 4) {
pkg_print_info(pkg_hash_fetch_by_name_version