From: Zbigniew Jędrzejewski-Szmek Date: Wed, 10 Dec 2025 14:46:38 +0000 (+0100) Subject: homectl: split out helpers parse_uid_field X-Git-Tag: v260-rc1~391^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed646a8d476b201b281274956d9e894c5e77f884;p=thirdparty%2Fsystemd.git homectl: split out helpers parse_uid_field Yet another very similar function, but without generics it's hard to deduplicate those. --- diff --git a/src/home/homectl.c b/src/home/homectl.c index 06bb8e82b47..6112a3a07c4 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -3338,6 +3338,34 @@ static int parse_time_field(sd_json_variant **identity, const char *field, const return 0; } +static int parse_uid_field(sd_json_variant **identity, const char *field, const char *arg) { + uid_t uid; + int r; + + assert(identity); + assert(field); + + if (isempty(arg)) + return drop_from_identity(field); + + r = parse_uid(arg, &uid); + if (r < 0) + return log_error_errno(r, "Failed to parse UID '%s'.", arg); + + const char *bad_range = + uid_is_system(uid) ? "in system range" : + uid_is_greeter(uid) ? "in greeter range" : + uid_is_dynamic(uid) ? "in dynamic ragne" : + uid == UID_NOBODY ? "nobody UID" : NULL; + if (bad_range) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "UID "UID_FMT" is %s, refusing.", uid, bad_range); + + r = sd_json_variant_set_field_unsigned(identity, field, uid); + if (r < 0) + return log_error_errno(r, "Failed to set %s field: %m", field); + return 0; +} + static int parse_nice_field(sd_json_variant **identity, const char *field, const char *arg) { int nc, r; @@ -4421,36 +4449,11 @@ static int parse_argv(int argc, char *argv[]) { return r; break; - case 'u': { - uid_t uid; - - if (isempty(optarg)) { - r = drop_from_identity("uid"); - if (r < 0) - return r; - - break; - } - - r = parse_uid(optarg, &uid); - if (r < 0) - return log_error_errno(r, "Failed to parse UID '%s'.", optarg); - - if (uid_is_system(uid)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "UID " UID_FMT " is in system range, refusing.", uid); - if (uid_is_greeter(uid)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "UID " UID_FMT " is in greeter range, refusing.", uid); - if (uid_is_dynamic(uid)) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "UID " UID_FMT " is in dynamic range, refusing.", uid); - if (uid == UID_NOBODY) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "UID " UID_FMT " is nobody UID, refusing.", uid); - - r = sd_json_variant_set_field_unsigned(&arg_identity_extra, "uid", uid); + case 'u': + r = parse_uid_field(&arg_identity_extra, "uid", optarg); if (r < 0) - return log_error_errno(r, "Failed to set realm field: %m"); - + return r; break; - } case 'k': case ARG_IMAGE_PATH: {