diff --git a/main.c b/main.c index ae5da56..dcde276 100644 --- a/main.c +++ b/main.c @@ -213,28 +213,48 @@ print_digraph_node(pkg_t *pkg, void *unused, unsigned int flags) } } -static void +static bool apply_digraph(pkg_t *world, void *unused, int maxdepth, unsigned int flags) { + int eflag; + printf("graph deptree {\n"); printf("edge [color=blue len=7.5 fontname=Sans fontsize=8]\n"); printf("node [fontname=Sans fontsize=8]\n"); - pkg_traverse(world, print_digraph_node, unused, maxdepth, flags); + eflag = pkg_traverse(world, print_digraph_node, unused, maxdepth, flags); + + if (eflag != PKG_ERRF_OK) + return false; printf("}\n"); + return true; } -static void +static bool apply_modversion(pkg_t *world, void *unused, int maxdepth, unsigned int flags) { - pkg_traverse(world, print_modversion, unused, maxdepth, flags); + int eflag; + + eflag = pkg_traverse(world, print_modversion, unused, maxdepth, flags); + + if (eflag != PKG_ERRF_OK) + return false; + + return true; } -static void +static bool apply_variables(pkg_t *world, void *unused, int maxdepth, unsigned int flags) { - pkg_traverse(world, print_variables, unused, maxdepth, flags); + int eflag; + + eflag = pkg_traverse(world, print_variables, unused, maxdepth, flags); + + if (eflag != PKG_ERRF_OK) + return false; + + return true; } typedef struct { @@ -263,44 +283,57 @@ print_variable(pkg_t *pkg, void *data, unsigned int flags) } } -static void +static bool apply_variable(pkg_t *world, void *variable, int maxdepth, unsigned int flags) { + int eflag; + var_request_t req = { .variable = variable, }; *req.buf = '\0'; - pkg_traverse(world, print_variable, &req, maxdepth, flags); + eflag = pkg_traverse(world, print_variable, &req, maxdepth, flags); + if (eflag != PKG_ERRF_OK) + return false; + printf("%s\n", req.buf); + return true; } -static void +static bool apply_cflags(pkg_t *world, void *list_head, int maxdepth, unsigned int flags) { pkg_fragment_t **head = list_head; pkg_fragment_t *list; list = pkg_cflags(world, head, maxdepth, flags | PKGF_SEARCH_PRIVATE); + if (list == NULL) + return false; + print_cflags(list); pkg_fragment_free(list); + return true; } -static void +static bool apply_libs(pkg_t *world, void *list_head, int maxdepth, unsigned int flags) { pkg_fragment_t **head = list_head; pkg_fragment_t *list; list = pkg_libs(world, head, maxdepth, flags); + if (list == NULL) + return false; print_libs(list); pkg_fragment_free(list); + return true; } -static void +static bool apply_requires(pkg_t *world, void *unused, int maxdepth, unsigned int flags) { pkg_dependency_t *iter; @@ -316,9 +349,10 @@ apply_requires(pkg_t *world, void *unused, int maxdepth, unsigned int flags) pkg_free(pkg); } + return true; } -static void +static bool apply_requires_private(pkg_t *world, void *unused, int maxdepth, unsigned int flags) { pkg_dependency_t *iter; @@ -334,6 +368,7 @@ apply_requires_private(pkg_t *world, void *unused, int maxdepth, unsigned int fl pkg_free(pkg); } + return true; } static void @@ -346,10 +381,17 @@ check_uninstalled(pkg_t *pkg, void *data, unsigned int flags) *retval = EXIT_SUCCESS; } -static void +static bool apply_uninstalled(pkg_t *world, void *data, int maxdepth, unsigned int flags) { - pkg_traverse(world, check_uninstalled, data, maxdepth, flags); + int eflag; + + eflag = pkg_traverse(world, check_uninstalled, data, maxdepth, flags); + + if (eflag != PKG_ERRF_OK) + return false; + + return true; } static void @@ -361,10 +403,17 @@ print_graph_node(pkg_t *pkg, void *data, unsigned int flags) printf("Considering graph node '%s' (%p)\n", pkg->id, pkg); } -static void +static bool apply_simulate(pkg_t *world, void *data, int maxdepth, unsigned int flags) { - pkg_traverse(world, print_graph_node, data, maxdepth, flags); + int eflag; + + eflag = pkg_traverse(world, print_graph_node, data, maxdepth, flags); + + if (eflag != PKG_ERRF_OK) + return false; + + return true; } static void diff --git a/pkg.c b/pkg.c index 6d3f270..4d0dc68 100644 --- a/pkg.c +++ b/pkg.c @@ -850,7 +850,15 @@ pkg_cflags_collect(pkg_t *pkg, void *data, unsigned int flags) pkg_fragment_t * pkg_cflags(pkg_t *root, pkg_fragment_t **list, int maxdepth, unsigned int flags) { - pkg_traverse(root, pkg_cflags_collect, list, maxdepth, flags); + int eflag; + + eflag = pkg_traverse(root, pkg_cflags_collect, list, maxdepth, flags); + + if (eflag != PKG_ERRF_OK) + { + pkg_fragment_free(*list); + return NULL; + } return *list; } @@ -880,10 +888,25 @@ pkg_libs_private_collect(pkg_t *pkg, void *data, unsigned int flags) pkg_fragment_t * pkg_libs(pkg_t *root, pkg_fragment_t **list, int maxdepth, unsigned int flags) { - pkg_traverse(root, pkg_libs_collect, list, maxdepth, flags); + int eflag; + + eflag = pkg_traverse(root, pkg_libs_collect, list, maxdepth, flags); + + if (eflag != PKG_ERRF_OK) + { + pkg_fragment_free(*list); + return NULL; + } if (flags & PKGF_MERGE_PRIVATE_FRAGMENTS) - pkg_traverse(root, pkg_libs_private_collect, list, maxdepth, flags); + { + eflag = pkg_traverse(root, pkg_libs_private_collect, list, maxdepth, flags); + if (eflag != PKG_ERRF_OK) + { + pkg_fragment_free(*list); + return NULL; + } + } return *list; } diff --git a/pkg.h b/pkg.h index d548e71..3ddb2d1 100644 --- a/pkg.h +++ b/pkg.h @@ -122,7 +122,7 @@ struct pkg_ { typedef void (*pkg_iteration_func_t)(const pkg_t *pkg); typedef void (*pkg_traverse_func_t)(pkg_t *pkg, void *data, unsigned int flags); -typedef void (*pkg_queue_apply_func_t)(pkg_t *world, void *data, int maxdepth, unsigned int flags); +typedef bool (*pkg_queue_apply_func_t)(pkg_t *world, void *data, int maxdepth, unsigned int flags); /* pkg.c */ void pkg_free(pkg_t *pkg); diff --git a/queue.c b/queue.c index abec853..187e61a 100644 --- a/queue.c +++ b/queue.c @@ -85,7 +85,11 @@ pkg_queue_apply(pkg_queue_t *head, pkg_queue_apply_func_t func, int maxdepth, un if (pkg_queue_verify(&world, head, maxdepth, flags) != PKG_ERRF_OK) return false; - func(&world, data, maxdepth, flags); + if (!func(&world, data, maxdepth, flags)) + { + pkg_free(&world); + return false; + } pkg_free(&world); diff --git a/tests/lib1/missing-require.pc b/tests/lib1/missing-require.pc new file mode 100644 index 0000000..d9a5ffb --- /dev/null +++ b/tests/lib1/missing-require.pc @@ -0,0 +1,11 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: missing-require +Description: A testing pkg-config file +Version: 1.2.3 +Requires.private: missing +Libs: -L${libdir} -lfoo +Cflags: -fPIC -I${includedir}/foo diff --git a/tests/run.sh.in b/tests/run.sh.in index eb07410..231af22 100644 --- a/tests/run.sh.in +++ b/tests/run.sh.in @@ -163,6 +163,10 @@ run_test "PKG_CONFIG_PATH=${selfdir}/lib1 ${1} --max-version 1.0 'foo '; echo \$ run_test "PKG_CONFIG_PATH=${selfdir}/lib1 ${1} --max-version 2.0 'foo '; echo \$?" \ '0' +# test missing requires +run_test "PKG_CONFIG_PATH=${selfdir}/lib1 ${1} --cflags missing-require; echo \$?" \ + '1' + # 10) tests for internal getopt implementation with options at the end if [ "x@STRICT_MODE@" = "xno" ]; then run_test "PKG_CONFIG_PATH=${selfdir}/lib1 ${1} foo --libs" \