From: Yu Watanabe Date: Tue, 12 Mar 2024 05:07:54 +0000 (+0900) Subject: sd-dhcp-server: rearrange the parser of the leases file X-Git-Tag: v256-rc1~508^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d47f83302e25f020e7ec4051c8e0cb49d4c3a14a;p=thirdparty%2Fsystemd.git sd-dhcp-server: rearrange the parser of the leases file No functional changes, just refactoring and preparation for later commits. --- diff --git a/src/libsystemd-network/sd-dhcp-server-lease.c b/src/libsystemd-network/sd-dhcp-server-lease.c index 52abb87c1fa..b518b474091 100644 --- a/src/libsystemd-network/sd-dhcp-server-lease.c +++ b/src/libsystemd-network/sd-dhcp-server-lease.c @@ -411,34 +411,44 @@ typedef struct SavedInfo { JsonVariant *leases; } SavedInfo; -static int dhcp_server_dispatch_leases(sd_dhcp_server *server, JsonVariant *v) { - static const JsonDispatch dispatch_table[] = { - { "BootID", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(SavedInfo, boot_id), JSON_MANDATORY }, - { "Leases", JSON_VARIANT_ARRAY, json_dispatch_variant_noref, offsetof(SavedInfo, leases), JSON_MANDATORY }, - {} - }; +static void saved_info_done(SavedInfo *info) { + if (!info) + return; - SavedInfo info = {}; - sd_id128_t boot_id; + json_variant_unref(info->leases); +} + +static int load_leases_file(int dir_fd, const char *path, SavedInfo *ret) { + _cleanup_(json_variant_unrefp) JsonVariant *v = NULL; int r; - r = json_dispatch(v, dispatch_table, JSON_ALLOW_EXTENSIONS, &info); - if (r < 0) - return r; + assert(dir_fd >= 0 || dir_fd == AT_FDCWD); + assert(path); + assert(ret); - r = sd_id128_get_boot(&boot_id); + r = json_parse_file_at( + /* f = */ NULL, + dir_fd, + path, + /* flags = */ 0, + &v, + /* ret_line = */ NULL, + /* ret_column = */ NULL); if (r < 0) return r; - JsonVariant *i; - JSON_VARIANT_ARRAY_FOREACH(i, info.leases) - RET_GATHER(r, json_dispatch_dhcp_lease(server, i, /* use_boottime = */ sd_id128_equal(info.boot_id, boot_id))); + static const JsonDispatch dispatch_lease_file_table[] = { + { "BootID", JSON_VARIANT_STRING, json_dispatch_id128, offsetof(SavedInfo, boot_id), JSON_MANDATORY }, + { "Leases", JSON_VARIANT_ARRAY, json_dispatch_variant, offsetof(SavedInfo, leases), JSON_MANDATORY }, + {} + }; - return r; + return json_dispatch(v, dispatch_lease_file_table, JSON_ALLOW_EXTENSIONS, ret); } int dhcp_server_load_leases(sd_dhcp_server *server) { - _cleanup_(json_variant_unrefp) JsonVariant *v = NULL; + _cleanup_(saved_info_done) SavedInfo info = {}; + sd_id128_t boot_id; size_t n, m; int r; @@ -448,22 +458,21 @@ int dhcp_server_load_leases(sd_dhcp_server *server) { if (!server->lease_file) return 0; - r = json_parse_file_at( - /* f = */ NULL, - server->lease_dir_fd, - server->lease_file, - /* flags = */ 0, - &v, - /* ret_line = */ NULL, - /* ret_column = */ NULL); + r = load_leases_file(server->lease_dir_fd, server->lease_file, &info); if (r == -ENOENT) return 0; if (r < 0) return r; + r = sd_id128_get_boot(&boot_id); + if (r < 0) + return r; + n = hashmap_size(server->bound_leases_by_client_id); - r = dhcp_server_dispatch_leases(server, v); + JsonVariant *i; + JSON_VARIANT_ARRAY_FOREACH(i, info.leases) + RET_GATHER(r, json_dispatch_dhcp_lease(server, i, /* use_boottime = */ sd_id128_equal(info.boot_id, boot_id))); m = hashmap_size(server->bound_leases_by_client_id); assert(m >= n);