summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-05-21 19:18:04 +0200
committerThomas Haller <thaller@redhat.com>2017-05-23 13:37:10 +0200
commitb6d9bdcee86fc6d52b2aa1bc8a0dcfa64bec86e8 (patch)
tree4af3740c735af80caaeae8d040468b0e3b0dcaf8
parent35d6802724106f439bf8bfbbeb27d19e0403268a (diff)
downloadNetworkManager-b6d9bdcee86fc6d52b2aa1bc8a0dcfa64bec86e8.tar.gz
clients: combine int property setters
Instead of having 3 implementations for setting an int (int, uint, int64), combine them. Also, make them more configurable by allowing to specify min/max/base, outside of GParamSpec.
-rw-r--r--clients/common/nm-meta-setting-desc.c255
-rw-r--r--clients/common/nm-meta-setting-desc.h5
2 files changed, 123 insertions, 137 deletions
diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c
index 77965fbb4c..9ef8f31fd1 100644
--- a/clients/common/nm-meta-setting-desc.c
+++ b/clients/common/nm-meta-setting-desc.c
@@ -34,9 +34,6 @@
/*****************************************************************************/
-static gboolean validate_int (NMSetting *setting, const char* prop, gint val, GError **error);
-static gboolean validate_uint (NMSetting *setting, const char* prop, guint val, GError **error);
-static gboolean validate_int64 (NMSetting *setting, const char* prop, gint64 val, GError **error);
static char *secret_flags_to_string (guint32 flags, NMMetaAccessorGetType get_type);
#define ALL_SECRET_FLAGS \
@@ -796,71 +793,108 @@ _set_fcn_gobject_bool (ARGS_SET_FCN)
}
static gboolean
-_set_fcn_gobject_int (ARGS_SET_FCN)
+_set_fcn_gobject_int_impl (const NMMetaPropertyInfo *property_info,
+ NMSetting *setting,
+ const char *value,
+ GError **error)
{
- const gint64 INVALID = G_MININT64;
+ int errsv;
+ const GParamSpec *pspec;
+ nm_auto_unset_gvalue GValue gval = G_VALUE_INIT;
gint64 v;
+ gboolean has_minmax = FALSE;
+ gint64 min = G_MININT64;
+ gint64 max = G_MAXINT64;
+ guint base = 10;
- v = _nm_utils_ascii_str_to_int64 (value, 10, G_MININT, G_MAXINT, INVALID);
- if (v == INVALID) {
- g_set_error (error, 1, 0, _("'%s' is not a valid number (or out of range)"), value);
- return FALSE;
+ if (property_info->property_typ_data) {
+ if (property_info->property_typ_data->subtype.gobject_int.base > 0)
+ base = property_info->property_typ_data->subtype.gobject_int.base;
+ if ( property_info->property_typ_data->subtype.gobject_int.min
+ || property_info->property_typ_data->subtype.gobject_int.max) {
+ min = property_info->property_typ_data->subtype.gobject_int.min;
+ max = property_info->property_typ_data->subtype.gobject_int.max;
+ has_minmax = TRUE;
+ }
}
- /* Validate the number according to the property spec */
- if (!validate_int (setting, property_info->property_name, v, error))
- return FALSE;
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (setting)), property_info->property_name);
+ if (!G_IS_PARAM_SPEC (pspec))
+ g_return_val_if_reached (FALSE);
+ switch (pspec->value_type) {
+ case G_TYPE_INT:
+ if (!has_minmax) {
+ const GParamSpecInt *p = (GParamSpecInt *) pspec;
- g_object_set (setting, property_info->property_name, (int) v, NULL);
- return TRUE;
-}
+ min = p->minimum;
+ max = p->maximum;
+ }
+ break;
+ case G_TYPE_UINT:
+ if (!has_minmax) {
+ const GParamSpecUInt *p = (GParamSpecUInt *) pspec;
-static gboolean
-_set_fcn_gobject_int64 (ARGS_SET_FCN)
-{
- gint64 v;
+ min = p->minimum;
+ max = p->maximum;
+ }
+ break;
+ case G_TYPE_INT64:
+ if (!has_minmax) {
+ const GParamSpecInt64 *p = (GParamSpecInt64 *) pspec;
- v = _nm_utils_ascii_str_to_int64 (value, 10, G_MININT64, G_MAXINT64, 0);
- if (errno) {
- g_set_error (error, 1, 0, _("'%s' is not a valid number (or out of range)"), value);
- return FALSE;
+ min = p->minimum;
+ max = p->maximum;
+ }
+ break;
+ default:
+ g_return_val_if_reached (FALSE);
}
- /* Validate the number according to the property spec */
- if (!validate_int64 (setting, property_info->property_name, v, error))
+ v = _nm_utils_ascii_str_to_int64 (value, base, min, max, 0);
+ if ((errsv = errno) != 0) {
+ if (errsv == ERANGE) {
+ g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT,
+ _("'%s' is out of range [%lli, %lli]"),
+ value,
+ (long long) min,
+ (long long) max);
+ } else {
+ g_set_error (error, NM_UTILS_ERROR, NM_UTILS_ERROR_INVALID_ARGUMENT,
+ _("'%s' is not a valid number"), value);
+ }
return FALSE;
+ }
- g_object_set (setting, property_info->property_name, v, NULL);
- return TRUE;
-}
-
-static gboolean
-_set_fcn_gobject_uint_impl (const NMMetaPropertyInfo *property_info,
- NMSetting *setting,
- const char *value,
- GError **error)
-{
- unsigned long val_int;
-
- g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-
- if (!nmc_string_to_uint (value, TRUE, 0, G_MAXUINT, &val_int)) {
- g_set_error (error, 1, 0, _("'%s' is not a valid number (or out of range)"), value);
- return FALSE;
+ g_value_init (&gval, pspec->value_type);
+ switch (pspec->value_type) {
+ case G_TYPE_INT:
+ g_value_set_int (&gval, v);
+ break;
+ case G_TYPE_UINT:
+ g_value_set_uint (&gval, v);
+ break;
+ case G_TYPE_INT64:
+ g_value_set_int64 (&gval, v);
+ break;
+ default:
+ nm_assert_not_reached ();
+ break;
}
/* Validate the number according to the property spec */
- if (!validate_uint (setting, property_info->property_name, (guint) val_int, error))
- return FALSE;
+ if (!nm_g_object_set_property (G_OBJECT (setting),
+ property_info->property_name,
+ &gval,
+ error))
+ g_return_val_if_reached (FALSE);
- g_object_set (setting, property_info->property_name, (guint) val_int, NULL);
return TRUE;
}
static gboolean
-_set_fcn_gobject_uint (ARGS_SET_FCN)
+_set_fcn_gobject_int (ARGS_SET_FCN)
{
- return _set_fcn_gobject_uint_impl (property_info, setting, value, error);
+ return _set_fcn_gobject_int_impl (property_info, setting, value, error);
}
static gboolean
@@ -868,7 +902,7 @@ _set_fcn_gobject_mtu (ARGS_SET_FCN)
{
if (nm_streq0 (value, "auto"))
value = "0";
- return _set_fcn_gobject_uint_impl (property_info, setting, value, error);
+ return _set_fcn_gobject_int_impl (property_info, setting, value, error);
}
static gboolean
@@ -1455,49 +1489,6 @@ validate_int (NMSetting *setting, const char* prop, gint val, GError **error)
return success;
}
-static gboolean
-validate_int64 (NMSetting *setting, const char* prop, gint64 val, GError **error)
-{
- GParamSpec *pspec;
- GValue value = G_VALUE_INIT;
- gboolean success = TRUE;
-
- g_value_init (&value, G_TYPE_INT64);
- g_value_set_int64 (&value, val);
- pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (setting)), prop);
- g_assert (G_IS_PARAM_SPEC (pspec));
- if (g_param_value_validate (pspec, &value)) {
- GParamSpecInt64 *pspec_int = (GParamSpecInt64 *) pspec;
- G_STATIC_ASSERT (sizeof (long long) >= sizeof (gint64));
- g_set_error (error, 1, 0, _("'%lld' is not valid; use <%lld-%lld>"),
- (long long) val, (long long) pspec_int->minimum, (long long) pspec_int->maximum);
- success = FALSE;
- }
- g_value_unset (&value);
- return success;
-}
-
-static gboolean
-validate_uint (NMSetting *setting, const char* prop, guint val, GError **error)
-{
- GParamSpec *pspec;
- GValue value = G_VALUE_INIT;
- gboolean success = TRUE;
-
- g_value_init (&value, G_TYPE_UINT);
- g_value_set_uint (&value, val);
- pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (G_OBJECT (setting)), prop);
- g_assert (G_IS_PARAM_SPEC (pspec));
- if (g_param_value_validate (pspec, &value)) {
- GParamSpecUInt *pspec_uint = (GParamSpecUInt *) pspec;
- g_set_error (error, 1, 0, _("'%u' is not valid; use <%u-%u>"),
- val, pspec_uint->minimum, pspec_uint->maximum);
- success = FALSE;
- }
- g_value_unset (&value);
- return success;
-}
-
static char *
flag_values_to_string (GFlagsValue *array, guint n)
{
@@ -4431,16 +4422,6 @@ static const NMMetaPropertyType _pt_gobject_int = {
.set_fcn = _set_fcn_gobject_int,
};
-static const NMMetaPropertyType _pt_gobject_int64 = {
- .get_fcn = _get_fcn_gobject,
- .set_fcn = _set_fcn_gobject_int64,
-};
-
-static const NMMetaPropertyType _pt_gobject_uint = {
- .get_fcn = _get_fcn_gobject,
- .set_fcn = _set_fcn_gobject_uint,
-};
-
static const NMMetaPropertyType _pt_gobject_mtu = {
.get_fcn = _get_fcn_gobject_mtu,
.set_fcn = _set_fcn_gobject_mtu,
@@ -4799,10 +4780,10 @@ static const NMMetaPropertyInfo *const property_infos_ADSL[] = {
),
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_ADSL_VPI,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_ADSL_VCI,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
NULL
};
@@ -4871,31 +4852,31 @@ static const NMMetaPropertyInfo *const property_infos_BRIDGE[] = {
.is_cli_option = TRUE,
.property_alias = "priority",
.prompt = N_("STP priority [32768]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_FORWARD_DELAY,
.is_cli_option = TRUE,
.property_alias = "forward-delay",
.prompt = N_("Forward delay [15]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_HELLO_TIME,
.is_cli_option = TRUE,
.property_alias = "hello-time",
.prompt = N_("Hello time [2]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MAX_AGE,
.is_cli_option = TRUE,
.property_alias = "max-age",
.prompt = N_("Max age [20]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_AGEING_TIME,
.is_cli_option = TRUE,
.property_alias = "ageing-time",
.prompt = N_("MAC address ageing time [300]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_SNOOPING,
.is_cli_option = TRUE,
@@ -4913,13 +4894,13 @@ static const NMMetaPropertyInfo *const property_infos_BRIDGE_PORT[] = {
.is_cli_option = TRUE,
.property_alias = "priority",
.prompt = N_("Bridge port priority [32]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_PORT_PATH_COST,
.is_cli_option = TRUE,
.property_alias = "path-cost",
.prompt = N_("Bridge port STP path cost [100]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE,
.is_cli_option = TRUE,
@@ -5078,7 +5059,7 @@ static const NMMetaPropertyInfo *const property_infos_CONNECTION[] = {
),
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_CONNECTION_METERED,
.describe_message =
@@ -5409,7 +5390,7 @@ static const NMMetaPropertyInfo *const property_infos_IP4_CONFIG[] = {
),
),
PROPERTY_INFO (NM_SETTING_IP_CONFIG_ROUTE_METRIC, DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_ROUTE_METRIC,
- .property_type = &_pt_gobject_int64,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES, DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES,
.property_type = &_pt_gobject_bool,
@@ -5536,7 +5517,7 @@ static const NMMetaPropertyInfo *const property_infos_IP6_CONFIG[] = {
),
),
PROPERTY_INFO (NM_SETTING_IP_CONFIG_ROUTE_METRIC, DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_ROUTE_METRIC,
- .property_type = &_pt_gobject_int64,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO (NM_SETTING_IP_CONFIG_IGNORE_AUTO_ROUTES, DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES,
.property_type = &_pt_gobject_bool,
@@ -5617,10 +5598,10 @@ static const NMMetaPropertyInfo *const property_infos_IP_TUNNEL[] = {
.property_type = &_pt_gobject_string,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_IP_TUNNEL_TTL,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_IP_TUNNEL_TOS,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_IP_TUNNEL_PATH_MTU_DISCOVERY,
.property_type = &_pt_gobject_bool,
@@ -5632,10 +5613,10 @@ static const NMMetaPropertyInfo *const property_infos_IP_TUNNEL[] = {
.property_type = &_pt_gobject_string,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_IP_TUNNEL_ENCAPSULATION_LIMIT,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_IP_TUNNEL_FLOW_LABEL,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_IP_TUNNEL_MTU,
.property_type = &_pt_gobject_mtu,
@@ -5846,10 +5827,10 @@ static const NMMetaPropertyInfo *const property_infos_PPP[] = {
.property_type = &_pt_gobject_bool,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_PPP_BAUD,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_PPP_MRU,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_PPP_MTU,
.property_type = &_pt_gobject_mtu,
@@ -5858,10 +5839,10 @@ static const NMMetaPropertyInfo *const property_infos_PPP[] = {
),
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_PPP_LCP_ECHO_FAILURE,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_PPP_LCP_ECHO_INTERVAL,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
NULL
};
@@ -5943,10 +5924,10 @@ static const NMMetaPropertyInfo *const property_infos_TEAM_PORT[] = {
#define _CURRENT_NM_META_SETTING_TYPE NM_META_SETTING_TYPE_SERIAL
static const NMMetaPropertyInfo *const property_infos_SERIAL[] = {
PROPERTY_INFO_WITH_DESC (NM_SETTING_SERIAL_BAUD,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_SERIAL_BITS,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_SERIAL_PARITY,
.property_type = DEFINE_PROPERTY_TYPE (
@@ -5955,10 +5936,10 @@ static const NMMetaPropertyInfo *const property_infos_SERIAL[] = {
),
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_SERIAL_STOPBITS,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_SERIAL_SEND_DELAY,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
NULL
};
@@ -6026,7 +6007,7 @@ static const NMMetaPropertyInfo *const property_infos_VLAN[] = {
.property_alias = "id",
.inf_flags = NM_META_PROPERTY_INF_FLAG_REQD,
.prompt = N_("VLAN ID (<0-4094>)"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VLAN_FLAGS,
.is_cli_option = TRUE,
@@ -6100,7 +6081,7 @@ static const NMMetaPropertyInfo *const property_infos_VPN[] = {
.property_type = &_pt_gobject_bool,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VPN_TIMEOUT,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
NULL
};
@@ -6119,7 +6100,7 @@ static const NMMetaPropertyInfo *const property_infos_VXLAN[] = {
.property_alias = "id",
.inf_flags = NM_META_PROPERTY_INF_FLAG_REQD,
.prompt = N_("VXLAN ID"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_LOCAL,
.is_cli_option = TRUE,
@@ -6138,31 +6119,31 @@ static const NMMetaPropertyInfo *const property_infos_VXLAN[] = {
.is_cli_option = TRUE,
.property_alias = "source-port-min",
.prompt = N_("Minimum source port [0]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_SOURCE_PORT_MAX,
.is_cli_option = TRUE,
.property_alias = "source-port-max",
.prompt = N_("Maximum source port [0]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_DESTINATION_PORT,
.is_cli_option = TRUE,
.property_alias = "destination-port",
.prompt = N_("Destination port [8472]"),
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_TOS,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_TTL,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_AGEING,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_LIMIT,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_VXLAN_LEARNING,
.property_type = &_pt_gobject_bool,
@@ -6212,7 +6193,7 @@ static const NMMetaPropertyInfo *const property_infos_WIRED[] = {
.property_type = &_pt_gobject_readonly,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRED_SPEED,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRED_DUPLEX,
.property_type = &_pt_gobject_string,
@@ -6431,7 +6412,7 @@ static const NMMetaPropertyInfo *const property_infos_WIRELESS_SECURITY[] = {
),
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX,
- .property_type = &_pt_gobject_uint,
+ .property_type = &_pt_gobject_int,
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_WIRELESS_SECURITY_AUTH_ALG,
.property_type = &_pt_gobject_string,
diff --git a/clients/common/nm-meta-setting-desc.h b/clients/common/nm-meta-setting-desc.h
index ea77bf7ee2..2e0b03bd29 100644
--- a/clients/common/nm-meta-setting-desc.h
+++ b/clients/common/nm-meta-setting-desc.h
@@ -237,6 +237,11 @@ struct _NMMetaPropertyTypData {
const struct _NMUtilsEnumValueInfo *value_infos;
} gobject_enum;
struct {
+ gint64 min;
+ gint64 max;
+ guint base;
+ } gobject_int;
+ struct {
const char *(*validate_fcn) (const char *value, char **out_to_free, GError **error);
} gobject_string;
struct {