static int set_ethtool_priv_flags(const ni_netdev_ref_t *ref, ni_ethtool_t *ethtool, struct ethtool_args *args) { ni_ethtool_priv_flags_t *pflags; ni_bool_t enabled; char *key, *val; int ret = -1, n; if (!(pflags = ni_ethtool_priv_flags_new())) return ret; for (n = 0; n + 1 < args->argc && args->argv[n]; ++n) { key = args->argv[n++]; val = args->argv[n]; if (ni_parse_boolean(val, &enabled) || ni_string_array_append(&pflags->names, key)) goto cleanup; if (enabled) pflags->bitmap |= NI_BIT(pflags->names.count - 1); } ret = ni_ethtool_set_priv_flags(ref, ethtool, pflags); cleanup: ni_ethtool_priv_flags_free(pflags); return ret; }
int ni_ethtool_get_priv_flags(const char *ifname, ni_ethtool_t *ethtool) { int ret = 0; if (!ni_ethtool_supported(ethtool, NI_ETHTOOL_SUPP_GET_PRIV_FLAGS)) return -EOPNOTSUPP; if (!ethtool->priv_flags) { if (!(ethtool->priv_flags = ni_ethtool_priv_flags_new())) return -ENOMEM; } ethtool->priv_flags->bitmap = 0; ret = ni_ethtool_get_priv_flags_bitmap(ifname, ethtool, ðtool->priv_flags->bitmap); if (ret < 0) { ni_ethtool_set_supported(ethtool, NI_ETHTOOL_SUPP_GET_PRIV_FLAGS, ret != -EOPNOTSUPP); goto cleanup; } if (!ethtool->priv_flags->names.count) { ret = ni_ethtool_get_priv_flags_names(ifname, ethtool, ðtool->priv_flags->names); if (ret < 0) goto cleanup; } return 0; cleanup: ni_ethtool_priv_flags_free(ethtool->priv_flags); ethtool->priv_flags = NULL; return ret; }
static dbus_bool_t ni_objectmodel_ethtool_set_priv_flags(ni_dbus_object_t *object, const ni_dbus_property_t *property, const ni_dbus_variant_t *argument, DBusError *error) { const ni_dbus_variant_t *dict; ni_ethtool_t *ethtool; unsigned int i, len; dbus_bool_t enabled; ni_stringbuf_t buf; const char *name; if (!ni_dbus_variant_is_dict_array(argument)) return FALSE; if (!(ethtool = ni_objectmodel_ethtool_write_handle(object, error))) return FALSE; ni_ethtool_priv_flags_free(ethtool->priv_flags); if (!(ethtool->priv_flags = ni_ethtool_priv_flags_new())) return FALSE; if ((len = argument->array.len) > 32) len = 32; ni_stringbuf_init(&buf); for (i = 0; i < argument->array.len; ++i) { dict = &argument->variant_array_value[i]; if (!ni_dbus_variant_is_dict(dict)) continue; if (!ni_dbus_dict_get_string(dict, "name", &name) || !ni_dbus_dict_get_bool(dict, "enabled", &enabled)) continue; ni_stringbuf_put(&buf, name, ni_string_len(name)); ni_stringbuf_trim_head(&buf, " \t\n"); ni_stringbuf_trim_tail(&buf, " \t\n"); if (ni_string_empty(buf.string)) continue; if (ni_string_array_append(ðtool->priv_flags->names, buf.string) == 0) { if (enabled) ethtool->priv_flags->bitmap |= NI_BIT(i); } ni_stringbuf_destroy(&buf); } return TRUE; }