#include "dhcp-client-id-internal.h"
#include "dhcp-server-internal.h"
+#include "json.h"
#include "time-util.h"
typedef struct sd_dhcp_server_lease {
int dhcp_server_cleanup_expired_leases(sd_dhcp_server *server);
sd_dhcp_server_lease* dhcp_server_get_static_lease(sd_dhcp_server *server, const DHCPRequest *req);
+
+int dhcp_server_bound_leases_append_json(sd_dhcp_server *server, JsonVariant **v);
+int dhcp_server_static_leases_append_json(sd_dhcp_server *server, JsonVariant **v);
TAKE_PTR(lease);
return 0;
}
+
+static int dhcp_server_lease_append_json(sd_dhcp_server_lease *lease, JsonVariant **ret) {
+ assert(lease);
+ assert(ret);
+
+ return json_build(ret,
+ JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR_BYTE_ARRAY("ClientId", lease->client_id.raw, lease->client_id.size),
+ JSON_BUILD_PAIR_IN4_ADDR_NON_NULL("Address", &(struct in_addr) { .s_addr = lease->address }),
+ JSON_BUILD_PAIR_STRING_NON_EMPTY("Hostname", lease->hostname)));
+}
+
+int dhcp_server_bound_leases_append_json(sd_dhcp_server *server, JsonVariant **v) {
+ _cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
+ sd_dhcp_server_lease *lease;
+ int r;
+
+ assert(server);
+ assert(v);
+
+ HASHMAP_FOREACH(lease, server->bound_leases_by_client_id) {
+ _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
+
+ r = dhcp_server_lease_append_json(lease, &w);
+ if (r < 0)
+ return r;
+
+ r = json_variant_merge_objectb(&w,
+ JSON_BUILD_OBJECT(
+ JSON_BUILD_PAIR_UNSIGNED("ExpirationUSec", lease->expiration)));
+ if (r < 0)
+ return r;
+
+ r = json_variant_append_array(&array, w);
+ if (r < 0)
+ return r;
+ }
+
+ return json_variant_set_field_non_null(v, "Leases", array);
+}
+
+int dhcp_server_static_leases_append_json(sd_dhcp_server *server, JsonVariant **v) {
+ _cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
+ sd_dhcp_server_lease *lease;
+ int r;
+
+ assert(server);
+ assert(v);
+
+ HASHMAP_FOREACH(lease, server->static_leases_by_client_id) {
+ _cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
+
+ r = dhcp_server_lease_append_json(lease, &w);
+ if (r < 0)
+ return r;
+
+ r = json_variant_append_array(&array, w);
+ if (r < 0)
+ return r;
+ }
+
+ return json_variant_set_field_non_null(v, "StaticLeases", array);
+}
return json_variant_set_field_non_null(v, "NDisc", w);
}
-static int dhcp_server_offered_leases_append_json(Link *link, JsonVariant **v) {
- _cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
- sd_dhcp_server_lease *lease;
- int r;
-
- assert(link);
- assert(v);
-
- if (!link->dhcp_server)
- return 0;
-
- HASHMAP_FOREACH(lease, link->dhcp_server->bound_leases_by_client_id) {
- struct in_addr address = { .s_addr = lease->address };
-
- r = json_variant_append_arrayb(
- &array,
- JSON_BUILD_OBJECT(
- JSON_BUILD_PAIR_BYTE_ARRAY(
- "ClientId",
- lease->client_id.raw,
- lease->client_id.size),
- JSON_BUILD_PAIR_IN4_ADDR_NON_NULL("Address", &address),
- JSON_BUILD_PAIR_STRING_NON_EMPTY("Hostname", lease->hostname),
- JSON_BUILD_PAIR_FINITE_USEC(
- "ExpirationUSec", lease->expiration)));
- if (r < 0)
- return r;
- }
-
- return json_variant_set_field_non_null(v, "Leases", array);
-}
-
-static int dhcp_server_static_leases_append_json(Link *link, JsonVariant **v) {
- _cleanup_(json_variant_unrefp) JsonVariant *array = NULL;
- sd_dhcp_server_lease *lease;
- int r;
-
- assert(link);
- assert(v);
-
- if (!link->dhcp_server)
- return 0;
-
- HASHMAP_FOREACH(lease, link->dhcp_server->static_leases_by_client_id) {
- struct in_addr address = { .s_addr = lease->address };
-
- r = json_variant_append_arrayb(
- &array,
- JSON_BUILD_OBJECT(
- JSON_BUILD_PAIR_BYTE_ARRAY(
- "ClientId",
- lease->client_id.raw,
- lease->client_id.size),
- JSON_BUILD_PAIR_IN4_ADDR_NON_NULL("Address", &address)));
- if (r < 0)
- return r;
- }
-
- return json_variant_set_field_non_null(v, "StaticLeases", array);
-}
-
static int dhcp_server_append_json(Link *link, JsonVariant **v) {
_cleanup_(json_variant_unrefp) JsonVariant *w = NULL;
int r;
if (r < 0)
return r;
- r = dhcp_server_offered_leases_append_json(link, &w);
+ r = dhcp_server_bound_leases_append_json(link->dhcp_server, &w);
if (r < 0)
return r;
- r = dhcp_server_static_leases_append_json(link, &w);
+ r = dhcp_server_static_leases_append_json(link->dhcp_server, &w);
if (r < 0)
return r;