]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
homectl: split out helpers parse_uid_field
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 10 Dec 2025 14:46:38 +0000 (15:46 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 13 Jan 2026 16:59:54 +0000 (17:59 +0100)
Yet another very similar function, but without generics it's hard to deduplicate
those.

src/home/homectl.c

index 06bb8e82b473c18836d29be9219ba3120fa56f5c..6112a3a07c4f909249589391c78c0464dd5c158f 100644 (file)
@@ -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: {