const char * ni_extension_statedir(const char *ex_name) { ni_extension_t *ex = NULL; ni_config_fslocation_t *fsloc = NULL; const char *extension_dirname = "extension"; const int mode = 0700; char pathname[PATH_MAX]; if (!(ni_config_extension_statedir(extension_dirname, mode))) return NULL; if (!(ex = ni_config_find_system_updater(ni_global.config, ex_name))) return NULL; fsloc = &ex->statedir; if (fsloc->path == NULL) { snprintf(pathname, sizeof(pathname), "%s/%s/%s", ni_config_statedir(), extension_dirname, ex->name); if (ni_mkdir_maybe(pathname, mode) < 0) { ni_error("Cannot create extension state directory \"%s\": %m", pathname); } else { ni_config_fslocation_init(fsloc, pathname, mode); } } return fsloc->path; }
/* * Create an empty config object */ ni_config_t * ni_config_new() { ni_config_t *conf; conf = xcalloc(1, sizeof(*conf)); conf->addrconf.default_allow_update = ni_config_addrconf_update_mask_all(); conf->addrconf.dhcp4.allow_update = conf->addrconf.default_allow_update; conf->addrconf.dhcp6.allow_update = conf->addrconf.default_allow_update; conf->addrconf.autoip.allow_update = conf->addrconf.default_allow_update; conf->recv_max = 64 * 1024; ni_config_fslocation_init(&conf->piddir, WICKED_PIDDIR, 0755); ni_config_fslocation_init(&conf->statedir, WICKED_STATEDIR, 0755); ni_config_fslocation_init(&conf->storedir, WICKED_STOREDIR, 0755); conf->use_nanny = FALSE; return conf; }
ni_bool_t __ni_config_parse(ni_config_t *conf, const char *filename, ni_init_appdata_callback_t *cb, void *appdata) { xml_document_t *doc; xml_node_t *node, *child; ni_debug_wicked("Reading config file %s", filename); doc = xml_document_read(filename); if (!doc) { ni_error("%s: error parsing configuration file", filename); goto failed; } node = xml_node_get_child(doc->root, "config"); if (!node) { ni_error("%s: no <config> element", filename); goto failed; } /* Loop over all elements in the config file */ for (child = node->children; child; child = child->next) { if (strcmp(child->name, "include") == 0) { const char *attrval, *path; if ((attrval = xml_node_get_attr(child, "name")) == NULL) { ni_error("%s: <include> element lacks filename", xml_node_location(child)); goto failed; } if (!(path = ni_config_build_include(filename, attrval))) goto failed; if (!__ni_config_parse(conf, path, cb, appdata)) goto failed; } else if (strcmp(child->name, "use-nanny") == 0) { if (ni_parse_boolean(child->cdata, &conf->use_nanny)) { ni_error("%s: invalid <%s>%s</%s> element value", filename, child->name, child->name, child->cdata); goto failed; } } else if (strcmp(child->name, "piddir") == 0) { ni_config_parse_fslocation(&conf->piddir, child); } else if (strcmp(child->name, "statedir") == 0) { ni_config_parse_fslocation(&conf->statedir, child); } else if (strcmp(child->name, "storedir") == 0) { ni_config_parse_fslocation(&conf->storedir, child); } else if (strcmp(child->name, "dbus") == 0) { const char *attrval; if ((attrval = xml_node_get_attr(child, "name")) != NULL) ni_string_dup(&conf->dbus_name, attrval); if ((attrval = xml_node_get_attr(child, "type")) != NULL) ni_string_dup(&conf->dbus_type, attrval); } else if (strcmp(child->name, "schema") == 0) { const char *attrval; if ((attrval = xml_node_get_attr(child, "name")) != NULL) ni_string_dup(&conf->dbus_xml_schema_file, attrval); } else if (strcmp(child->name, "addrconf") == 0) { xml_node_t *gchild; for (gchild = child->children; gchild; gchild = gchild->next) { if (!strcmp(gchild->name, "default-allow-update")) ni_config_parse_update_targets(&conf->addrconf.default_allow_update, gchild); if (!strcmp(gchild->name, "dhcp4") && !ni_config_parse_addrconf_dhcp4(&conf->addrconf.dhcp4, gchild)) goto failed; if (!strcmp(gchild->name, "dhcp6") && !ni_config_parse_addrconf_dhcp6(&conf->addrconf.dhcp6, gchild)) goto failed; } } else if (strcmp(child->name, "sources") == 0) { if (!ni_config_parse_sources(conf, child)) goto failed; } else if (strcmp(child->name, "extension") == 0 || strcmp(child->name, "dbus-service") == 0) { if (!ni_config_parse_objectmodel_extension(&conf->dbus_extensions, child)) goto failed; } else if (strcmp(child->name, "netif-naming-services") == 0) { if (!ni_config_parse_objectmodel_netif_ns(&conf->ns_extensions, child)) goto failed; } else if (strcmp(child->name, "netif-firmware-discovery") == 0) { if (!ni_config_parse_objectmodel_firmware_discovery(&conf->fw_extensions, child)) goto failed; } else if (strcmp(child->name, "system-updater") == 0) { if (!ni_config_parse_system_updater(&conf->updater_extensions, child)) goto failed; } else if (cb != NULL) { if (!cb(appdata, child)) goto failed; } } if (conf->backupdir.path == NULL) { char pathname[PATH_MAX]; snprintf(pathname, sizeof(pathname), "%s/backup", conf->statedir.path); ni_config_fslocation_init(&conf->backupdir, pathname, 0700); } xml_document_free(doc); return TRUE; failed: if (doc) xml_document_free(doc); return FALSE; }