homectl: split out helper parse_tmpfs_limit_field

This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2026-01-13 17:59:54 +01:00
parent 3f9c133922
commit b078b7f055
+50 -37
View File
@@ -3726,6 +3726,48 @@ static int parse_capability_set_field(
return 0;
}
static int parse_tmpfs_limit_field(
sd_json_variant **identity,
const char *field,
const char *field_scale,
const char *arg) {
int r;
assert(identity);
assert(field);
assert(field_scale);
if (isempty(arg)) {
FOREACH_STRING(p, field, field_scale) {
r = drop_from_identity(p);
if (r < 0)
return r;
}
return 0;
}
r = parse_permyriad(arg);
if (r < 0) {
uint64_t u;
r = parse_size(arg, 1024, &u);
if (r < 0)
return log_error_errno(r, "Failed to parse %s/%s parameter: %s", field, field_scale, arg);
r = sd_json_variant_set_field_unsigned(identity, field, u);
if (r < 0)
return log_error_errno(r, "Failed to set %s field: %m", field);
return drop_from_identity(field_scale);
}
r = sd_json_variant_set_field_unsigned(identity, field_scale, UINT32_SCALE_FROM_PERMYRIAD(r));
if (r < 0)
return log_error_errno(r, "Failed to set %s field: %m", field_scale);
return drop_from_identity(field);
}
static int help(int argc, char *argv[], void *userdata) {
_cleanup_free_ char *link = NULL;
int r;
@@ -4854,49 +4896,20 @@ static int parse_argv(int argc, char *argv[]) {
case ARG_DEV_SHM_LIMIT: {
const char *field =
c == ARG_TMP_LIMIT ? "tmpLimit" :
c == ARG_DEV_SHM_LIMIT ? "devShmLimit" : NULL;
c == ARG_DEV_SHM_LIMIT ? "devShmLimit" :
NULL;
const char *field_scale =
c == ARG_TMP_LIMIT ? "tmpLimitScale" :
c == ARG_DEV_SHM_LIMIT ? "devShmLimitScale" : NULL;
c == ARG_DEV_SHM_LIMIT ? "devShmLimitScale" :
NULL;
assert(field);
assert(field_scale);
if (isempty(optarg)) {
r = drop_from_identity(field);
if (r < 0)
return r;
r = drop_from_identity(field_scale);
if (r < 0)
return r;
break;
}
r = parse_permyriad(optarg);
if (r < 0) {
uint64_t u;
r = parse_size(optarg, 1024, &u);
if (r < 0)
return log_error_errno(r, "Failed to parse %s/%s parameter: %s", field, field_scale, optarg);
r = sd_json_variant_set_field_unsigned(match_identity ?: &arg_identity_extra, field, u);
if (r < 0)
return log_error_errno(r, "Failed to set %s field: %m", field);
r = drop_from_identity(field_scale);
if (r < 0)
return r;
} else {
r = sd_json_variant_set_field_unsigned(match_identity ?: &arg_identity_extra, field_scale, UINT32_SCALE_FROM_PERMYRIAD(r));
if (r < 0)
return log_error_errno(r, "Failed to set %s field: %m", field_scale);
r = drop_from_identity(field);
if (r < 0)
return r;
}
r = parse_tmpfs_limit_field(match_identity ?: &arg_identity_extra,
field, field_scale, optarg);
if (r < 0)
return r;
break;
}