/* * Use some locking here... */ int ni_dhcp6_load_duid(ni_opaque_t *duid, const char *filename) { char path[PATH_MAX]; const char *name = CONFIG_DHCP6_DUID_NODE; xml_node_t *xml = NULL; xml_node_t *node; FILE *fp; int rv; if (!filename) { snprintf(path, sizeof(path), "%s/%s", ni_config_storedir(), CONFIG_DHCP6_DUID_FILE); filename = path; } else { name = "duid"; } if ((fp = fopen(filename, "r")) == NULL) { if (errno != ENOENT) ni_error("unable to open %s for reading: %m", filename); return -1; } xml = xml_node_scan(fp, NULL); fclose(fp); if (xml == NULL) { ni_error("%s: unable to parse xml file", filename); return -1; } if (xml->name == NULL) node = xml->children; else node = xml; if (!node || !ni_string_eq(node->name, name)) { ni_error("%s: does not contain %s", filename, name); xml_node_free(xml); return -1; } rv = 0; if (!node->cdata || !ni_duid_parse_hex(duid, node->cdata)) { ni_error("%s: unable to parse %s xml file", filename, name); rv = -1; } xml_node_free(xml); return rv; }
/* * Read a lease from a file */ ni_addrconf_lease_t * ni_addrconf_lease_file_read(const char *ifname, int type, int family) { ni_addrconf_lease_t *lease = NULL; xml_node_t *xml = NULL, *lnode; char *filename = NULL; FILE *fp; if (!__ni_addrconf_lease_file_path(&filename, ni_config_statedir(), ifname, type, family)) { ni_error("Unable to construct lease file name: %m"); return NULL; } if ((fp = fopen(filename, "re")) == NULL) { if (errno == ENOENT) { if (__ni_addrconf_lease_file_path(&filename, ni_config_storedir(), ifname, type, family)) fp = fopen(filename, "re"); } if (fp == NULL) { if (errno != ENOENT) { ni_error("Unable to open %s for reading: %m", filename); } ni_string_free(&filename); return NULL; } } ni_debug_dhcp("Reading lease from %s", filename); xml = xml_node_scan(fp, filename); fclose(fp); if (xml == NULL) { ni_error("Unable to parse %s", filename); ni_string_free(&filename); return NULL; } /* find the lease node already here, so we can report it */ if (!ni_string_eq(xml->name, NI_ADDRCONF_LEASE_XML_NODE)) lnode = xml_node_get_child(xml, NI_ADDRCONF_LEASE_XML_NODE); else lnode = xml; if (!lnode) { ni_error("File '%s' does not contain a valid lease", filename); ni_string_free(&filename); xml_node_free(xml); return NULL; } if (ni_addrconf_lease_from_xml(&lease, xml) < 0) { ni_error("Unable to parse xml lease file '%s'", filename); ni_string_free(&filename); xml_node_free(xml); return NULL; } ni_string_free(&filename); xml_node_free(xml); return lease; }