diff --git a/Makefile.am b/Makefile.am index 9610acb..f49a0d3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -80,6 +80,7 @@ pkginclude_HEADERS = libpkgconf/bsdstubs.h libpkgconf/iter.h libpkgconf/libpkgco libpkgconf_la_SOURCES = \ libpkgconf/audit.c \ libpkgconf/cache.c \ + libpkgconf/client.c \ libpkgconf/pkg.c \ libpkgconf/bsdstubs.c \ libpkgconf/fragment.c \ diff --git a/libpkgconf/dependency.c b/libpkgconf/dependency.c index 1c7c8ff..160caa5 100644 --- a/libpkgconf/dependency.c +++ b/libpkgconf/dependency.c @@ -218,9 +218,9 @@ pkgconf_dependency_parse_str(pkgconf_list_t *deplist_head, const char *depends) } void -pkgconf_dependency_parse(pkgconf_pkg_t *pkg, pkgconf_list_t *deplist, const char *depends) +pkgconf_dependency_parse(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, pkgconf_list_t *deplist, const char *depends) { - char *kvdepends = pkgconf_tuple_parse(&pkg->vars, depends); + char *kvdepends = pkgconf_tuple_parse(client, &pkg->vars, depends); pkgconf_dependency_parse_str(deplist, kvdepends); free(kvdepends); diff --git a/libpkgconf/fragment.c b/libpkgconf/fragment.c index e596a10..1dd6902 100644 --- a/libpkgconf/fragment.c +++ b/libpkgconf/fragment.c @@ -71,12 +71,12 @@ pkgconf_fragment_is_special(const char *string) } static inline void -pkgconf_fragment_munge(char *buf, size_t buflen, const char *source, const char *sysroot_dir) +pkgconf_fragment_munge(const pkgconf_client_t *client, char *buf, size_t buflen, const char *source, const char *sysroot_dir) { *buf = '\0'; if (sysroot_dir == NULL) - sysroot_dir = pkgconf_tuple_find_global("pc_sysrootdir"); + sysroot_dir = pkgconf_tuple_find_global(client, "pc_sysrootdir"); if (pkgconf_fragment_should_munge(source, sysroot_dir)) strlcat(buf, sysroot_dir, buflen); @@ -85,7 +85,7 @@ pkgconf_fragment_munge(char *buf, size_t buflen, const char *source, const char } static inline char * -pkgconf_fragment_copy_munged(const char *source, unsigned int flags) +pkgconf_fragment_copy_munged(const pkgconf_client_t *client, const char *source, unsigned int flags) { char mungebuf[PKGCONF_BUFSIZE]; char *sysroot_dir; @@ -93,15 +93,15 @@ pkgconf_fragment_copy_munged(const char *source, unsigned int flags) if (!(flags & PKGCONF_PKG_PKGF_MUNGE_SYSROOT_PREFIX)) return strdup(source); - sysroot_dir = pkgconf_tuple_find_global("pc_sysrootdir"); + sysroot_dir = pkgconf_tuple_find_global(client, "pc_sysrootdir"); - pkgconf_fragment_munge(mungebuf, sizeof mungebuf, source, sysroot_dir); + pkgconf_fragment_munge(client, mungebuf, sizeof mungebuf, source, sysroot_dir); return strdup(mungebuf); } void -pkgconf_fragment_add(pkgconf_list_t *list, const char *string, unsigned int flags) +pkgconf_fragment_add(const pkgconf_client_t *client, pkgconf_list_t *list, const char *string, unsigned int flags) { pkgconf_fragment_t *frag; @@ -113,7 +113,7 @@ pkgconf_fragment_add(pkgconf_list_t *list, const char *string, unsigned int flag frag = calloc(sizeof(pkgconf_fragment_t), 1); frag->type = *(string + 1); - frag->data = pkgconf_fragment_copy_munged(string + 2, flags); + frag->data = pkgconf_fragment_copy_munged(client, string + 2, flags); } else { @@ -128,7 +128,7 @@ pkgconf_fragment_add(pkgconf_list_t *list, const char *string, unsigned int flag size_t len; char *newdata; - pkgconf_fragment_munge(mungebuf, sizeof mungebuf, string, NULL); + pkgconf_fragment_munge(client, mungebuf, sizeof mungebuf, string, NULL); len = strlen(parent->data) + strlen(mungebuf) + 2; newdata = malloc(len); @@ -260,16 +260,16 @@ pkgconf_fragment_free(pkgconf_list_t *list) } void -pkgconf_fragment_parse(pkgconf_list_t *list, pkgconf_list_t *vars, const char *value, unsigned int flags) +pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value, unsigned int flags) { int i, argc; char **argv; - char *repstr = pkgconf_tuple_parse(vars, value); + char *repstr = pkgconf_tuple_parse(client, vars, value); pkgconf_argv_split(repstr, &argc, &argv); for (i = 0; i < argc; i++) - pkgconf_fragment_add(list, argv[i], flags); + pkgconf_fragment_add(client, list, argv[i], flags); pkgconf_argv_free(argv); free(repstr); diff --git a/libpkgconf/libpkgconf.h b/libpkgconf/libpkgconf.h index 136ffec..6b93d61 100644 --- a/libpkgconf/libpkgconf.h +++ b/libpkgconf/libpkgconf.h @@ -53,6 +53,7 @@ typedef struct pkgconf_dependency_ pkgconf_dependency_t; typedef struct pkgconf_tuple_ pkgconf_tuple_t; typedef struct pkgconf_fragment_ pkgconf_fragment_t; typedef struct pkgconf_path_ pkgconf_path_t; +typedef struct pkgconf_client_ pkgconf_client_t; #define PKGCONF_ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) @@ -127,6 +128,30 @@ struct pkgconf_pkg_ { unsigned int flags; }; +typedef bool (*pkgconf_pkg_iteration_func_t)(const pkgconf_pkg_t *pkg, void *data); +typedef void (*pkgconf_pkg_traverse_func_t)(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data, unsigned int flags); +typedef bool (*pkgconf_queue_apply_func_t)(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth, unsigned int flags); +typedef bool (*pkgconf_error_handler_func_t)(const char *msg); + +struct pkgconf_client_ { + pkgconf_list_t dir_list; + +#ifdef XXX_NOTYET + pkgconf_list_t filter_libdirs; + pkgconf_list_t filter_includedirs; +#endif + + pkgconf_list_t global_vars; + + pkgconf_error_handler_func_t error_handler; +}; + +/* client.c */ +void pkgconf_client_init(pkgconf_client_t *client, pkgconf_error_handler_func_t error_handler); +pkgconf_client_t *pkgconf_client_new(pkgconf_error_handler_func_t error_handler); +void pkgconf_client_deinit(pkgconf_client_t *client); +void pkgconf_client_free(pkgconf_client_t *client); + #define PKGCONF_IS_MODULE_SEPARATOR(c) ((c) == ',' || isspace ((unsigned int)(c))) #define PKGCONF_IS_OPERATOR_CHAR(c) ((c) == '<' || (c) == '>' || (c) == '!' || (c) == '=') @@ -149,11 +174,6 @@ struct pkgconf_pkg_ { #define PKGCONF_PKG_ERRF_PACKAGE_CONFLICT 0x4 #define PKGCONF_PKG_ERRF_DEPGRAPH_BREAK 0x8 -typedef bool (*pkgconf_pkg_iteration_func_t)(const pkgconf_pkg_t *pkg, void *data); -typedef void (*pkgconf_pkg_traverse_func_t)(pkgconf_pkg_t *pkg, void *data, unsigned int flags); -typedef bool (*pkgconf_queue_apply_func_t)(pkgconf_pkg_t *world, void *data, int maxdepth, unsigned int flags); -typedef bool (*pkgconf_error_handler_func_t)(const char *msg); - /* pkg.c */ #if defined(__GNUC__) || defined(__INTEL_COMPILER) #define PRINTFLIKE(fmtarg, firstvararg) \ @@ -172,23 +192,23 @@ void pkgconf_set_error_handler(pkgconf_error_handler_func_t func); pkgconf_pkg_t *pkgconf_pkg_ref(pkgconf_pkg_t *pkg); void pkgconf_pkg_unref(pkgconf_pkg_t *pkg); void pkgconf_pkg_free(pkgconf_pkg_t *pkg); -pkgconf_pkg_t *pkgconf_pkg_find(const char *name, unsigned int flags); -unsigned int pkgconf_pkg_traverse(pkgconf_pkg_t *root, pkgconf_pkg_traverse_func_t func, void *data, int maxdepth, unsigned int flags); -unsigned int pkgconf_pkg_verify_graph(pkgconf_pkg_t *root, int depth, unsigned int flags); -pkgconf_pkg_t *pkgconf_pkg_verify_dependency(pkgconf_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags); +pkgconf_pkg_t *pkgconf_pkg_find(pkgconf_client_t *client, const char *name, unsigned int flags); +unsigned int pkgconf_pkg_traverse(const pkgconf_client_t *client, pkgconf_pkg_t *root, pkgconf_pkg_traverse_func_t func, void *data, int maxdepth, unsigned int flags); +unsigned int pkgconf_pkg_verify_graph(const pkgconf_client_t *client, pkgconf_pkg_t *root, int depth, unsigned int flags); +pkgconf_pkg_t *pkgconf_pkg_verify_dependency(const pkgconf_client_t *client, pkgconf_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags); const char *pkgconf_pkg_get_comparator(const pkgconf_dependency_t *pkgdep); -int pkgconf_pkg_cflags(pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth, unsigned int flags); -int pkgconf_pkg_libs(pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth, unsigned int flags); +int pkgconf_pkg_cflags(const pkgconf_client_t *client, pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth, unsigned int flags); +int pkgconf_pkg_libs(const pkgconf_client_t *client, pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth, unsigned int flags); pkgconf_pkg_comparator_t pkgconf_pkg_comparator_lookup_by_name(const char *name); pkgconf_pkg_t *pkgconf_builtin_pkg_get(const char *name); int pkgconf_compare_version(const char *a, const char *b); -pkgconf_pkg_t *pkgconf_scan_all(void *ptr, pkgconf_pkg_iteration_func_t func); +pkgconf_pkg_t *pkgconf_scan_all(pkgconf_client_t *client, void *ptr, pkgconf_pkg_iteration_func_t func); /* parse.c */ -pkgconf_pkg_t *pkgconf_pkg_new_from_file(const char *path, FILE *f, unsigned int flags); +pkgconf_pkg_t *pkgconf_pkg_new_from_file(const pkgconf_client_t *client, const char *path, FILE *f, unsigned int flags); void pkgconf_dependency_parse_str(pkgconf_list_t *deplist_head, const char *depends); -void pkgconf_dependency_parse(pkgconf_pkg_t *pkg, pkgconf_list_t *deplist_head, const char *depends); +void pkgconf_dependency_parse(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, pkgconf_list_t *deplist_head, const char *depends); void pkgconf_dependency_append(pkgconf_list_t *list, pkgconf_dependency_t *tail); void pkgconf_dependency_free(pkgconf_list_t *list); pkgconf_dependency_t *pkgconf_dependency_add(pkgconf_list_t *list, const char *package, const char *version, pkgconf_pkg_comparator_t compare); @@ -198,8 +218,8 @@ int pkgconf_argv_split(const char *src, int *argc, char ***argv); void pkgconf_argv_free(char **argv); /* fragment.c */ -void pkgconf_fragment_parse(pkgconf_list_t *list, pkgconf_list_t *vars, const char *value, unsigned int flags); -void pkgconf_fragment_add(pkgconf_list_t *list, const char *string, unsigned int flags); +void pkgconf_fragment_parse(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_list_t *vars, const char *value, unsigned int flags); +void pkgconf_fragment_add(const pkgconf_client_t *client, pkgconf_list_t *list, const char *string, unsigned int flags); void pkgconf_fragment_copy(pkgconf_list_t *list, pkgconf_fragment_t *base, unsigned int flags, bool is_private); void pkgconf_fragment_delete(pkgconf_list_t *list, pkgconf_fragment_t *node); void pkgconf_fragment_free(pkgconf_list_t *list); @@ -208,21 +228,21 @@ void pkgconf_fragment_free(pkgconf_list_t *list); char *pkgconf_fgetline(char *line, size_t size, FILE *stream); /* tuple.c */ -pkgconf_tuple_t *pkgconf_tuple_add(pkgconf_list_t *parent, const char *key, const char *value, bool parse); -char *pkgconf_tuple_find(pkgconf_list_t *list, const char *key); -char *pkgconf_tuple_parse(pkgconf_list_t *list, const char *value); +pkgconf_tuple_t *pkgconf_tuple_add(const pkgconf_client_t *client, pkgconf_list_t *parent, const char *key, const char *value, bool parse); +char *pkgconf_tuple_find(const pkgconf_client_t *client, pkgconf_list_t *list, const char *key); +char *pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *list, const char *value); void pkgconf_tuple_free(pkgconf_list_t *list); -void pkgconf_tuple_add_global(const char *key, const char *value); -char *pkgconf_tuple_find_global(const char *key); -void pkgconf_tuple_free_global(void); -void pkgconf_tuple_define_global(const char *kv); +void pkgconf_tuple_add_global(pkgconf_client_t *client, const char *key, const char *value); +char *pkgconf_tuple_find_global(const pkgconf_client_t *client, const char *key); +void pkgconf_tuple_free_global(pkgconf_client_t *client); +void pkgconf_tuple_define_global(pkgconf_client_t *client, const char *kv); /* queue.c */ void pkgconf_queue_push(pkgconf_list_t *list, const char *package); -bool pkgconf_queue_compile(pkgconf_pkg_t *world, pkgconf_list_t *list); +bool pkgconf_queue_compile(const pkgconf_client_t *client, pkgconf_pkg_t *world, pkgconf_list_t *list); void pkgconf_queue_free(pkgconf_list_t *list); -bool pkgconf_queue_apply(pkgconf_list_t *list, pkgconf_queue_apply_func_t func, int maxdepth, unsigned int flags, void *data); -bool pkgconf_queue_validate(pkgconf_list_t *list, int maxdepth, unsigned int flags); +bool pkgconf_queue_apply(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_queue_apply_func_t func, int maxdepth, unsigned int flags, void *data); +bool pkgconf_queue_validate(const pkgconf_client_t *client, pkgconf_list_t *list, int maxdepth, unsigned int flags); /* cache.c */ pkgconf_pkg_t *pkgconf_cache_lookup(const char *id); diff --git a/libpkgconf/pkg.c b/libpkgconf/pkg.c index 102a161..63c8986 100644 --- a/libpkgconf/pkg.c +++ b/libpkgconf/pkg.c @@ -115,21 +115,19 @@ pkg_get_parent_dir(pkgconf_pkg_t *pkg) return buf; } -static pkgconf_list_t pkg_dir_list = PKGCONF_LIST_INITIALIZER; - static void -pkgconf_pkg_dir_list_build(unsigned int flags) +pkgconf_pkg_dir_list_build(pkgconf_client_t *client, unsigned int flags) { - if (pkg_dir_list.head != NULL || pkg_dir_list.tail != NULL) + if (client->dir_list.head != NULL || client->dir_list.tail != NULL) return; - pkgconf_path_build_from_environ("PKG_CONFIG_PATH", NULL, &pkg_dir_list); + pkgconf_path_build_from_environ("PKG_CONFIG_PATH", NULL, &client->dir_list); if (!(flags & PKGCONF_PKG_PKGF_ENV_ONLY)) - pkgconf_path_build_from_environ("PKG_CONFIG_LIBDIR", get_default_pkgconfig_path(), &pkg_dir_list); + pkgconf_path_build_from_environ("PKG_CONFIG_LIBDIR", get_default_pkgconfig_path(), &client->dir_list); } -typedef void (*pkgconf_pkg_parser_keyword_func_t)(pkgconf_pkg_t *pkg, const ptrdiff_t offset, char *value, unsigned int flags); +typedef void (*pkgconf_pkg_parser_keyword_func_t)(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, const ptrdiff_t offset, char *value, unsigned int flags); typedef struct { const char *keyword; const pkgconf_pkg_parser_keyword_func_t func; @@ -143,28 +141,28 @@ static int pkgconf_pkg_parser_keyword_pair_cmp(const void *key, const void *ptr) } static void -pkgconf_pkg_parser_tuple_func(pkgconf_pkg_t *pkg, const ptrdiff_t offset, char *value, unsigned int flags) +pkgconf_pkg_parser_tuple_func(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, const ptrdiff_t offset, char *value, unsigned int flags) { char **dest = ((void *) pkg + offset); (void) flags; - *dest = pkgconf_tuple_parse(&pkg->vars, value); + *dest = pkgconf_tuple_parse(client, &pkg->vars, value); } static void -pkgconf_pkg_parser_fragment_func(pkgconf_pkg_t *pkg, const ptrdiff_t offset, char *value, unsigned int flags) +pkgconf_pkg_parser_fragment_func(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, const ptrdiff_t offset, char *value, unsigned int flags) { pkgconf_list_t *dest = ((void *) pkg + offset); - pkgconf_fragment_parse(dest, &pkg->vars, value, flags); + pkgconf_fragment_parse(client, dest, &pkg->vars, value, flags); } static void -pkgconf_pkg_parser_dependency_func(pkgconf_pkg_t *pkg, const ptrdiff_t offset, char *value, unsigned int flags) +pkgconf_pkg_parser_dependency_func(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, const ptrdiff_t offset, char *value, unsigned int flags) { pkgconf_list_t *dest = ((void *) pkg + offset); (void) flags; - pkgconf_dependency_parse(pkg, dest, value); + pkgconf_dependency_parse(client, pkg, dest, value); } /* keep this in alphabetical order */ @@ -183,7 +181,7 @@ static const pkgconf_pkg_parser_keyword_pair_t pkgconf_pkg_parser_keyword_funcs[ }; static bool -pkgconf_pkg_parser_keyword_set(pkgconf_pkg_t *pkg, const char *keyword, char *value, unsigned int flags) +pkgconf_pkg_parser_keyword_set(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, const char *keyword, char *value, unsigned int flags) { const pkgconf_pkg_parser_keyword_pair_t *pair = bsearch(keyword, pkgconf_pkg_parser_keyword_funcs, PKGCONF_ARRAY_SIZE(pkgconf_pkg_parser_keyword_funcs), @@ -192,7 +190,7 @@ pkgconf_pkg_parser_keyword_set(pkgconf_pkg_t *pkg, const char *keyword, char *va if (pair == NULL || pair->func == NULL) return false; - pair->func(pkg, pair->offset, value, flags); + pair->func(client, pkg, pair->offset, value, flags); return true; } @@ -202,7 +200,7 @@ pkgconf_pkg_parser_keyword_set(pkgconf_pkg_t *pkg, const char *keyword, char *va * Parse a .pc file into a pkgconf_pkg_t object structure. */ pkgconf_pkg_t * -pkgconf_pkg_new_from_file(const char *filename, FILE *f, unsigned int flags) +pkgconf_pkg_new_from_file(const pkgconf_client_t *client, const char *filename, FILE *f, unsigned int flags) { pkgconf_pkg_t *pkg; char readbuf[PKGCONF_BUFSIZE]; @@ -210,7 +208,7 @@ pkgconf_pkg_new_from_file(const char *filename, FILE *f, unsigned int flags) pkg = calloc(sizeof(pkgconf_pkg_t), 1); pkg->filename = strdup(filename); - pkgconf_tuple_add(&pkg->vars, "pcfiledir", pkg_get_parent_dir(pkg), true); + pkgconf_tuple_add(client, &pkg->vars, "pcfiledir", pkg_get_parent_dir(pkg), true); /* make module id */ if ((idptr = strrchr(pkg->filename, PKG_DIR_SEP_S)) != NULL) @@ -253,12 +251,12 @@ pkgconf_pkg_new_from_file(const char *filename, FILE *f, unsigned int flags) switch (op) { case ':': - if (!pkgconf_pkg_parser_keyword_set(pkg, key, value, flags)) + if (!pkgconf_pkg_parser_keyword_set(client, pkg, key, value, flags)) /* XXX: warning? */ ; break; case '=': - pkgconf_tuple_add(&pkg->vars, key, value, true); + pkgconf_tuple_add(client, &pkg->vars, key, value, true); break; default: break; @@ -332,7 +330,7 @@ pkgconf_pkg_unref(pkgconf_pkg_t *pkg) } static inline pkgconf_pkg_t * -pkgconf_pkg_try_specific_path(const char *path, const char *name, unsigned int flags) +pkgconf_pkg_try_specific_path(const pkgconf_client_t *client, const char *path, const char *name, unsigned int flags) { pkgconf_pkg_t *pkg = NULL; FILE *f; @@ -344,17 +342,17 @@ pkgconf_pkg_try_specific_path(const char *path, const char *name, unsigned int f if (!(flags & PKGCONF_PKG_PKGF_NO_UNINSTALLED) && (f = fopen(uninst_locbuf, "r")) != NULL) { - pkg = pkgconf_pkg_new_from_file(uninst_locbuf, f, flags); + pkg = pkgconf_pkg_new_from_file(client, uninst_locbuf, f, flags); pkg->flags |= PKGCONF_PKG_PROPF_UNINSTALLED; } else if ((f = fopen(locbuf, "r")) != NULL) - pkg = pkgconf_pkg_new_from_file(locbuf, f, flags); + pkg = pkgconf_pkg_new_from_file(client, locbuf, f, flags); return pkg; } static pkgconf_pkg_t * -pkgconf_pkg_scan_dir(const char *path, void *data, pkgconf_pkg_iteration_func_t func) +pkgconf_pkg_scan_dir(const pkgconf_client_t *client, const char *path, void *data, pkgconf_pkg_iteration_func_t func) { DIR *dir; struct dirent *dirent; @@ -383,7 +381,7 @@ pkgconf_pkg_scan_dir(const char *path, void *data, pkgconf_pkg_iteration_func_t if (f == NULL) continue; - pkg = pkgconf_pkg_new_from_file(filebuf, f, 0); + pkg = pkgconf_pkg_new_from_file(client, filebuf, f, 0); if (pkg != NULL) { if (func(pkg, data)) @@ -402,18 +400,18 @@ out: } pkgconf_pkg_t * -pkgconf_scan_all(void *data, pkgconf_pkg_iteration_func_t func) +pkgconf_scan_all(pkgconf_client_t *client, void *data, pkgconf_pkg_iteration_func_t func) { pkgconf_node_t *n; pkgconf_pkg_t *pkg; - pkgconf_pkg_dir_list_build(0); + pkgconf_pkg_dir_list_build(client, 0); - PKGCONF_FOREACH_LIST_ENTRY(pkg_dir_list.head, n) + PKGCONF_FOREACH_LIST_ENTRY(client->dir_list.head, n) { pkgconf_path_t *pnode = n->data; - if ((pkg = pkgconf_pkg_scan_dir(pnode->path, data, func)) != NULL) + if ((pkg = pkgconf_pkg_scan_dir(client, pnode->path, data, func)) != NULL) return pkg; } @@ -459,13 +457,13 @@ pkgconf_pkg_find_in_registry_key(HKEY hkey, const char *name, unsigned int flags #endif pkgconf_pkg_t * -pkgconf_pkg_find(const char *name, unsigned int flags) +pkgconf_pkg_find(pkgconf_client_t *client, const char *name, unsigned int flags) { pkgconf_pkg_t *pkg = NULL; pkgconf_node_t *n; FILE *f; - pkgconf_pkg_dir_list_build(flags); + pkgconf_pkg_dir_list_build(client, flags); /* name might actually be a filename. */ if (str_has_suffix(name, PKG_CONFIG_EXT)) @@ -474,8 +472,8 @@ pkgconf_pkg_find(const char *name, unsigned int flags) { pkgconf_pkg_t *pkg; - pkg = pkgconf_pkg_new_from_file(name, f, flags); - pkgconf_path_add(pkg_get_parent_dir(pkg), &pkg_dir_list); + pkg = pkgconf_pkg_new_from_file(client, name, f, flags); + pkgconf_path_add(pkg_get_parent_dir(pkg), &client->dir_list); return pkg; } @@ -495,11 +493,11 @@ pkgconf_pkg_find(const char *name, unsigned int flags) } } - PKGCONF_FOREACH_LIST_ENTRY(pkg_dir_list.head, n) + PKGCONF_FOREACH_LIST_ENTRY(client->dir_list.head, n) { pkgconf_path_t *pnode = n->data; - pkg = pkgconf_pkg_try_specific_path(pnode->path, name, flags); + pkg = pkgconf_pkg_try_specific_path(client, pnode->path, name, flags); if (pkg != NULL) goto out; } @@ -974,7 +972,7 @@ pkgconf_pkg_scan_provides_entry(const pkgconf_pkg_t *pkg, const pkgconf_pkg_scan * scan all available packages to see if a Provides rule matches the pkgdep. */ static pkgconf_pkg_t * -pkgconf_pkg_scan_providers(pkgconf_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags) +pkgconf_pkg_scan_providers(const pkgconf_client_t *client, pkgconf_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags) { pkgconf_pkg_t *pkg; pkgconf_pkg_scan_providers_ctx_t ctx = { @@ -982,7 +980,7 @@ pkgconf_pkg_scan_providers(pkgconf_dependency_t *pkgdep, unsigned int flags, uns .flags = flags }; - pkg = pkgconf_scan_all(&ctx, (pkgconf_pkg_iteration_func_t) pkgconf_pkg_scan_provides_entry); + pkg = pkgconf_scan_all(client, &ctx, (pkgconf_pkg_iteration_func_t) pkgconf_pkg_scan_provides_entry); if (pkg != NULL) return pkg; @@ -999,14 +997,14 @@ pkgconf_pkg_scan_providers(pkgconf_dependency_t *pkgdep, unsigned int flags, uns * return the appropriate pkgconf_pkg_t object, else NULL. */ pkgconf_pkg_t * -pkgconf_pkg_verify_dependency(pkgconf_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags) +pkgconf_pkg_verify_dependency(const pkgconf_client_t *client, pkgconf_dependency_t *pkgdep, unsigned int flags, unsigned int *eflags) { pkgconf_pkg_t *pkg = NULL; if (eflags != NULL) *eflags = PKGCONF_PKG_ERRF_OK; - pkg = pkgconf_pkg_find(pkgdep->package, flags); + pkg = pkgconf_pkg_find(client, pkgdep->package, flags); if (pkg == NULL) { if (flags & PKGCONF_PKG_PKGF_SKIP_PROVIDES) @@ -1017,7 +1015,7 @@ pkgconf_pkg_verify_dependency(pkgconf_dependency_t *pkgdep, unsigned int flags, return NULL; } - return pkgconf_pkg_scan_providers(pkgdep, flags, eflags); + return pkgconf_pkg_scan_providers(client, pkgdep, flags, eflags); } if (pkg->id == NULL) @@ -1039,9 +1037,9 @@ pkgconf_pkg_verify_dependency(pkgconf_dependency_t *pkgdep, unsigned int flags, * pkgconf_pkg_traverse(). */ unsigned int -pkgconf_pkg_verify_graph(pkgconf_pkg_t *root, int depth, unsigned int flags) +pkgconf_pkg_verify_graph(const pkgconf_client_t *client, pkgconf_pkg_t *root, int depth, unsigned int flags) { - return pkgconf_pkg_traverse(root, NULL, NULL, depth, flags); + return pkgconf_pkg_traverse(client, root, NULL, NULL, depth, flags); } static unsigned int @@ -1079,7 +1077,8 @@ pkgconf_pkg_report_graph_error(pkgconf_pkg_t *parent, pkgconf_pkg_t *pkg, pkgcon } static inline unsigned int -pkgconf_pkg_walk_list(pkgconf_pkg_t *parent, +pkgconf_pkg_walk_list(const pkgconf_client_t *client, + pkgconf_pkg_t *parent, pkgconf_list_t *deplist, pkgconf_pkg_traverse_func_t func, void *data, @@ -1098,7 +1097,7 @@ pkgconf_pkg_walk_list(pkgconf_pkg_t *parent, if (*depnode->package == '\0') continue; - pkgdep = pkgconf_pkg_verify_dependency(depnode, flags, &eflags_local); + pkgdep = pkgconf_pkg_verify_dependency(client, depnode, flags, &eflags_local); eflags |= eflags_local; if (eflags_local != PKGCONF_PKG_ERRF_OK && !(flags & PKGCONF_PKG_PKGF_SKIP_ERRORS)) @@ -1118,7 +1117,7 @@ pkgconf_pkg_walk_list(pkgconf_pkg_t *parent, pkgconf_audit_log_dependency(pkgdep, depnode); pkgdep->flags |= PKGCONF_PKG_PROPF_SEEN; - eflags |= pkgconf_pkg_traverse(pkgdep, func, data, depth - 1, flags); + eflags |= pkgconf_pkg_traverse(client, pkgdep, func, data, depth - 1, flags); pkgdep->flags &= ~PKGCONF_PKG_PROPF_SEEN; pkgconf_pkg_unref(pkgdep); } @@ -1127,7 +1126,8 @@ pkgconf_pkg_walk_list(pkgconf_pkg_t *parent, } static inline unsigned int -pkgconf_pkg_walk_conflicts_list(pkgconf_pkg_t *root, pkgconf_list_t *deplist, unsigned int flags) +pkgconf_pkg_walk_conflicts_list(const pkgconf_client_t *client, + pkgconf_pkg_t *root, pkgconf_list_t *deplist, unsigned int flags) { unsigned int eflags; pkgconf_node_t *node, *childnode; @@ -1147,7 +1147,7 @@ pkgconf_pkg_walk_conflicts_list(pkgconf_pkg_t *root, pkgconf_list_t *deplist, un if (*depnode->package == '\0' || strcmp(depnode->package, parentnode->package)) continue; - pkgdep = pkgconf_pkg_verify_dependency(parentnode, flags, &eflags); + pkgdep = pkgconf_pkg_verify_dependency(client, parentnode, flags, &eflags); if (eflags == PKGCONF_PKG_ERRF_OK) { pkgconf_error("Version '%s' of '%s' conflicts with '%s' due to satisfying conflict rule '%s %s%s%s'.\n", @@ -1174,7 +1174,8 @@ pkgconf_pkg_walk_conflicts_list(pkgconf_pkg_t *root, pkgconf_list_t *deplist, un * walk the dependency graph up to maxdepth levels. -1 means infinite recursion. */ unsigned int -pkgconf_pkg_traverse(pkgconf_pkg_t *root, +pkgconf_pkg_traverse(const pkgconf_client_t *client, + pkgconf_pkg_t *root, pkgconf_pkg_traverse_func_t func, void *data, int maxdepth, @@ -1189,23 +1190,23 @@ pkgconf_pkg_traverse(pkgconf_pkg_t *root, if ((root->flags & PKGCONF_PKG_PROPF_VIRTUAL) != PKGCONF_PKG_PROPF_VIRTUAL || (flags & PKGCONF_PKG_PKGF_SKIP_ROOT_VIRTUAL) != PKGCONF_PKG_PKGF_SKIP_ROOT_VIRTUAL) { if (func != NULL) - func(root, data, flags); + func(client, root, data, flags); } if (!(flags & PKGCONF_PKG_PKGF_SKIP_CONFLICTS)) { - eflags = pkgconf_pkg_walk_conflicts_list(root, &root->conflicts, rflags); + eflags = pkgconf_pkg_walk_conflicts_list(client, root, &root->conflicts, rflags); if (eflags != PKGCONF_PKG_ERRF_OK) return eflags; } - eflags = pkgconf_pkg_walk_list(root, &root->requires, func, data, maxdepth, rflags); + eflags = pkgconf_pkg_walk_list(client, root, &root->requires, func, data, maxdepth, rflags); if (eflags != PKGCONF_PKG_ERRF_OK) return eflags; if (flags & PKGCONF_PKG_PKGF_SEARCH_PRIVATE) { - eflags = pkgconf_pkg_walk_list(root, &root->requires_private, func, data, maxdepth, rflags | PKGCONF_PKG_PKGF_ITER_PKG_IS_PRIVATE); + eflags = pkgconf_pkg_walk_list(client, root, &root->requires_private, func, data, maxdepth, rflags | PKGCONF_PKG_PKGF_ITER_PKG_IS_PRIVATE); if (eflags != PKGCONF_PKG_ERRF_OK) return eflags; } @@ -1214,11 +1215,12 @@ pkgconf_pkg_traverse(pkgconf_pkg_t *root, } static void -pkgconf_pkg_cflags_collect(pkgconf_pkg_t *pkg, void *data, unsigned int flags) +pkgconf_pkg_cflags_collect(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data, unsigned int flags) { pkgconf_list_t *list = data; pkgconf_node_t *node; (void) flags; + (void) client; PKGCONF_FOREACH_LIST_ENTRY(pkg->cflags.head, node) { @@ -1228,11 +1230,12 @@ pkgconf_pkg_cflags_collect(pkgconf_pkg_t *pkg, void *data, unsigned int flags) } static void -pkgconf_pkg_cflags_private_collect(pkgconf_pkg_t *pkg, void *data, unsigned int flags) +pkgconf_pkg_cflags_private_collect(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data, unsigned int flags) { pkgconf_list_t *list = data; pkgconf_node_t *node; (void) flags; + (void) client; PKGCONF_FOREACH_LIST_ENTRY(pkg->cflags_private.head, node) { @@ -1243,17 +1246,17 @@ pkgconf_pkg_cflags_private_collect(pkgconf_pkg_t *pkg, void *data, unsigned int } int -pkgconf_pkg_cflags(pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth, unsigned int flags) +pkgconf_pkg_cflags(const pkgconf_client_t *client, pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth, unsigned int flags) { int eflag; - eflag = pkgconf_pkg_traverse(root, pkgconf_pkg_cflags_collect, list, maxdepth, flags); + eflag = pkgconf_pkg_traverse(client, root, pkgconf_pkg_cflags_collect, list, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) pkgconf_fragment_free(list); if (flags & PKGCONF_PKG_PKGF_MERGE_PRIVATE_FRAGMENTS) { - eflag = pkgconf_pkg_traverse(root, pkgconf_pkg_cflags_private_collect, list, maxdepth, flags); + eflag = pkgconf_pkg_traverse(client, root, pkgconf_pkg_cflags_private_collect, list, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) pkgconf_fragment_free(list); } @@ -1262,11 +1265,12 @@ pkgconf_pkg_cflags(pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth, unsi } static void -pkgconf_pkg_libs_collect(pkgconf_pkg_t *pkg, void *data, unsigned int flags) +pkgconf_pkg_libs_collect(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data, unsigned int flags) { pkgconf_list_t *list = data; pkgconf_node_t *node; (void) flags; + (void) client; PKGCONF_FOREACH_LIST_ENTRY(pkg->libs.head, node) { @@ -1285,11 +1289,11 @@ pkgconf_pkg_libs_collect(pkgconf_pkg_t *pkg, void *data, unsigned int flags) } int -pkgconf_pkg_libs(pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth, unsigned int flags) +pkgconf_pkg_libs(const pkgconf_client_t *client, pkgconf_pkg_t *root, pkgconf_list_t *list, int maxdepth, unsigned int flags) { int eflag; - eflag = pkgconf_pkg_traverse(root, pkgconf_pkg_libs_collect, list, maxdepth, flags); + eflag = pkgconf_pkg_traverse(client, root, pkgconf_pkg_libs_collect, list, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) { diff --git a/libpkgconf/queue.c b/libpkgconf/queue.c index 37fa634..c1dbfc3 100644 --- a/libpkgconf/queue.c +++ b/libpkgconf/queue.c @@ -30,7 +30,7 @@ pkgconf_queue_push(pkgconf_list_t *list, const char *package) } bool -pkgconf_queue_compile(pkgconf_pkg_t *world, pkgconf_list_t *list) +pkgconf_queue_compile(const pkgconf_client_t *client, pkgconf_pkg_t *world, pkgconf_list_t *list) { pkgconf_node_t *iter; @@ -39,7 +39,7 @@ pkgconf_queue_compile(pkgconf_pkg_t *world, pkgconf_list_t *list) pkgconf_queue_t *pkgq; pkgq = iter->data; - pkgconf_dependency_parse(world, &world->requires, pkgq->package); + pkgconf_dependency_parse(client, world, &world->requires, pkgq->package); } return (world->requires.head != NULL); @@ -60,16 +60,16 @@ pkgconf_queue_free(pkgconf_list_t *list) } static inline unsigned int -pkgconf_queue_verify(pkgconf_pkg_t *world, pkgconf_list_t *list, int maxdepth, unsigned int flags) +pkgconf_queue_verify(const pkgconf_client_t *client, pkgconf_pkg_t *world, pkgconf_list_t *list, int maxdepth, unsigned int flags) { - if (!pkgconf_queue_compile(world, list)) + if (!pkgconf_queue_compile(client, world, list)) return PKGCONF_PKG_ERRF_DEPGRAPH_BREAK; - return pkgconf_pkg_verify_graph(world, maxdepth, flags); + return pkgconf_pkg_verify_graph(client, world, maxdepth, flags); } bool -pkgconf_queue_apply(pkgconf_list_t *list, pkgconf_queue_apply_func_t func, int maxdepth, unsigned int flags, void *data) +pkgconf_queue_apply(const pkgconf_client_t *client, pkgconf_list_t *list, pkgconf_queue_apply_func_t func, int maxdepth, unsigned int flags, void *data) { pkgconf_pkg_t world = { .id = "virtual:world", @@ -81,10 +81,10 @@ pkgconf_queue_apply(pkgconf_list_t *list, pkgconf_queue_apply_func_t func, int m if (!maxdepth) maxdepth = -1; - if (pkgconf_queue_verify(&world, list, maxdepth, flags) != PKGCONF_PKG_ERRF_OK) + if (pkgconf_queue_verify(client, &world, list, maxdepth, flags) != PKGCONF_PKG_ERRF_OK) return false; - if (!func(&world, data, maxdepth, flags)) + if (!func(client, &world, data, maxdepth, flags)) { pkgconf_pkg_free(&world); return false; @@ -96,7 +96,7 @@ pkgconf_queue_apply(pkgconf_list_t *list, pkgconf_queue_apply_func_t func, int m } bool -pkgconf_queue_validate(pkgconf_list_t *list, int maxdepth, unsigned int flags) +pkgconf_queue_validate(const pkgconf_client_t *client, pkgconf_list_t *list, int maxdepth, unsigned int flags) { bool retval = true; pkgconf_pkg_t world = { @@ -109,7 +109,7 @@ pkgconf_queue_validate(pkgconf_list_t *list, int maxdepth, unsigned int flags) if (!maxdepth) maxdepth = -1; - if (pkgconf_queue_verify(&world, list, maxdepth, flags) != PKGCONF_PKG_ERRF_OK) + if (pkgconf_queue_verify(client, &world, list, maxdepth, flags) != PKGCONF_PKG_ERRF_OK) retval = false; pkgconf_pkg_free(&world); diff --git a/libpkgconf/tuple.c b/libpkgconf/tuple.c index 7900eac..8698f6b 100644 --- a/libpkgconf/tuple.c +++ b/libpkgconf/tuple.c @@ -15,20 +15,18 @@ #include -static pkgconf_list_t pkg_global_var = PKGCONF_LIST_INITIALIZER; - void -pkgconf_tuple_add_global(const char *key, const char *value) +pkgconf_tuple_add_global(pkgconf_client_t *client, const char *key, const char *value) { - pkgconf_tuple_add(&pkg_global_var, key, value, false); + pkgconf_tuple_add(client, &client->global_vars, key, value, false); } char * -pkgconf_tuple_find_global(const char *key) +pkgconf_tuple_find_global(const pkgconf_client_t *client, const char *key) { pkgconf_node_t *node; - PKGCONF_FOREACH_LIST_ENTRY(pkg_global_var.head, node) + PKGCONF_FOREACH_LIST_ENTRY(client->global_vars.head, node) { pkgconf_tuple_t *tuple = node->data; @@ -40,13 +38,13 @@ pkgconf_tuple_find_global(const char *key) } void -pkgconf_tuple_free_global(void) +pkgconf_tuple_free_global(pkgconf_client_t *client) { - pkgconf_tuple_free(&pkg_global_var); + pkgconf_tuple_free(&client->global_vars); } void -pkgconf_tuple_define_global(const char *kv) +pkgconf_tuple_define_global(pkgconf_client_t *client, const char *kv) { char *workbuf = strdup(kv); char *value; @@ -56,19 +54,19 @@ pkgconf_tuple_define_global(const char *kv) goto out; *value++ = '\0'; - pkgconf_tuple_add_global(workbuf, value); + pkgconf_tuple_add_global(client, workbuf, value); out: free(workbuf); } pkgconf_tuple_t * -pkgconf_tuple_add(pkgconf_list_t *list, const char *key, const char *value, bool parse) +pkgconf_tuple_add(const pkgconf_client_t *client, pkgconf_list_t *list, const char *key, const char *value, bool parse) { pkgconf_tuple_t *tuple = calloc(sizeof(pkgconf_tuple_t), 1); tuple->key = strdup(key); if (parse) - tuple->value = pkgconf_tuple_parse(list, value); + tuple->value = pkgconf_tuple_parse(client, list, value); else tuple->value = strdup(value); @@ -78,12 +76,12 @@ pkgconf_tuple_add(pkgconf_list_t *list, const char *key, const char *value, bool } char * -pkgconf_tuple_find(pkgconf_list_t *list, const char *key) +pkgconf_tuple_find(const pkgconf_client_t *client, pkgconf_list_t *list, const char *key) { pkgconf_node_t *node; char *res; - if ((res = pkgconf_tuple_find_global(key)) != NULL) + if ((res = pkgconf_tuple_find_global(client, key)) != NULL) return res; PKGCONF_FOREACH_LIST_ENTRY(list->head, node) @@ -98,7 +96,7 @@ pkgconf_tuple_find(pkgconf_list_t *list, const char *key) } char * -pkgconf_tuple_parse(pkgconf_list_t *vars, const char *value) +pkgconf_tuple_parse(const pkgconf_client_t *client, pkgconf_list_t *vars, const char *value) { char buf[PKGCONF_BUFSIZE]; const char *ptr; @@ -129,7 +127,7 @@ pkgconf_tuple_parse(pkgconf_list_t *vars, const char *value) } ptr += (pptr - ptr); - kv = pkgconf_tuple_find_global(varname); + kv = pkgconf_tuple_find_global(client, varname); if (kv != NULL) { strncpy(bptr, kv, PKGCONF_BUFSIZE - (bptr - buf)); @@ -137,11 +135,11 @@ pkgconf_tuple_parse(pkgconf_list_t *vars, const char *value) } else { - kv = pkgconf_tuple_find(vars, varname); + kv = pkgconf_tuple_find(client, vars, varname); if (kv != NULL) { - parsekv = pkgconf_tuple_parse(vars, kv); + parsekv = pkgconf_tuple_parse(client, vars, kv); strncpy(bptr, parsekv, PKGCONF_BUFSIZE - (bptr - buf)); bptr += strlen(parsekv); diff --git a/main.c b/main.c index 4e017e3..38901c1 100644 --- a/main.c +++ b/main.c @@ -52,6 +52,8 @@ static unsigned int global_traverse_flags = PKGCONF_PKG_PKGF_NONE; +static pkgconf_client_t pkg_client; + static pkgconf_list_t filter_libdirs = PKGCONF_LIST_INITIALIZER; static pkgconf_list_t filter_includedirs = PKGCONF_LIST_INITIALIZER; @@ -182,8 +184,9 @@ print_libs(pkgconf_list_t *list) } static void -print_modversion(pkgconf_pkg_t *pkg, void *unused, unsigned int flags) +print_modversion(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *unused, unsigned int flags) { + (void) client; (void) unused; (void) flags; @@ -192,9 +195,10 @@ print_modversion(pkgconf_pkg_t *pkg, void *unused, unsigned int flags) } static void -print_variables(pkgconf_pkg_t *pkg, void *unused, unsigned int flags) +print_variables(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *unused, unsigned int flags) { pkgconf_node_t *node; + (void) client; (void) unused; (void) flags; @@ -261,7 +265,7 @@ print_provides(pkgconf_pkg_t *pkg) } static bool -apply_provides(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) +apply_provides(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) { pkgconf_node_t *iter; (void) unused; @@ -272,7 +276,7 @@ apply_provides(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int fl pkgconf_pkg_t *pkg; pkgconf_dependency_t *dep = iter->data; - pkg = pkgconf_pkg_verify_dependency(dep, flags, NULL); + pkg = pkgconf_pkg_verify_dependency(client, dep, flags, NULL); print_provides(pkg); pkgconf_pkg_free(pkg); @@ -282,9 +286,10 @@ apply_provides(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int fl } static void -print_digraph_node(pkgconf_pkg_t *pkg, void *unused, unsigned int flags) +print_digraph_node(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *unused, unsigned int flags) { pkgconf_node_t *node; + (void) client; (void) unused; (void) flags; @@ -299,7 +304,7 @@ print_digraph_node(pkgconf_pkg_t *pkg, void *unused, unsigned int flags) } static bool -apply_digraph(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) +apply_digraph(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) { int eflag; @@ -307,7 +312,7 @@ apply_digraph(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int fla printf("edge [color=blue len=7.5 fontname=Sans fontsize=8]\n"); printf("node [fontname=Sans fontsize=8]\n"); - eflag = pkgconf_pkg_traverse(world, print_digraph_node, unused, maxdepth, flags); + eflag = pkgconf_pkg_traverse(client, world, print_digraph_node, unused, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) return false; @@ -317,11 +322,11 @@ apply_digraph(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int fla } static bool -apply_modversion(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) +apply_modversion(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) { int eflag; - eflag = pkgconf_pkg_traverse(world, print_modversion, unused, maxdepth, flags); + eflag = pkgconf_pkg_traverse(client, world, print_modversion, unused, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) return false; @@ -330,11 +335,11 @@ apply_modversion(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int } static bool -apply_variables(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) +apply_variables(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) { int eflag; - eflag = pkgconf_pkg_traverse(world, print_variables, unused, maxdepth, flags); + eflag = pkgconf_pkg_traverse(client, world, print_variables, unused, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) return false; @@ -348,13 +353,13 @@ typedef struct { } var_request_t; static void -print_variable(pkgconf_pkg_t *pkg, void *data, unsigned int flags) +print_variable(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data, unsigned int flags) { var_request_t *req = data; const char *var; (void) flags; - var = pkgconf_tuple_find(&pkg->vars, req->variable); + var = pkgconf_tuple_find(client, &pkg->vars, req->variable); if (var != NULL) { if (*(req->buf) == '\0') @@ -380,7 +385,7 @@ print_variable(pkgconf_pkg_t *pkg, void *data, unsigned int flags) } static bool -apply_variable(pkgconf_pkg_t *world, void *variable, int maxdepth, unsigned int flags) +apply_variable(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *variable, int maxdepth, unsigned int flags) { int eflag; @@ -390,7 +395,7 @@ apply_variable(pkgconf_pkg_t *world, void *variable, int maxdepth, unsigned int *req.buf = '\0'; - eflag = pkgconf_pkg_traverse(world, print_variable, &req, maxdepth, flags); + eflag = pkgconf_pkg_traverse(client, world, print_variable, &req, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) return false; @@ -399,12 +404,12 @@ apply_variable(pkgconf_pkg_t *world, void *variable, int maxdepth, unsigned int } static bool -apply_cflags(pkgconf_pkg_t *world, void *list_head, int maxdepth, unsigned int flags) +apply_cflags(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *list_head, int maxdepth, unsigned int flags) { pkgconf_list_t *list = list_head; int eflag; - eflag = pkgconf_pkg_cflags(world, list, maxdepth, flags | PKGCONF_PKG_PKGF_SEARCH_PRIVATE); + eflag = pkgconf_pkg_cflags(client, world, list, maxdepth, flags | PKGCONF_PKG_PKGF_SEARCH_PRIVATE); if (eflag != PKGCONF_PKG_ERRF_OK) return false; @@ -419,12 +424,12 @@ apply_cflags(pkgconf_pkg_t *world, void *list_head, int maxdepth, unsigned int f } static bool -apply_libs(pkgconf_pkg_t *world, void *list_head, int maxdepth, unsigned int flags) +apply_libs(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *list_head, int maxdepth, unsigned int flags) { pkgconf_list_t *list = list_head; int eflag; - eflag = pkgconf_pkg_libs(world, list, maxdepth, flags); + eflag = pkgconf_pkg_libs(client, world, list, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) return false; @@ -439,7 +444,7 @@ apply_libs(pkgconf_pkg_t *world, void *list_head, int maxdepth, unsigned int fla } static bool -apply_requires(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) +apply_requires(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) { pkgconf_node_t *iter; (void) unused; @@ -450,7 +455,7 @@ apply_requires(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int fl pkgconf_pkg_t *pkg; pkgconf_dependency_t *dep = iter->data; - pkg = pkgconf_pkg_verify_dependency(dep, flags, NULL); + pkg = pkgconf_pkg_verify_dependency(client, dep, flags, NULL); print_requires(pkg); pkgconf_pkg_free(pkg); @@ -460,7 +465,7 @@ apply_requires(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int fl } static bool -apply_requires_private(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) +apply_requires_private(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *unused, int maxdepth, unsigned int flags) { pkgconf_node_t *iter; (void) unused; @@ -471,7 +476,7 @@ apply_requires_private(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigne pkgconf_pkg_t *pkg; pkgconf_dependency_t *dep = iter->data; - pkg = pkgconf_pkg_verify_dependency(dep, flags | PKGCONF_PKG_PKGF_SEARCH_PRIVATE, NULL); + pkg = pkgconf_pkg_verify_dependency(client, dep, flags | PKGCONF_PKG_PKGF_SEARCH_PRIVATE, NULL); print_requires_private(pkg); pkgconf_pkg_free(pkg); @@ -480,9 +485,10 @@ apply_requires_private(pkgconf_pkg_t *world, void *unused, int maxdepth, unsigne } static void -check_uninstalled(pkgconf_pkg_t *pkg, void *data, unsigned int flags) +check_uninstalled(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data, unsigned int flags) { int *retval = data; + (void) client; (void) flags; if (pkg->flags & PKGCONF_PKG_PROPF_UNINSTALLED) @@ -490,11 +496,11 @@ check_uninstalled(pkgconf_pkg_t *pkg, void *data, unsigned int flags) } static bool -apply_uninstalled(pkgconf_pkg_t *world, void *data, int maxdepth, unsigned int flags) +apply_uninstalled(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth, unsigned int flags) { int eflag; - eflag = pkgconf_pkg_traverse(world, check_uninstalled, data, maxdepth, flags); + eflag = pkgconf_pkg_traverse(client, world, check_uninstalled, data, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) return false; @@ -503,10 +509,11 @@ apply_uninstalled(pkgconf_pkg_t *world, void *data, int maxdepth, unsigned int f } static void -print_graph_node(pkgconf_pkg_t *pkg, void *data, unsigned int flags) +print_graph_node(const pkgconf_client_t *client, pkgconf_pkg_t *pkg, void *data, unsigned int flags) { pkgconf_node_t *n; + (void) client; (void) data; (void) flags; @@ -534,11 +541,11 @@ print_graph_node(pkgconf_pkg_t *pkg, void *data, unsigned int flags) } static bool -apply_simulate(pkgconf_pkg_t *world, void *data, int maxdepth, unsigned int flags) +apply_simulate(const pkgconf_client_t *client, pkgconf_pkg_t *world, void *data, int maxdepth, unsigned int flags) { int eflag; - eflag = pkgconf_pkg_traverse(world, print_graph_node, data, maxdepth, flags); + eflag = pkgconf_pkg_traverse(client, world, print_graph_node, data, maxdepth, flags); if (eflag != PKGCONF_PKG_ERRF_OK) return false; @@ -690,6 +697,7 @@ main(int argc, char *argv[]) { NULL, 0, NULL, 0 } }; + pkgconf_client_init(&pkg_client, error_handler); pkgconf_path_build_from_environ("PKG_CONFIG_SYSTEM_LIBRARY_PATH", SYSTEM_LIBDIR, &filter_libdirs); pkgconf_path_build_from_environ("PKG_CONFIG_SYSTEM_INCLUDE_PATH", SYSTEM_INCLUDEDIR, &filter_includedirs); @@ -710,7 +718,7 @@ main(int argc, char *argv[]) maximum_traverse_depth = atoi(pkg_optarg); break; case 27: - pkgconf_tuple_define_global(pkg_optarg); + pkgconf_tuple_define_global(&pkg_client, pkg_optarg); break; case 28: required_exact_module_version = pkg_optarg; @@ -766,8 +774,6 @@ main(int argc, char *argv[]) return EXIT_SUCCESS; } - pkgconf_set_error_handler(error_handler); - error_msgout = stderr; if ((want_flags & PKG_ERRORS_ON_STDOUT) == PKG_ERRORS_ON_STDOUT) error_msgout = stdout; @@ -806,17 +812,17 @@ main(int argc, char *argv[]) want_flags |= PKG_KEEP_SYSTEM_LIBS; if ((builddir = getenv("PKG_CONFIG_TOP_BUILD_DIR")) != NULL) - pkgconf_tuple_add_global("pc_top_builddir", builddir); + pkgconf_tuple_add_global(&pkg_client, "pc_top_builddir", builddir); else - pkgconf_tuple_add_global("pc_top_builddir", "$(top_builddir)"); + pkgconf_tuple_add_global(&pkg_client, "pc_top_builddir", "$(top_builddir)"); if ((sysroot_dir = getenv("PKG_CONFIG_SYSROOT_DIR")) != NULL) { - pkgconf_tuple_add_global("pc_sysrootdir", sysroot_dir); + pkgconf_tuple_add_global(&pkg_client, "pc_sysrootdir", sysroot_dir); global_traverse_flags |= PKGCONF_PKG_PKGF_MUNGE_SYSROOT_PREFIX; } else - pkgconf_tuple_add_global("pc_sysrootdir", "/"); + pkgconf_tuple_add_global(&pkg_client, "pc_sysrootdir", "/"); if (required_pkgconfig_version != NULL) { @@ -828,13 +834,13 @@ main(int argc, char *argv[]) if ((want_flags & PKG_LIST) == PKG_LIST) { - pkgconf_scan_all(NULL, print_list_entry); + pkgconf_scan_all(&pkg_client, NULL, print_list_entry); return EXIT_SUCCESS; } if ((want_flags & PKG_LIST_PACKAGE_NAMES) == PKG_LIST_PACKAGE_NAMES) { - pkgconf_scan_all(NULL, print_package_entry); + pkgconf_scan_all(&pkg_client, NULL, print_package_entry); return EXIT_SUCCESS; } @@ -863,7 +869,7 @@ main(int argc, char *argv[]) { pkgconf_dependency_t *pkgiter = node->data; - pkg = pkgconf_pkg_find(pkgiter->package, global_traverse_flags); + pkg = pkgconf_pkg_find(&pkg_client, pkgiter->package, global_traverse_flags); if (pkg == NULL) return EXIT_FAILURE; @@ -890,7 +896,7 @@ main(int argc, char *argv[]) { pkgconf_dependency_t *pkgiter = node->data; - pkg = pkgconf_pkg_find(pkgiter->package, global_traverse_flags); + pkg = pkgconf_pkg_find(&pkg_client, pkgiter->package, global_traverse_flags); if (pkg == NULL) return EXIT_FAILURE; @@ -917,7 +923,7 @@ main(int argc, char *argv[]) { pkgconf_dependency_t *pkgiter = node->data; - pkg = pkgconf_pkg_find(pkgiter->package, global_traverse_flags); + pkg = pkgconf_pkg_find(&pkg_client, pkgiter->package, global_traverse_flags); if (pkg == NULL) return EXIT_FAILURE; @@ -972,14 +978,14 @@ main(int argc, char *argv[]) { want_flags &= ~(PKG_CFLAGS|PKG_LIBS); - if (!pkgconf_queue_apply(&pkgq, apply_simulate, -1, global_traverse_flags | PKGCONF_PKG_PKGF_SKIP_ERRORS, NULL)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_simulate, -1, global_traverse_flags | PKGCONF_PKG_PKGF_SKIP_ERRORS, NULL)) { ret = EXIT_FAILURE; goto out; } } - if (!pkgconf_queue_validate(&pkgq, maximum_traverse_depth, global_traverse_flags)) + if (!pkgconf_queue_validate(&pkg_client, &pkgq, maximum_traverse_depth, global_traverse_flags)) { ret = EXIT_FAILURE; goto out; @@ -991,7 +997,7 @@ main(int argc, char *argv[]) if ((want_flags & PKG_UNINSTALLED) == PKG_UNINSTALLED) { ret = EXIT_FAILURE; - pkgconf_queue_apply(&pkgq, apply_uninstalled, maximum_traverse_depth, global_traverse_flags, &ret); + pkgconf_queue_apply(&pkg_client, &pkgq, apply_uninstalled, maximum_traverse_depth, global_traverse_flags, &ret); goto out; } @@ -999,7 +1005,7 @@ main(int argc, char *argv[]) { want_flags &= ~(PKG_CFLAGS|PKG_LIBS); - if (!pkgconf_queue_apply(&pkgq, apply_provides, maximum_traverse_depth, global_traverse_flags, NULL)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_provides, maximum_traverse_depth, global_traverse_flags, NULL)) { ret = EXIT_FAILURE; goto out; @@ -1010,7 +1016,7 @@ main(int argc, char *argv[]) { want_flags &= ~(PKG_CFLAGS|PKG_LIBS); - if (!pkgconf_queue_apply(&pkgq, apply_digraph, maximum_traverse_depth, global_traverse_flags, NULL)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_digraph, maximum_traverse_depth, global_traverse_flags, NULL)) { ret = EXIT_FAILURE; goto out; @@ -1021,7 +1027,7 @@ main(int argc, char *argv[]) { want_flags &= ~(PKG_CFLAGS|PKG_LIBS); - if (!pkgconf_queue_apply(&pkgq, apply_modversion, 2, global_traverse_flags, NULL)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_modversion, 2, global_traverse_flags, NULL)) { ret = EXIT_FAILURE; goto out; @@ -1032,7 +1038,7 @@ main(int argc, char *argv[]) { want_flags &= ~(PKG_CFLAGS|PKG_LIBS); - if (!pkgconf_queue_apply(&pkgq, apply_variables, 2, global_traverse_flags, NULL)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_variables, 2, global_traverse_flags, NULL)) { ret = EXIT_FAILURE; goto out; @@ -1043,7 +1049,7 @@ main(int argc, char *argv[]) { want_flags &= ~(PKG_CFLAGS|PKG_LIBS); - if (!pkgconf_queue_apply(&pkgq, apply_variable, 2, global_traverse_flags | PKGCONF_PKG_PKGF_SKIP_ROOT_VIRTUAL, want_variable)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_variable, 2, global_traverse_flags | PKGCONF_PKG_PKGF_SKIP_ROOT_VIRTUAL, want_variable)) { ret = EXIT_FAILURE; goto out; @@ -1054,7 +1060,7 @@ main(int argc, char *argv[]) { want_flags &= ~(PKG_CFLAGS|PKG_LIBS); - if (!pkgconf_queue_apply(&pkgq, apply_requires, maximum_traverse_depth, global_traverse_flags, NULL)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_requires, maximum_traverse_depth, global_traverse_flags, NULL)) { ret = EXIT_FAILURE; goto out; @@ -1065,7 +1071,7 @@ main(int argc, char *argv[]) { want_flags &= ~(PKG_CFLAGS|PKG_LIBS); - if (!pkgconf_queue_apply(&pkgq, apply_requires_private, maximum_traverse_depth, global_traverse_flags, NULL)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_requires_private, maximum_traverse_depth, global_traverse_flags, NULL)) { ret = EXIT_FAILURE; goto out; @@ -1076,7 +1082,7 @@ main(int argc, char *argv[]) { pkgconf_list_t frag_list = PKGCONF_LIST_INITIALIZER; - if (!pkgconf_queue_apply(&pkgq, apply_cflags, maximum_traverse_depth, global_traverse_flags, &frag_list)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_cflags, maximum_traverse_depth, global_traverse_flags, &frag_list)) { ret = EXIT_FAILURE; goto out_println; @@ -1087,7 +1093,7 @@ main(int argc, char *argv[]) { pkgconf_list_t frag_list = PKGCONF_LIST_INITIALIZER; - if (!pkgconf_queue_apply(&pkgq, apply_libs, maximum_traverse_depth, global_traverse_flags, &frag_list)) + if (!pkgconf_queue_apply(&pkg_client, &pkgq, apply_libs, maximum_traverse_depth, global_traverse_flags, &frag_list)) { ret = EXIT_FAILURE; goto out_println; @@ -1101,7 +1107,7 @@ out_println: printf(" \n"); out: - pkgconf_tuple_free_global(); + pkgconf_client_deinit(&pkg_client); pkgconf_cache_free(); if (logfile_out != NULL)