summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-05-14 09:23:09 +0200
committerThomas Haller <thaller@redhat.com>2021-05-14 09:23:09 +0200
commitd7594ae9c91fde37489e93edb3133a03d4770f85 (patch)
treec8d22fcc9d26e6be397cfb7d71ea081b330af20f
parent652ddca04c5287bd4db1ad456556b9ed028621c0 (diff)
parente5b46aa38ab1002ae73a9ae42412b9e2340a3b87 (diff)
downloadNetworkManager-d7594ae9c91fde37489e93edb3133a03d4770f85.tar.gz
cli: merge branch 'th/cli-ethtool-ternary'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/849
-rw-r--r--src/libnmc-base/nm-client-utils.c16
-rw-r--r--src/libnmc-base/nm-client-utils.h17
-rw-r--r--src/libnmc-setting/nm-meta-setting-desc.c23
3 files changed, 39 insertions, 17 deletions
diff --git a/src/libnmc-base/nm-client-utils.c b/src/libnmc-base/nm-client-utils.c
index 4737adb921..49234d9752 100644
--- a/src/libnmc-base/nm-client-utils.c
+++ b/src/libnmc-base/nm-client-utils.c
@@ -130,7 +130,10 @@ nmc_string_to_bool(const char *str, gboolean *val_bool, GError **error)
}
gboolean
-nmc_string_to_ternary(const char *str, NMTernary *val, GError **error)
+nmc_string_to_ternary_full(const char * str,
+ NMCStringToTernaryFlags flags,
+ NMTernary * val,
+ GError ** error)
{
gs_free char *str_to_free = NULL;
int i;
@@ -156,9 +159,16 @@ nmc_string_to_ternary(const char *str, NMTernary *val, GError **error)
*val = NM_TERNARY_TRUE;
else if (nmc_string_is_valid(str, NM_MAKE_STRV("false", "no", "off"), NULL))
*val = NM_TERNARY_FALSE;
- else if (nmc_string_is_valid(str, NM_MAKE_STRV("unknown", "default"), NULL))
+ else if (nmc_string_is_valid(
+ str,
+ NM_MAKE_STRV("unknown",
+ "default",
+ NM_FLAGS_HAS(flags, NMC_STRING_TO_TERNARY_FLAGS_IGNORE_FOR_DEFAULT)
+ ? "ignore"
+ : NULL),
+ NULL))
*val = NM_TERNARY_DEFAULT;
- else if ((i = _nm_utils_ascii_str_to_int64(str, 0, -1, 1, -2)) >= -1)
+ else if ((i = _nm_utils_ascii_str_to_int64(str, 0, -1, 1, -2)) != -2)
*val = (NMTernary) i;
else {
nm_utils_error_set(error,
diff --git a/src/libnmc-base/nm-client-utils.h b/src/libnmc-base/nm-client-utils.h
index 0fcc06582d..1fc18acaf6 100644
--- a/src/libnmc-base/nm-client-utils.h
+++ b/src/libnmc-base/nm-client-utils.h
@@ -23,7 +23,22 @@ gboolean nmc_string_to_uint(const char * str,
unsigned long int max,
unsigned long int *value);
gboolean nmc_string_to_bool(const char *str, gboolean *val_bool, GError **error);
-gboolean nmc_string_to_ternary(const char *str, NMTernary *val, GError **error);
+
+typedef enum {
+ NMC_STRING_TO_TERNARY_FLAGS_NONE = 0,
+ NMC_STRING_TO_TERNARY_FLAGS_IGNORE_FOR_DEFAULT = (1LL << 0),
+} NMCStringToTernaryFlags;
+
+gboolean nmc_string_to_ternary_full(const char * str,
+ NMCStringToTernaryFlags flags,
+ NMTernary * val,
+ GError ** error);
+
+static inline gboolean
+nmc_string_to_ternary(const char *str, NMTernary *val, GError **error)
+{
+ return nmc_string_to_ternary_full(str, NMC_STRING_TO_TERNARY_FLAGS_NONE, val, error);
+}
gboolean matches(const char *cmd, const char *pattern);
diff --git a/src/libnmc-setting/nm-meta-setting-desc.c b/src/libnmc-setting/nm-meta-setting-desc.c
index 1a3484fcf5..9a0a4b64aa 100644
--- a/src/libnmc-setting/nm-meta-setting-desc.c
+++ b/src/libnmc-setting/nm-meta-setting-desc.c
@@ -4284,10 +4284,9 @@ static gconstpointer _get_fcn_ethtool(ARGS_GET_FCN)
static gboolean _set_fcn_ethtool(ARGS_SET_FCN)
{
- NMEthtoolID ethtool_id = property_info->property_typ_data->subtype.ethtool.ethtool_id;
- gs_free char *value_to_free = NULL;
- gint64 i64;
- gboolean b;
+ NMEthtoolID ethtool_id = property_info->property_typ_data->subtype.ethtool.ethtool_id;
+ gint64 i64;
+ NMTernary t;
if (_SET_FCN_DO_RESET_DEFAULT(property_info, modifier, value))
goto do_unset;
@@ -4311,14 +4310,10 @@ static gboolean _set_fcn_ethtool(ARGS_SET_FCN)
nm_assert(nm_ethtool_id_is_feature(ethtool_id) || nm_ethtool_id_is_pause(ethtool_id));
- value = nm_strstrip_avoid_copy_a(300, value, &value_to_free);
- if (NM_IN_STRSET(value, "1", "yes", "true", "on"))
- b = TRUE;
- else if (NM_IN_STRSET(value, "0", "no", "false", "off"))
- b = FALSE;
- else if (NM_IN_STRSET(value, "", "ignore", "default"))
- goto do_unset;
- else {
+ if (!nmc_string_to_ternary_full(value,
+ NMC_STRING_TO_TERNARY_FLAGS_IGNORE_FOR_DEFAULT,
+ &t,
+ error)) {
g_set_error(error,
NM_UTILS_ERROR,
NM_UTILS_ERROR_INVALID_ARGUMENT,
@@ -4326,8 +4321,10 @@ static gboolean _set_fcn_ethtool(ARGS_SET_FCN)
value);
return FALSE;
}
+ if (t == NM_TERNARY_DEFAULT)
+ goto do_unset;
- nm_setting_option_set_boolean(setting, nm_ethtool_data[ethtool_id]->optname, b);
+ nm_setting_option_set_boolean(setting, nm_ethtool_data[ethtool_id]->optname, !!t);
return TRUE;
do_unset: