Ejemplo n.º 1
0
static dbus_bool_t
__ni_objectmodel_bonding_set_arpmon(ni_dbus_object_t *object,
				const ni_dbus_property_t *property,
				const ni_dbus_variant_t *result,
				DBusError *error)
{
	ni_bonding_t *bond;
	ni_dbus_variant_t *var;

	if (!(bond = __ni_objectmodel_bonding_write_handle(object, error)))
		return FALSE;

	bond->monitoring |= NI_BOND_MONITOR_ARP;

	ni_dbus_dict_get_uint32(result, "interval", &bond->arpmon.interval);
	ni_dbus_dict_get_uint32(result, "validate", &bond->arpmon.validate);
	if ((var = ni_dbus_dict_get(result, "targets")) != NULL) {
		ni_bool_t valid = TRUE;
		unsigned int i;

		if (!ni_dbus_variant_is_string_array(var)) {
			dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
				"%s.%s property - expected string array for attribute targets",
				object->path, property->name);
			return FALSE;
		}

		for (i = 0; i < var->array.len; ++i) {
			const char *s = var->string_array_value[i];

			if (!ni_bonding_is_valid_arp_ip_target(s)) {
				valid = FALSE;
				break;
			}
			ni_string_array_append(&bond->arpmon.targets, s);
		}

		if (!valid) {
			ni_string_array_destroy(&bond->arpmon.targets);
			dbus_set_error(error, DBUS_ERROR_INVALID_ARGS,
				"%s.%s property - invalid arp ip target adddress",
				object->path, property->name);
			return FALSE;
		}
	}

	return TRUE;
}
Ejemplo n.º 2
0
static dbus_bool_t
ni_objectmodel_ethtool_link_adv_bitfield_from_array(const ni_dbus_variant_t *array,
		ni_bitfield_t *bitfield, ni_bool_t (*name_to_bit)(const char *, unsigned int *))
{
	const char *value;
	unsigned int bit;
	size_t len, pos;

	if (!ni_dbus_variant_is_string_array(array))
		return FALSE;

	if ((len = array->array.len) > ni_ethtool_link_mode_nbits())
		len = ni_ethtool_link_mode_nbits();

	for (pos = 0; pos < len; ++pos) {
		value = array->string_array_value[pos];
		if (name_to_bit(value, &bit))
			ni_bitfield_setbit(bitfield, bit);
		else
			ni_bitfield_parse(bitfield, value, 0);
	}
	return TRUE;
}