From: Zbigniew Jędrzejewski-Szmek Date: Wed, 10 Dec 2025 14:29:35 +0000 (+0100) Subject: homectl: split out helpers parse_{time,timestamp}_field X-Git-Tag: v260-rc1~391^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed93b1ed14730b122d82e5670cdd27768492b998;p=thirdparty%2Fsystemd.git homectl: split out helpers parse_{time,timestamp}_field --- diff --git a/src/home/homectl.c b/src/home/homectl.c index df360a1e910..66da4de34e5 100644 --- a/src/home/homectl.c +++ b/src/home/homectl.c @@ -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; }