From: Jo-Philipp Wich Date: Sun, 3 May 2020 19:39:56 +0000 (+0200) Subject: libopkg: support passing callbacks to feed parsing functions X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=cf4554d6f26c8973916f83c1720aa2fba55c1baa;hp=2a0210f42b6d90453a1eeeefd0e8e998c3bae1ea;p=project%2Fopkg-lede.git 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 --- 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