Skip to content

Commit

Permalink
fsm: ni_fsm_workers_from_xml() operates on nodes
Browse files Browse the repository at this point in the history
  • Loading branch information
wipawel committed Jun 6, 2014
1 parent 665bc6c commit 5263ef3
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 51 deletions.
11 changes: 9 additions & 2 deletions client/read-config.c
Expand Up @@ -211,8 +211,15 @@ ni_ifconfig_load(ni_fsm_t *fsm, const char *root, ni_string_array_t *opt_ifconfi
}

for (i = 0; i < docs.count; i++) {
/* TODO: review ni_fsm_workers_from_xml return codes */
ni_fsm_workers_from_xml(fsm, docs.data[i]);
xml_node_t *root, *ifnode;
const char *origin;

root = xml_document_root(docs.data[i]);
origin = xml_node_get_location_filename(root);
for (ifnode = root->children; ifnode; ifnode = ifnode->next) {
/* We do not fail when unable to generate ifworker */
ni_fsm_workers_from_xml(fsm, ifnode, origin);
}
}

/* Do not destroy xml documents as referenced by the fsm workers */
Expand Down
2 changes: 1 addition & 1 deletion include/wicked/fsm.h
Expand Up @@ -264,7 +264,7 @@ extern unsigned int ni_fsm_mark_matching_workers(ni_fsm_t *, ni_ifworker_array_
extern unsigned int ni_fsm_start_matching_workers(ni_fsm_t *, ni_ifworker_array_t *);
extern void ni_fsm_reset_matching_workers(ni_fsm_t *, ni_ifworker_array_t *, const ni_uint_range_t *, ni_bool_t);
extern int ni_fsm_build_hierarchy(ni_fsm_t *);
extern unsigned int ni_fsm_workers_from_xml(ni_fsm_t *, xml_document_t *);
extern ni_bool_t ni_fsm_workers_from_xml(ni_fsm_t *, xml_node_t *, const char *);
extern unsigned int ni_fsm_fail_count(ni_fsm_t *);
extern ni_ifworker_t * ni_fsm_ifworker_by_object_path(ni_fsm_t *, const char *);
extern ni_ifworker_t * ni_fsm_ifworker_by_netdev(ni_fsm_t *, const ni_netdev_t *);
Expand Down
87 changes: 39 additions & 48 deletions src/fsm.c
Expand Up @@ -24,6 +24,8 @@
#include <wicked/xpath.h>
#include <wicked/fsm.h>
#include <wicked/client.h>

#include "client/ifconfig.h"
#include "util_priv.h"

enum {
Expand Down Expand Up @@ -1322,62 +1324,51 @@ ni_ifworker_check_config(const ni_ifworker_t *w, const xml_node_t *config_node,
/*
* Given an XML document, build interface and modem objects, and policies from it.
*/
unsigned int
ni_fsm_workers_from_xml(ni_fsm_t *fsm, xml_document_t *doc)
ni_bool_t
ni_fsm_workers_from_xml(ni_fsm_t *fsm, xml_node_t *ifnode, const char *origin)
{
xml_node_t *root, *ifnode;
unsigned int count = 0;

root = xml_document_root(doc);
for (ifnode = root->children; ifnode; ifnode = ifnode->next) {
ni_ifworker_type_t type;
const char *ifname = NULL;
xml_node_t *node;
ni_ifworker_t *w = NULL;

if (ni_string_eq(ifnode->name, "policy")) {
const char *name;

name = xml_node_get_attr(ifnode, "name");
ni_fsm_policy_new(fsm, name, ifnode);
continue;
}
ni_ifworker_type_t type;
const char *ifname = NULL;
xml_node_t *node;
ni_ifworker_t *w = NULL;

type = ni_ifworker_type_from_string(ifnode->name);
if (type == NI_IFWORKER_TYPE_NONE) {
ni_warn("%s: ignoring non-interface element <%s>",
xml_node_location(ifnode),
ifnode->name);
continue;
}
if (!fsm || xml_node_is_empty(ifnode))
return FALSE;

if ((node = xml_node_get_child(ifnode, "identify")) != NULL) {
ni_warn("%s: using obsolete <identify> element - please use <name namespace=\"...\"> instead", xml_node_location(ifnode));
w = ni_ifworker_identify_device(fsm, node, type);
} else
if ((node = xml_node_get_child(ifnode, "name")) != NULL) {
const char *namespace;
type = ni_ifworker_type_from_string(ifnode->name);
if (type == NI_IFWORKER_TYPE_NONE) {
ni_warn("%s: ignoring non-interface element <%s>",
xml_node_location(ifnode),
ifnode->name);
return FALSE;
}

namespace = xml_node_get_attr(node, "namespace");
if (namespace != NULL) {
w = __ni_ifworker_identify_device(fsm, namespace, node, type);
} else {
ifname = node->cdata;
if (ifname && (w = ni_fsm_ifworker_by_name(fsm, type, ifname)) == NULL)
w = ni_ifworker_new(fsm, type, ifname);
}
}
if ((node = xml_node_get_child(ifnode, "identify")) != NULL) {
ni_warn("%s: using obsolete <identify> element - please use <name namespace=\"...\"> instead", xml_node_location(ifnode));
w = ni_ifworker_identify_device(fsm, node, type);
} else
if ((node = xml_node_get_child(ifnode, "name")) != NULL) {
const char *namespace;

if (w == NULL) {
ni_error("%s: ignoring unknown interface", xml_node_location(ifnode));
continue;
namespace = xml_node_get_attr(node, "namespace");
if (namespace != NULL) {
w = __ni_ifworker_identify_device(fsm, namespace, node, type);
} else {
ifname = node->cdata;
if (ifname && (w = ni_fsm_ifworker_by_name(fsm, type, ifname)) == NULL)
w = ni_ifworker_new(fsm, type, ifname);
}
}

ni_ifworker_set_config(w, ifnode, xml_node_get_location_filename(root));
count++;
if (w == NULL) {
ni_error("%s: ignoring unknown interface configuration",
xml_node_location(ifnode));
return FALSE;
}

return count;
ni_ifworker_set_config(w, ifnode, origin);

return TRUE;
}

/*
Expand Down Expand Up @@ -1783,7 +1774,7 @@ ni_ifworker_apply_policies(ni_fsm_t *fsm, ni_ifworker_t *w)
ni_ifworker_type_t
ni_ifworker_type_from_string(const char *s)
{
if (ni_string_eq(s, "interface"))
if (ni_string_eq(s, NI_CLIENT_IFCONFIG))
return NI_IFWORKER_TYPE_NETDEV;
if (ni_string_eq(s, "modem"))
return NI_IFWORKER_TYPE_MODEM;
Expand Down

0 comments on commit 5263ef3

Please sign in to comment.