Skip to content

Commit

Permalink
Merge pull request #563 from mtomaschewski/node-path
Browse files Browse the repository at this point in the history
  • Loading branch information
mtomaschewski committed Jul 7, 2015
2 parents 4f1affe + 16fc608 commit bfee1a8
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 2 deletions.
2 changes: 2 additions & 0 deletions include/wicked/xml.h
Expand Up @@ -136,12 +136,14 @@ extern ni_bool_t xml_node_replace_child(xml_node_t *, xml_node_t *);
extern ni_bool_t xml_node_delete_child(xml_node_t *, const char *);
extern ni_bool_t xml_node_delete_child_node(xml_node_t *, xml_node_t *);
extern void xml_node_detach(xml_node_t *);
extern xml_node_t * xml_node_find_parent(const xml_node_t *, const char *);
extern void xml_node_reparent(xml_node_t *parent, xml_node_t *child);
extern void xml_node_add_child(xml_node_t *, xml_node_t *);
extern xml_node_t * xml_node_get_next_named(xml_node_t *, const char *, xml_node_t *);

extern ni_bool_t xml_node_match_attrs(const xml_node_t *, const ni_var_array_t *);

extern const char * xml_node_get_path(ni_stringbuf_t *, const xml_node_t *, const xml_node_t *);
inline const char * xml_node_get_location_filename(const xml_node_t *);
inline unsigned int xml_node_get_location_line(const xml_node_t *);
extern const char * xml_node_location(const xml_node_t *);
Expand Down
18 changes: 16 additions & 2 deletions src/fsm.c
Expand Up @@ -3133,6 +3133,7 @@ ni_ifworker_netif_resolve_cb(xml_node_t *node, const ni_xs_type_t *type, const x
xml_node_t *mchild;

for (mchild = metadata->children; mchild; mchild = mchild->next) {
ni_stringbuf_t path = NI_STRINGBUF_INIT_DYNAMIC;
const char *attr;

if (ni_string_eq(mchild->name, "netif-reference")) {
Expand All @@ -3148,7 +3149,11 @@ ni_ifworker_netif_resolve_cb(xml_node_t *node, const ni_xs_type_t *type, const x
if ((attr = xml_node_get_attr(mchild, "shared")) != NULL)
shared = ni_string_eq(attr, "true");

ni_debug_application("%s: resolved reference to subordinate device %s", w->name, cw->name);
xml_node_get_path(&path, node, xml_node_find_parent(node, ni_ifworker_type_to_string(w->type)));
ni_debug_application("%s: resolved %sreference %s to subordinate device %s",
w->name, shared ? "shared " : "", path.string, cw->name);
ni_stringbuf_destroy(&path);

if (!ni_ifworker_add_child(w, cw, node, shared))
return FALSE;
} else
Expand All @@ -3165,7 +3170,11 @@ ni_ifworker_netif_resolve_cb(xml_node_t *node, const ni_xs_type_t *type, const x
if ((attr = xml_node_get_attr(mchild, "shared")) != NULL)
shared = ni_string_eq(attr, "true");

ni_debug_application("%s: resolved reference to subordinate device %s", w->name, cw->name);
xml_node_get_path(&path, node, xml_node_find_parent(node, ni_ifworker_type_to_string(w->type)));
ni_debug_application("%s: resolved %sreference %s to subordinate device %s",
w->name, shared ? "shared " : "", path.string, cw->name);
ni_stringbuf_destroy(&path);

if (!ni_ifworker_add_child(w, cw, node, shared))
return FALSE;
} else
Expand Down Expand Up @@ -3212,6 +3221,11 @@ ni_ifworker_netif_resolve_cb(xml_node_t *node, const ni_xs_type_t *type, const x
return FALSE;
}

ni_debug_application("%s: %s requires %s in state %s..%s",
w->name, method, cw->name,
ni_ifworker_state_name(min_state),
ni_ifworker_state_name(max_state));

ni_ifworker_add_check_state_req(w, method, cw, min_state, max_state);
}
}
Expand Down
39 changes: 39 additions & 0 deletions src/xml.c
Expand Up @@ -568,6 +568,18 @@ xml_node_reparent(xml_node_t *parent, xml_node_t *child)
xml_node_add_child(parent, child);
}

xml_node_t *
xml_node_find_parent(const xml_node_t *node, const char *parent)
{
xml_node_t *p;

for (p = node ? node->parent : NULL; p; p = p->parent) {
if (ni_string_eq(p->name, parent))
return p;
}
return NULL;
}

/*
* Get xml node path relative to some top node
*/
Expand Down Expand Up @@ -600,6 +612,33 @@ xml_node_path(const xml_node_t *node, const xml_node_t *top)
return __xml_node_path(node, top, pathbuf, sizeof(pathbuf));
}

static const char *
__xml_node_get_path(ni_stringbuf_t *path, const xml_node_t *node, const xml_node_t *top)
{
if (node->parent && node->name && node->parent != top) {
__xml_node_get_path(path, node->parent, top);

if (path->len && path->string[path->len - 1] != '/')
ni_stringbuf_putc(path, '/');
}

if (node->name) {
ni_stringbuf_puts(path, node->name);
} else if (!node->parent) {
/* this is the root node */
ni_stringbuf_putc(path, '/');
}
return path->string;
}

const char *
xml_node_get_path(ni_stringbuf_t *path, const xml_node_t *node, const xml_node_t *top)
{
if (!path || !node)
return NULL;
return __xml_node_get_path(path, node, top);
}

/*
* Traverse an xml tree, depth first.
*/
Expand Down

0 comments on commit bfee1a8

Please sign in to comment.