static ni_bool_t ni_ifdown_stop_device(const char *device_name) { if (!ni_nanny_call_device_disable(device_name)) { ni_debug_application("Unable to disable device named %s", device_name); return FALSE; } return TRUE; }
static ni_bool_t ni_ifup_hire_nanny(ni_ifworker_t *w) { xml_node_t *ifcfg = NULL, *policy = NULL; ni_netdev_t *dev; unsigned int i; ni_bool_t rv = FALSE; char *pname; if (!w) return rv; ni_debug_application("%s: hiring nanny", w->name); /* Create a config duplicate for a policy */ ifcfg = xml_node_clone(w->config.node, NULL); if (!ifcfg) goto error; pname = ni_ifpolicy_name_from_ifname(w->name); ni_debug_application("%s: converting config into policy '%s'", w->name, pname); policy = ni_convert_cfg_into_policy_node(ifcfg, __ni_ifup_generate_match(w), pname, w->config.origin); ni_string_free(&pname); if (!policy) { policy = ifcfg; /* Free cloned config*/ goto error; } #if 0 /* Do we need this? */ /* Add link type to match node*/ if (dev) { ni_debug_application("%s: adding link type (%s) to match", w->name, ni_linktype_type_to_name(dev->link.type)); ni_ifpolicy_match_add_link_type(policy, dev->link.type); } ni_debug_application("%s: adding minimum device state (%s) to match", w->name, ni_ifworker_state_name(w->fsm.state)); /* Add minimum device state to match node */ if (!ni_ifpolicy_match_add_min_state(policy, w->fsm.state)) goto error; #endif dev = w->device; if (dev) { ni_debug_application("%s: enabling device for nanny", w->name); if (!ni_nanny_call_device_enable(w->name)) goto error; } ni_debug_application("%s: adding policy %s to nanny", w->name, xml_node_get_attr(policy, NI_NANNY_IFPOLICY_NAME)); if (ni_nanny_addpolicy_node(policy, w->config.origin) <= 0) { ni_nanny_call_device_disable(w->name); goto error; } ni_debug_application("%s: nanny hired!", w->name); ni_ifworker_success(w); /* Append policies for all children in case they contain some special options */ for (i = 0; i < w->children.count; i++) { ni_ifworker_t *child = w->children.data[i]; if (!ni_ifup_hire_nanny(child)) ni_error("%s: unable to apply configuration to nanny", child->name); } rv = TRUE; error: if (!rv) ni_ifworker_fail(w, "%s: unable to apply configuration to nanny", w->name); xml_node_free(policy); return rv; }