]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
homectl: split out helpers parse_{time,timestamp}_field
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 10 Dec 2025 14:29:35 +0000 (15:29 +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 df360a1e9102264f7e476df46b4c22fdaa75ec52..66da4de34e58d249a21333f7a3b1d8c42473c54e 100644 (file)
@@ -3298,6 +3298,46 @@ static int parse_mode_field(sd_json_variant **identity, const char *field, const
         return 0;
 }
 
+static int parse_timestamp_field(sd_json_variant **identity, const char *field, const char *arg) {
+        int r;
+
+        assert(identity);
+        assert(field);
+
+        if (isempty(arg))
+                return drop_from_identity(field);
+
+        usec_t n;
+        r = parse_timestamp(arg, &n);
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse %s parameter: %s", field, arg);
+
+        r = sd_json_variant_set_field_unsigned(identity, field, n);
+        if (r < 0)
+                return log_error_errno(r, "Failed to set %s field: %m", field);
+        return 0;
+}
+
+static int parse_time_field(sd_json_variant **identity, const char *field, const char *arg) {
+        int r;
+
+        assert(identity);
+        assert(field);
+
+        if (isempty(arg))
+                return drop_from_identity(field);
+
+        usec_t n;
+        r = parse_sec(arg, &n);
+        if (r < 0)
+                return log_error_errno(r, "Failed to parse %s parameter: %s", field, arg);
+
+        r = sd_json_variant_set_field_unsigned(identity, field, n);
+        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;
 
@@ -4348,33 +4388,11 @@ static int parse_argv(int argc, char *argv[]) {
                 case ARG_NOT_BEFORE:
                 case ARG_NOT_AFTER:
                 case 'e': {
-                        const char *field;
-                        usec_t n;
-
-                        field =           c == ARG_NOT_BEFORE ? "notBeforeUSec" :
-                                IN_SET(c, ARG_NOT_AFTER, 'e') ? "notAfterUSec" : NULL;
-
-                        assert(field);
-
-                        if (isempty(optarg)) {
-                                r = drop_from_identity(field);
-                                if (r < 0)
-                                        return r;
+                        const char *field = c == ARG_NOT_BEFORE ? "notBeforeUSec" : "notAfterUSec";
 
-                                break;
-                        }
-
-                        /* Note the minor discrepancy regarding -e parsing here: we support that for compat
-                         * reasons, and in the original useradd(8) implementation it accepts dates in the
-                         * format YYYY-MM-DD. Coincidentally, we accept dates formatted like that too, but
-                         * with greater precision. */
-                        r = parse_timestamp(optarg, &n);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to parse %s parameter: %m", field);
-
-                        r = sd_json_variant_set_field_unsigned(match_identity ?: &arg_identity_extra, field, n);
+                        r = parse_timestamp_field(match_identity ?: &arg_identity_extra, field, optarg);
                         if (r < 0)
-                                return log_error_errno(r, "Failed to set %s field: %m", field);
+                                return r;
                         break;
                 }
 
@@ -4382,32 +4400,17 @@ static int parse_argv(int argc, char *argv[]) {
                 case ARG_PASSWORD_CHANGE_MAX:
                 case ARG_PASSWORD_CHANGE_WARN:
                 case ARG_PASSWORD_CHANGE_INACTIVE: {
-                        const char *field;
-                        usec_t n;
-
-                        field =      c == ARG_PASSWORD_CHANGE_MIN ? "passwordChangeMinUSec" :
+                        const char *field =
+                                     c == ARG_PASSWORD_CHANGE_MIN ? "passwordChangeMinUSec" :
                                      c == ARG_PASSWORD_CHANGE_MAX ? "passwordChangeMaxUSec" :
                                     c == ARG_PASSWORD_CHANGE_WARN ? "passwordChangeWarnUSec" :
                                 c == ARG_PASSWORD_CHANGE_INACTIVE ? "passwordChangeInactiveUSec" :
                                                                     NULL;
-
                         assert(field);
 
-                        if (isempty(optarg)) {
-                                r = drop_from_identity(field);
-                                if (r < 0)
-                                        return r;
-
-                                break;
-                        }
-
-                        r = parse_sec(optarg, &n);
+                        r = parse_time_field(match_identity ?: &arg_identity_extra, field, optarg);
                         if (r < 0)
-                                return log_error_errno(r, "Failed to parse %s parameter: %m", field);
-
-                        r = sd_json_variant_set_field_unsigned(match_identity ?: &arg_identity_extra, field, n);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to set %s field: %m", field);
+                                return r;
                         break;
                 }
 
@@ -4450,26 +4453,11 @@ static int parse_argv(int argc, char *argv[]) {
                                  c == ARG_RATE_LIMIT_INTERVAL ? "rateLimitIntervalUSec" :
                                           c == ARG_STOP_DELAY ? "stopDelayUSec" :
                                                                 NULL;
-                        usec_t t;
-
                         assert(field);
 
-                        if (isempty(optarg)) {
-                                r = drop_from_identity(field);
-                                if (r < 0)
-                                        return r;
-
-                                break;
-                        }
-
-                        r = parse_sec(optarg, &t);
+                        r = parse_time_field(match_identity ?: &arg_identity_extra, field, optarg);
                         if (r < 0)
-                                return log_error_errno(r, "Failed to parse %s field: %s", field, optarg);
-
-                        r = sd_json_variant_set_field_unsigned(match_identity ?: &arg_identity_extra, field, t);
-                        if (r < 0)
-                                return log_error_errno(r, "Failed to set %s field: %m", field);
-
+                                return r;
                         break;
                 }