]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-dhcp-server: rearrange the parser of the leases file
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 12 Mar 2024 05:07:54 +0000 (14:07 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 14 Mar 2024 19:15:10 +0000 (04:15 +0900)
No functional changes, just refactoring and preparation for later
commits.

src/libsystemd-network/sd-dhcp-server-lease.c

index 52abb87c1fadb60b84455e6e6239dd0804139cda..b518b474091e0e5b5c31c7b41721f6744d1127f6 100644 (file)
@@ -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);