Example #1
0
/*
 * 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;
}
Example #2
0
/*
 * 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;
}