lifecycle: return the maximum tree depth for the dependency tree when counting depth

This commit is contained in:
Ariadne Conill 2020-09-09 18:11:10 -06:00
parent 8c8727e30f
commit 258e2e8a52
4 changed files with 18 additions and 6 deletions

View file

@ -290,7 +290,7 @@ ifquery_main(int argc, char *argv[])
return EXIT_FAILURE;
}
if (!lif_lifecycle_count_rdepends(&exec_opts, &collection))
if (lif_lifecycle_count_rdepends(&exec_opts, &collection) == -1)
{
fprintf(stderr, "%s: could not validate dependency tree\n", argv0);
return EXIT_FAILURE;

View file

@ -229,7 +229,7 @@ ifupdown_main(int argc, char *argv[])
return EXIT_FAILURE;
}
if (!lif_lifecycle_count_rdepends(&exec_opts, &collection))
if (lif_lifecycle_count_rdepends(&exec_opts, &collection) == -1)
{
fprintf(stderr, "%s: could not validate dependency tree\n", argv0);
return EXIT_FAILURE;

View file

@ -419,7 +419,7 @@ count_interface_rdepends(const struct lif_execute_opts *opts, struct lif_dict *c
return true;
}
bool
ssize_t
lif_lifecycle_count_rdepends(const struct lif_execute_opts *opts, struct lif_dict *collection)
{
struct lif_node *iter;
@ -435,9 +435,21 @@ lif_lifecycle_count_rdepends(const struct lif_execute_opts *opts, struct lif_dic
if (!count_interface_rdepends(opts, collection, iface, iface->rdepends_count))
{
fprintf(stderr, "ifupdown: dependency graph is broken for interface %s\n", iface->ifname);
return false;
return -1;
}
}
return true;
/* figure out the max depth */
size_t maxdepth = 0;
LIF_DICT_FOREACH(iter, collection)
{
struct lif_dict_entry *entry = iter->data;
struct lif_interface *iface = entry->data;
if (iface->rdepends_count > maxdepth)
maxdepth = iface->rdepends_count;
}
return maxdepth;
}

View file

@ -22,7 +22,7 @@
extern bool lif_lifecycle_query_dependents(const struct lif_execute_opts *opts, struct lif_interface *iface, const char *lifname);
extern bool lif_lifecycle_run_phase(const struct lif_execute_opts *opts, struct lif_interface *iface, const char *phase, const char *lifname, bool up);
extern bool lif_lifecycle_run(const struct lif_execute_opts *opts, struct lif_interface *iface, struct lif_dict *collection, struct lif_dict *state, const char *lifname, bool up);
extern bool lif_lifecycle_count_rdepends(const struct lif_execute_opts *opts, struct lif_dict *collection);
extern ssize_t lif_lifecycle_count_rdepends(const struct lif_execute_opts *opts, struct lif_dict *collection);
#endif