From: Zbigniew Jędrzejewski-Szmek Date: Wed, 10 Dec 2025 14:13:15 +0000 (+0100) Subject: homectl: split out helpers that extend parse_string_field X-Git-Tag: v260-rc1~391^2~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5db63f9de83e4e3fa2da956247459f8888c03e01;p=thirdparty%2Fsystemd.git homectl: split out helpers that extend parse_string_field --- diff --git a/src/home/homectl.c b/src/home/homectl.c index cffafa5f1bf..31ec35c1493 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -3136,6 +3136,69 @@ static int parse_string_field(sd_json_variant **identity, const char *field, con return 0; } +static int parse_home_directory_field(sd_json_variant **identity, const char *field, const char *arg) { + _cleanup_free_ char *hd = NULL; + int r; + + assert(identity); + assert(field); + + if (!isempty(arg)) { + r = parse_path_argument(arg, false, &hd); + if (r < 0) + return r; + + if (!valid_home(hd)) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Home directory '%s' not valid.", hd); + } + + return parse_string_field(identity, field, hd); +} + +static int parse_realm_field(sd_json_variant **identity, const char *field, const char *arg) { + int r; + + assert(identity); + assert(field); + + if (!isempty(arg)) { + r = dns_name_is_valid(arg); + if (r < 0) + return log_error_errno(r, "Failed to determine whether realm '%s' is a valid DNS domain: %m", arg); + if (r == 0) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Realm '%s' is not a valid DNS domain.", arg); + } + + return parse_string_field(identity, field, arg); +} + +static int parse_path_field(sd_json_variant **identity, const char *field, const char *arg) { + _cleanup_free_ char *v = NULL; + int r; + + assert(identity); + assert(field); + + if (!isempty(arg)) { + r = parse_path_argument(arg, false, &v); + if (r < 0) + return r; + } + + return parse_string_field(identity, field, v); +} + +static int parse_filename_field(sd_json_variant **identity, const char *field, const char *arg) { + assert(identity); + assert(field); + + if (!isempty(arg) && !filename_is_valid(arg)) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "Parameter for %s field not a valid filename: %s", field, arg); + + return parse_string_field(identity, field, arg); +} + static int parse_unsigned_field(sd_json_variant **identity, const char *field, const char *arg) { int r; @@ -3782,49 +3845,16 @@ static int parse_argv(int argc, char *argv[]) { break; } - case 'd': { - _cleanup_free_ char *hd = NULL; - - if (isempty(optarg)) { - r = drop_from_identity("homeDirectory"); - if (r < 0) - return r; - - break; - } - - r = parse_path_argument(optarg, false, &hd); + case 'd': + r = parse_home_directory_field(&arg_identity_extra, "homeDirectory", optarg); if (r < 0) return r; - - if (!valid_home(hd)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Home directory '%s' not valid.", hd); - - r = sd_json_variant_set_field_string(&arg_identity_extra, "homeDirectory", hd); - if (r < 0) - return log_error_errno(r, "Failed to set homeDirectory field: %m"); - break; - } case ARG_REALM: - if (isempty(optarg)) { - r = drop_from_identity("realm"); - if (r < 0) - return r; - - break; - } - - r = dns_name_is_valid(optarg); + r = parse_realm_field(&arg_identity_extra, "realm", optarg); if (r < 0) - return log_error_errno(r, "Failed to determine whether realm '%s' is a valid DNS domain: %m", optarg); - if (r == 0) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Realm '%s' is not a valid DNS domain.", optarg); - - r = sd_json_variant_set_field_string(&arg_identity_extra, "realm", optarg); - if (r < 0) - return log_error_errno(r, "Failed to set realm field: %m"); + return r; break; case ARG_EMAIL_ADDRESS: @@ -4001,24 +4031,10 @@ static int parse_argv(int argc, char *argv[]) { case 'k': case ARG_IMAGE_PATH: { const char *field = c == 'k' ? "skeletonDirectory" : "imagePath"; - _cleanup_free_ char *v = NULL; - if (isempty(optarg)) { - r = drop_from_identity(field); - if (r < 0) - return r; - - break; - } - - r = parse_path_argument(optarg, false, &v); + r = parse_path_field(match_identity ?: &arg_identity_extra_this_machine, field, optarg); if (r < 0) return r; - - r = sd_json_variant_set_field_string(match_identity ?: &arg_identity_extra_this_machine, field, v); - if (r < 0) - return log_error_errno(r, "Failed to set %s field: %m", v); - break; } @@ -4878,21 +4894,9 @@ static int parse_argv(int argc, char *argv[]) { } case ARG_DEFAULT_AREA: - if (isempty(optarg)) { - r = drop_from_identity("defaultArea"); - if (r < 0) - return r; - - break; - } - - if (!filename_is_valid(optarg)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Parameter for default area field not valid: %s", optarg); - - r = sd_json_variant_set_field_string(match_identity ?: &arg_identity_extra, "defaultArea", optarg); + r = parse_filename_field(match_identity ?: &arg_identity_extra, "defaultArea", optarg); if (r < 0) - return log_error_errno(r, "Failed to set default area field: %m"); - + return r; break; case ARG_KEY_NAME: