]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
homectl: split out helpers that extend parse_string_field
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 10 Dec 2025 14:13:15 +0000 (15:13 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 13 Jan 2026 16:59:54 +0000 (17:59 +0100)
src/home/homectl.c

index cffafa5f1bf1cbe2ffe9152c711a34ea0d218a9e..31ec35c14935220cdca8abad95039462aff315ec 100644 (file)
@@ -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: