From 1420ffffc58a30bf85c4dc6ab9500401c156b8db Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Mon, 26 May 2025 16:44:13 +0200 Subject: [PATCH 1/2] udevadm-info: print the original input on error Print the original input value on error instead of the consumed string (which will be empty). Previously: $ udevadm info /dev/block/251:0 -e --attr-match='foo=\' Failed to parse key/value pair : Invalid argument $ udevadm info /dev/block/251:0 -e --attr-match='foo' Missing '=' in key/value pair (null). Now: $ build/udevadm info /dev/block/251:0 -e --attr-match='foo=\' Failed to parse key/value pair foo=\: Invalid argument (The second scenario can't be hit anymore since d89b3004da54228eb5ab2f3326a773a6e97924b9 due to an extra check before calling parse_key_value_argument().) --- src/udev/udevadm-util.c | 7 ++++--- src/udev/udevadm-util.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/udev/udevadm-util.c b/src/udev/udevadm-util.c index 09fb24f6e5..73c39f696c 100644 --- a/src/udev/udevadm-util.c +++ b/src/udev/udevadm-util.c @@ -152,8 +152,9 @@ int parse_resolve_name_timing(const char *str, ResolveNameTiming *ret) { return 1; } -int parse_key_value_argument(const char *s, bool require_value, char **key, char **value) { +int parse_key_value_argument(const char *str, bool require_value, char **key, char **value) { _cleanup_free_ char *k = NULL, *v = NULL; + const char *s = str; int r; assert(s); @@ -162,9 +163,9 @@ int parse_key_value_argument(const char *s, bool require_value, char **key, char r = extract_many_words(&s, "=", EXTRACT_DONT_COALESCE_SEPARATORS, &k, &v); if (r < 0) - return log_error_errno(r, "Failed to parse key/value pair %s: %m", s); + return log_error_errno(r, "Failed to parse key/value pair %s: %m", str); if (require_value && r < 2) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Missing '=' in key/value pair %s.", s); + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Missing '=' in key/value pair %s.", str); if (!filename_is_valid(k)) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "%s is not a valid key name", k); diff --git a/src/udev/udevadm-util.h b/src/udev/udevadm-util.h index 9b41109df8..aca4618977 100644 --- a/src/udev/udevadm-util.h +++ b/src/udev/udevadm-util.h @@ -10,6 +10,6 @@ int find_device(const char *id, const char *prefix, sd_device **ret); int find_device_with_action(const char *id, sd_device_action_t action, sd_device **ret); int parse_device_action(const char *str, sd_device_action_t *ret); int parse_resolve_name_timing(const char *str, ResolveNameTiming *ret); -int parse_key_value_argument(const char *s, bool require_value, char **key, char **value); +int parse_key_value_argument(const char *str, bool require_value, char **key, char **value); int udev_ping(usec_t timeout, bool ignore_connection_failure); int search_rules_files(char * const *a, const char *root, char ***ret); From a852f5c27d88ea74efc479ae9d0a8c0a37d0f0d7 Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Mon, 26 May 2025 16:52:33 +0200 Subject: [PATCH 2/2] udevadm-info: make the error messages slightly more consistent At least across the udevadm-info.c file. No functional changes. --- src/udev/udevadm-info.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/udev/udevadm-info.c b/src/udev/udevadm-info.c index ccfc83cce4..45c39d4c73 100644 --- a/src/udev/udevadm-info.c +++ b/src/udev/udevadm-info.c @@ -1105,7 +1105,7 @@ static int parse_argv(int argc, char *argv[]) { if (streq(optarg, "env")) /* deprecated */ arg_query = QUERY_PROPERTY; else - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "unknown query type"); + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown query type '%s'", optarg); } break; @@ -1185,7 +1185,7 @@ static int parse_argv(int argc, char *argv[]) { case ARG_ATTR_MATCH: if (!strchr(optarg, '=')) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "expect = instead of '%s'", optarg); + "Expected = instead of '%s'", optarg); r = strv_extend(&arg_attr_match, optarg); if (r < 0) @@ -1195,7 +1195,7 @@ static int parse_argv(int argc, char *argv[]) { case ARG_ATTR_NOMATCH: if (!strchr(optarg, '=')) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "expect = instead of '%s'", optarg); + "Expected = instead of '%s'", optarg); r = strv_extend(&arg_attr_nomatch, optarg); if (r < 0) @@ -1205,7 +1205,7 @@ static int parse_argv(int argc, char *argv[]) { case ARG_PROPERTY_MATCH: if (!strchr(optarg, '=')) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "expect = instead of '%s'", optarg); + "Expected = instead of '%s'", optarg); r = strv_extend(&arg_property_match, optarg); if (r < 0)