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; }
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; }