From: Zbigniew Jędrzejewski-Szmek Date: Tue, 9 Feb 2021 15:06:36 +0000 (+0100) Subject: tree-wide: propagate error code from _from_string() functions X-Git-Tag: v248-rc1~166^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7211c853c26554ad1f58c2cfa1d5a0bfc059bf15;p=thirdparty%2Fsystemd.git tree-wide: propagate error code from _from_string() functions Now that we know we have something useful, no need to make an answer up. --- diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index 3b953ac4720..c25d11e0de3 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -1574,7 +1574,7 @@ static int dump_exit_status(int argc, char *argv[], void *userdata) { status = exit_status_from_string(argv[i]); if (status < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid exit status \"%s\".", argv[i]); + return log_error_errno(status, "Invalid exit status \"%s\".", argv[i]); assert(status >= 0 && (size_t) status < ELEMENTSOF(exit_status_mappings)); r = table_add_many(table, diff --git a/src/basic/log.c b/src/basic/log.c index ff501af5699..b9817419ad9 100644 --- a/src/basic/log.c +++ b/src/basic/log.c @@ -1085,7 +1085,7 @@ int log_set_target_from_string(const char *e) { t = log_target_from_string(e); if (t < 0) - return -EINVAL; + return t; log_set_target(t); return 0; @@ -1096,7 +1096,7 @@ int log_set_max_level_from_string(const char *e) { t = log_level_from_string(e); if (t < 0) - return -EINVAL; + return t; log_set_max_level(t); return 0; diff --git a/src/basic/unit-name.c b/src/basic/unit-name.c index c1529bbeedf..532f8fa048c 100644 --- a/src/basic/unit-name.c +++ b/src/basic/unit-name.c @@ -252,7 +252,7 @@ int unit_name_build(const char *prefix, const char *instance, const char *suffix type = unit_type_from_string(suffix + 1); if (type < 0) - return -EINVAL; + return type; return unit_name_build_from_type(prefix, instance, type, ret); } diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c index 6f309feb236..a8b438cc82a 100644 --- a/src/core/dbus-cgroup.c +++ b/src/core/dbus-cgroup.c @@ -1452,7 +1452,7 @@ int bus_cgroup_set_property( p = cgroup_device_policy_from_string(policy); if (p < 0) - return -EINVAL; + return p; if (!UNIT_WRITE_FLAGS_NOOP(flags)) { c->device_policy = p; diff --git a/src/core/service.c b/src/core/service.c index da4b8d72590..df3ed05cfc6 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -2762,14 +2762,14 @@ static int service_deserialize_exec_command( case STATE_EXEC_COMMAND_TYPE: id = service_exec_command_from_string(arg); if (id < 0) - return -EINVAL; + return id; state = STATE_EXEC_COMMAND_INDEX; break; case STATE_EXEC_COMMAND_INDEX: r = safe_atou(arg, &idx); if (r < 0) - return -EINVAL; + return r; state = STATE_EXEC_COMMAND_PATH; break; diff --git a/src/escape/escape.c b/src/escape/escape.c index a2fdce790ee..3178f9b1724 100644 --- a/src/escape/escape.c +++ b/src/escape/escape.c @@ -82,17 +82,16 @@ static int parse_argv(int argc, char *argv[]) { case ARG_VERSION: return version(); - case ARG_SUFFIX: - - if (unit_type_from_string(optarg) < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Invalid unit suffix type %s.", optarg); + case ARG_SUFFIX: { + UnitType t = unit_type_from_string(optarg); + if (t < 0) + return log_error_errno(t, "Invalid unit suffix type \"%s\".", optarg); arg_suffix = optarg; break; + } case ARG_TEMPLATE: - if (!unit_name_is_valid(optarg, UNIT_NAME_TEMPLATE)) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Template name %s is not valid.", optarg); diff --git a/src/fstab-generator/fstab-generator.c b/src/fstab-generator/fstab-generator.c index 2318b65b0ed..b8862f0793d 100644 --- a/src/fstab-generator/fstab-generator.c +++ b/src/fstab-generator/fstab-generator.c @@ -888,7 +888,7 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat if (value) { m = volatile_mode_from_string(value); if (m < 0) - log_warning("Failed to parse systemd.volatile= argument: %s", value); + log_warning_errno(m, "Failed to parse systemd.volatile= argument: %s", value); else arg_volatile_mode = m; } else diff --git a/src/home/homectl.c b/src/home/homectl.c index 176f041114c..bf35fa03f0d 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -2393,7 +2393,7 @@ static int parse_argv(int argc, char *argv[]) { l = rlimit_from_string_harder(field); if (l < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown resource limit type: %s", field); + return log_error_errno(l, "Unknown resource limit type: %s", field); if (isempty(eq + 1)) { /* Remove only the specific rlimit */ diff --git a/src/journal-remote/journal-remote-main.c b/src/journal-remote/journal-remote-main.c index 972c13566f6..b9e793c08cb 100644 --- a/src/journal-remote/journal-remote-main.c +++ b/src/journal-remote/journal-remote-main.c @@ -961,16 +961,14 @@ static int parse_argv(int argc, char *argv[]) { case ARG_SPLIT_MODE: arg_split_mode = journal_write_split_mode_from_string(optarg); if (arg_split_mode == _JOURNAL_WRITE_SPLIT_INVALID) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Invalid split mode: %s", optarg); + return log_error_errno(arg_split_mode, "Invalid split mode: %s", optarg); break; case ARG_COMPRESS: if (optarg) { r = parse_boolean(optarg); if (r < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Failed to parse --compress= parameter."); + return log_error_errno(r, "Failed to parse --compress= parameter."); arg_compress = !!r; } else diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 94fc3472bec..20b75846435 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -565,7 +565,7 @@ static int parse_argv(int argc, char *argv[]) { arg_output = output_mode_from_string(optarg); if (arg_output < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Unknown output format '%s'.", optarg); + return log_error_errno(arg_output, "Unknown output format '%s'.", optarg); if (IN_SET(arg_output, OUTPUT_EXPORT, OUTPUT_JSON, OUTPUT_JSON_PRETTY, OUTPUT_JSON_SSE, OUTPUT_JSON_SEQ, OUTPUT_CAT)) arg_quiet = true; @@ -835,7 +835,7 @@ static int parse_argv(int argc, char *argv[]) { to = log_level_from_string(dots + 2); if (from < 0 || to < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + return log_error_errno(from < 0 ? from : to, "Failed to parse log level range %s", optarg); arg_priorities = 0; @@ -853,8 +853,7 @@ static int parse_argv(int argc, char *argv[]) { p = log_level_from_string(optarg); if (p < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Unknown log level %s", optarg); + return log_error_errno(p, "Unknown log level %s", optarg); arg_priorities = 0; @@ -885,8 +884,7 @@ static int parse_argv(int argc, char *argv[]) { num = log_facility_unshifted_from_string(fac); if (num < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Bad --facility= argument \"%s\".", fac); + return log_error_errno(num, "Bad --facility= argument \"%s\".", fac); if (set_ensure_put(&arg_facilities, NULL, INT_TO_PTR(num)) < 0) return log_oom(); diff --git a/src/journal/journald-context.c b/src/journal/journald-context.c index f67013e80ce..58151aa03db 100644 --- a/src/journal/journald-context.c +++ b/src/journal/journald-context.c @@ -368,7 +368,7 @@ static int client_context_read_log_level_max( ll = log_level_from_string(value); if (ll < 0) - return -EINVAL; + return ll; c->log_level_max = ll; return 0; diff --git a/src/libsystemd/sd-device/device-private.c b/src/libsystemd/sd-device/device-private.c index 47ea04921e5..e37575d3b93 100644 --- a/src/libsystemd/sd-device/device-private.c +++ b/src/libsystemd/sd-device/device-private.c @@ -204,7 +204,7 @@ static int device_set_action(sd_device *device, const char *action) { a = device_action_from_string(action); if (a < 0) - return -EINVAL; + return a; r = device_add_property_internal(device, "ACTION", action); if (r < 0) diff --git a/src/login/loginctl.c b/src/login/loginctl.c index f61f9eca04e..918e05e1cdd 100644 --- a/src/login/loginctl.c +++ b/src/login/loginctl.c @@ -1371,8 +1371,7 @@ static int parse_argv(int argc, char *argv[]) { arg_output = output_mode_from_string(optarg); if (arg_output < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Unknown output '%s'.", optarg); + return log_error_errno(arg_output, "Unknown output '%s'.", optarg); if (OUTPUT_MODE_IS_JSON(arg_output)) arg_legend = false; @@ -1403,8 +1402,7 @@ static int parse_argv(int argc, char *argv[]) { arg_signal = signal_from_string(optarg); if (arg_signal < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Failed to parse signal string %s.", optarg); + return log_error_errno(arg_signal, "Failed to parse signal string %s.", optarg); break; case 'H': diff --git a/src/network/generator/network-generator.c b/src/network/generator/network-generator.c index 940a718d207..492bb68e320 100644 --- a/src/network/generator/network-generator.c +++ b/src/network/generator/network-generator.c @@ -313,7 +313,7 @@ static int network_set_dhcp_type(Context *context, const char *ifname, const cha t = dracut_dhcp_type_from_string(dhcp_type); if (t < 0) - return -EINVAL; + return t; network = network_get(context, ifname); if (!network) { diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index c1883208720..b52a5f2e26f 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -1754,7 +1754,6 @@ int config_parse_duplicate_address_detection( Network *network = userdata; _cleanup_(address_free_or_set_invalidp) Address *n = NULL; - AddressFamily a; int r; assert(filename); @@ -1783,14 +1782,14 @@ int config_parse_duplicate_address_detection( return 0; } - a = duplicate_address_detection_address_family_from_string(rvalue); + AddressFamily a = duplicate_address_detection_address_family_from_string(rvalue); if (a < 0) { - log_syntax(unit, LOG_WARNING, filename, line, SYNTHETIC_ERRNO(EINVAL), + log_syntax(unit, LOG_WARNING, filename, line, a, "Failed to parse %s=, ignoring: %s", lvalue, rvalue); return 0; } - n->duplicate_address_detection = a; + TAKE_PTR(n); return 0; } diff --git a/src/network/networkd-fdb.c b/src/network/networkd-fdb.c index c18e4d81d99..4cd430e8aef 100644 --- a/src/network/networkd-fdb.c +++ b/src/network/networkd-fdb.c @@ -377,7 +377,6 @@ int config_parse_fdb_ntf_flags( _cleanup_(fdb_entry_free_or_set_invalidp) FdbEntry *fdb_entry = NULL; Network *network = userdata; - NeighborCacheEntryFlags f; int r; assert(filename); @@ -390,9 +389,9 @@ int config_parse_fdb_ntf_flags( if (r < 0) return log_oom(); - f = fdb_ntf_flags_from_string(rvalue); + NeighborCacheEntryFlags f = fdb_ntf_flags_from_string(rvalue); if (f < 0) { - log_syntax(unit, LOG_WARNING, filename, line, SYNTHETIC_ERRNO(EINVAL), + log_syntax(unit, LOG_WARNING, filename, line, f, "FDB failed to parse AssociatedWith=, ignoring assignment: %s", rvalue); return 0; diff --git a/src/network/wait-online/link.c b/src/network/wait-online/link.c index e820a7a20f3..f2d556f099e 100644 --- a/src/network/wait-online/link.c +++ b/src/network/wait-online/link.c @@ -130,8 +130,7 @@ int link_update_monitor(Link *l) { s = link_operstate_from_string(operstate); if (s < 0) - ret = log_link_debug_errno(l, SYNTHETIC_ERRNO(EINVAL), - "Failed to parse operational state, ignoring: %m"); + ret = log_link_debug_errno(l, s, "Failed to parse operational state, ignoring: %m"); else l->operational_state = s; } diff --git a/src/nspawn/nspawn-oci.c b/src/nspawn/nspawn-oci.c index fe5768b0222..dfa5c833c5a 100644 --- a/src/nspawn/nspawn-oci.c +++ b/src/nspawn/nspawn-oci.c @@ -205,7 +205,7 @@ static int oci_rlimit_type(const char *name, JsonVariant *v, JsonDispatchFlags f t = rlimit_from_string(z); if (t < 0) - return json_log(v, flags, SYNTHETIC_ERRNO(EINVAL), + return json_log(v, flags, t, "rlimit name unknown: %s", json_variant_string(v)); *type = t; diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c index a702af8e3bd..e1c55d05427 100644 --- a/src/nspawn/nspawn.c +++ b/src/nspawn/nspawn.c @@ -1280,8 +1280,7 @@ static int parse_argv(int argc, char *argv[]) { arg_kill_signal = signal_from_string(optarg); if (arg_kill_signal < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Cannot parse signal: %s", optarg); + return log_error_errno(arg_kill_signal, "Cannot parse signal: %s", optarg); arg_settings_mask |= SETTING_KILL_SIGNAL; break; @@ -1443,8 +1442,7 @@ static int parse_argv(int argc, char *argv[]) { rl = rlimit_from_string_harder(name); if (rl < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Unknown resource limit: %s", name); + return log_error_errno(rl, "Unknown resource limit: %s", name); if (!arg_rlimit[rl]) { arg_rlimit[rl] = new0(struct rlimit, 1); @@ -1490,7 +1488,7 @@ static int parse_argv(int argc, char *argv[]) { arg_resolv_conf = resolv_conf_mode_from_string(optarg); if (arg_resolv_conf < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + return log_error_errno(arg_resolv_conf, "Failed to parse /etc/resolv.conf mode: %s", optarg); arg_settings_mask |= SETTING_RESOLV_CONF; @@ -1504,7 +1502,7 @@ static int parse_argv(int argc, char *argv[]) { arg_timezone = timezone_mode_from_string(optarg); if (arg_timezone < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + return log_error_errno(arg_timezone, "Failed to parse /etc/localtime mode: %s", optarg); arg_settings_mask |= SETTING_TIMEZONE; diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c index 338935b3ec6..52158a66e57 100644 --- a/src/oom/oomd-manager.c +++ b/src/oom/oomd-manager.c @@ -33,7 +33,7 @@ static int managed_oom_mode(const char *name, JsonVariant *v, JsonDispatchFlags m = managed_oom_mode_from_string(s); if (m < 0) - return json_log(v, flags, SYNTHETIC_ERRNO(EINVAL), "%s is not a valid ManagedOOMMode", s); + return json_log(v, flags, m, "%s is not a valid ManagedOOMMode", s); *mode = m; return 0; diff --git a/src/resolve/resolvectl.c b/src/resolve/resolvectl.c index 318528b419c..71854245025 100644 --- a/src/resolve/resolvectl.c +++ b/src/resolve/resolvectl.c @@ -566,8 +566,7 @@ static int resolve_rfc4501(sd_bus *bus, const char *name) { r = dns_class_from_string(t); if (r < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Unknown DNS class %s.", t); + return log_error_errno(r, "Unknown DNS class %s.", t); class = r; @@ -595,8 +594,7 @@ static int resolve_rfc4501(sd_bus *bus, const char *name) { r = dns_type_from_string(t); if (r < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Unknown DNS type %s.", t); + return log_error_errno(r, "Unknown DNS type %s: %m", t); type = r; @@ -2737,10 +2735,9 @@ static int compat_parse_argv(int argc, char *argv[]) { } r = dns_type_from_string(optarg); - if (r < 0) { - log_error("Failed to parse RR record type %s", optarg); - return r; - } + if (r < 0) + return log_error_errno(r, "Failed to parse RR record type %s: %m", optarg); + arg_type = (uint16_t) r; assert((int) arg_type == r); @@ -2754,10 +2751,9 @@ static int compat_parse_argv(int argc, char *argv[]) { } r = dns_class_from_string(optarg); - if (r < 0) { - log_error("Failed to parse RR record class %s", optarg); - return r; - } + if (r < 0) + return log_error_errno(r, "Failed to parse RR record class %s: %m", optarg); + arg_class = (uint16_t) r; assert((int) arg_class == r); @@ -3024,10 +3020,9 @@ static int native_parse_argv(int argc, char *argv[]) { } r = dns_type_from_string(optarg); - if (r < 0) { - log_error("Failed to parse RR record type %s", optarg); - return r; - } + if (r < 0) + return log_error_errno(r, "Failed to parse RR record type %s: %m", optarg); + arg_type = (uint16_t) r; assert((int) arg_type == r); @@ -3040,10 +3035,9 @@ static int native_parse_argv(int argc, char *argv[]) { } r = dns_class_from_string(optarg); - if (r < 0) { - log_error("Failed to parse RR record class %s", optarg); - return r; - } + if (r < 0) + return log_error_errno(r, "Failed to parse RR record class %s: %m", optarg); + arg_class = (uint16_t) r; assert((int) arg_class == r); diff --git a/src/shared/user-record.c b/src/shared/user-record.c index 6c48c56a2a7..0b07e4427ee 100644 --- a/src/shared/user-record.c +++ b/src/shared/user-record.c @@ -427,11 +427,11 @@ static int json_dispatch_rlimits(const char *name, JsonVariant *variant, JsonDis p = startswith(key, "RLIMIT_"); if (!p) - l = -1; + l = -SYNTHETIC_ERRNO(EINVAL); else l = rlimit_from_string(p); if (l < 0) - return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "Resource limit '%s' not known.", key); + return json_log(variant, flags, l, "Resource limit '%s' not known.", key); if (!json_variant_is_object(value)) return json_log(value, flags, SYNTHETIC_ERRNO(EINVAL), "Resource limit '%s' has invalid value.", key); @@ -661,7 +661,7 @@ int json_dispatch_user_disposition(const char *name, JsonVariant *variant, JsonD k = user_disposition_from_string(json_variant_string(variant)); if (k < 0) - return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "Disposition type '%s' not known.", json_variant_string(variant)); + return json_log(variant, flags, k, "Disposition type '%s' not known.", json_variant_string(variant)); *disposition = k; return 0; @@ -680,7 +680,7 @@ static int json_dispatch_storage(const char *name, JsonVariant *variant, JsonDis k = user_storage_from_string(json_variant_string(variant)); if (k < 0) - return json_log(variant, flags, SYNTHETIC_ERRNO(EINVAL), "Storage type '%s' not known.", json_variant_string(variant)); + return json_log(variant, flags, k, "Storage type '%s' not known.", json_variant_string(variant)); *storage = k; return 0; diff --git a/src/shared/volatile-util.c b/src/shared/volatile-util.c index 3323897a4ca..5138edbd101 100644 --- a/src/shared/volatile-util.c +++ b/src/shared/volatile-util.c @@ -27,7 +27,7 @@ int query_volatile_mode(VolatileMode *ret) { m = volatile_mode_from_string(mode); if (m < 0) - return -EINVAL; + return m; *ret = m; } else diff --git a/src/systemctl/systemctl-log-setting.c b/src/systemctl/systemctl-log-setting.c index 64984e4a81c..9a95c7dab46 100644 --- a/src/systemctl/systemctl-log-setting.c +++ b/src/systemctl/systemctl-log-setting.c @@ -30,9 +30,9 @@ static int log_setting_internal(sd_bus *bus, const BusLocator* bloc, const char if (value) { if (level) { - if (log_level_from_string(value) < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "\"%s\" is not a valid log level.", value); + r = log_level_from_string(value); + if (r < 0) + return log_error_errno(r, "\"%s\" is not a valid log level.", value); } r = bus_set_property(bus, bloc, diff --git a/src/systemctl/systemctl-show.c b/src/systemctl/systemctl-show.c index 3dde305e135..9b04b698be1 100644 --- a/src/systemctl/systemctl-show.c +++ b/src/systemctl/systemctl-show.c @@ -2040,8 +2040,7 @@ int show(int argc, char *argv[], void *userdata) { show_mode = systemctl_show_mode_from_string(argv[0]); if (show_mode < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), - "Invalid argument."); + return log_error_errno(show_mode, "Invalid argument."); if (show_mode == SYSTEMCTL_SHOW_HELP && argc <= 1) return log_error_errno(SYNTHETIC_ERRNO(EINVAL), diff --git a/src/systemctl/systemctl-util.c b/src/systemctl/systemctl-util.c index a854107cc8c..89c342a0b10 100644 --- a/src/systemctl/systemctl-util.c +++ b/src/systemctl/systemctl-util.c @@ -143,7 +143,7 @@ int get_state_one_unit(sd_bus *bus, const char *unit, UnitActiveState *ret_activ state = unit_active_state_from_string(buf); if (state < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid unit state '%s' for: %s", buf, unit); + return log_error_errno(state, "Invalid unit state '%s' for: %s", buf, unit); *ret_active_state = state; return 0; diff --git a/src/volatile-root/volatile-root.c b/src/volatile-root/volatile-root.c index 242ef81ecf7..1a6593f9c46 100644 --- a/src/volatile-root/volatile-root.c +++ b/src/volatile-root/volatile-root.c @@ -132,7 +132,7 @@ static int run(int argc, char *argv[]) { /* The kernel command line always wins. However if nothing was set there, the argument passed here wins instead. */ m = volatile_mode_from_string(argv[1]); if (m < 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Couldn't parse volatile mode: %s", argv[1]); + return log_error_errno(m, "Couldn't parse volatile mode: %s", argv[1]); } if (argc < 3)