From: Michael Tremer Date: Sat, 11 Feb 2023 17:51:28 +0000 (+0000) Subject: networkd: Store a reference to the daemon in zone X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Fnetwork.git;a=commitdiff_plain;h=dd84704eadbf2f55f650b5879095bafad7ffec30 networkd: Store a reference to the daemon in zone Signed-off-by: Michael Tremer --- diff --git a/src/networkd/daemon.c b/src/networkd/daemon.c index 9b9bf738..8122f581 100644 --- a/src/networkd/daemon.c +++ b/src/networkd/daemon.c @@ -141,7 +141,7 @@ static int nw_daemon_load_config(nw_daemon* daemon) { return r; // Load zones - r = nw_zones_load(&daemon->zones); + r = nw_zones_load(&daemon->zones, daemon); if (r) return r; diff --git a/src/networkd/zone.c b/src/networkd/zone.c index b6fa65d2..30f22d61 100644 --- a/src/networkd/zone.c +++ b/src/networkd/zone.c @@ -24,11 +24,13 @@ #include #include "config.h" +#include "daemon.h" #include "logging.h" #include "string.h" #include "zone.h" struct nw_zone { + nw_daemon* daemon; int nrefs; char name[NETWORK_ZONE_NAME_MAX_LENGTH]; @@ -66,6 +68,8 @@ static int __nw_zone_path(nw_zone* zone, char* p, const size_t length, static void nw_zone_free(nw_zone* zone) { if (zone->config) nw_config_unref(zone->config); + if (zone->daemon) + nw_daemon_unref(zone->daemon); free(zone); } @@ -87,7 +91,7 @@ static int nw_zone_setup(nw_zone* zone) { return 0; } -int nw_zone_create(nw_zone** zone, const char* name) { +int nw_zone_create(nw_zone** zone, nw_daemon* daemon, const char* name) { int r; // Allocate a new object @@ -95,6 +99,9 @@ int nw_zone_create(nw_zone** zone, const char* name) { if (!z) return 1; + // Store a reference to the daemon + z->daemon = nw_daemon_ref(daemon); + // Initialize reference counter z->nrefs = 1; diff --git a/src/networkd/zone.h b/src/networkd/zone.h index 1c8e6b65..9df30ec9 100644 --- a/src/networkd/zone.h +++ b/src/networkd/zone.h @@ -26,7 +26,9 @@ typedef struct nw_zone nw_zone; -int nw_zone_create(nw_zone** zone, const char* name); +#include "daemon.h" + +int nw_zone_create(nw_zone** zone, nw_daemon* daemon, const char* name); nw_zone* nw_zone_ref(nw_zone* zone); nw_zone* nw_zone_unref(nw_zone* zone); diff --git a/src/networkd/zones.c b/src/networkd/zones.c index 779bbe10..fd43f1c7 100644 --- a/src/networkd/zones.c +++ b/src/networkd/zones.c @@ -23,6 +23,7 @@ #include #include +#include "daemon.h" #include "logging.h" #include "zone.h" #include "zones.h" @@ -35,6 +36,7 @@ struct nw_zones_entry { }; struct nw_zones { + nw_daemon* daemon; int nrefs; // Zone Entries @@ -44,11 +46,14 @@ struct nw_zones { unsigned int num; }; -static int nw_zones_create(nw_zones** zones) { +static int nw_zones_create(nw_zones** zones, nw_daemon* daemon) { nw_zones* z = calloc(1, sizeof(*z)); if (!z) return 1; + // Store a reference to the daemon + z->daemon = nw_daemon_ref(daemon); + // Initialize the reference counter z->nrefs = 1; @@ -76,6 +81,11 @@ static void nw_zones_free(nw_zones* zones) { // Free the entry free(entry); } + + if (zones->daemon) + nw_daemon_unref(zones->daemon); + + free(zones); } nw_zones* nw_zones_ref(nw_zones* zones) { @@ -147,7 +157,7 @@ static int __nw_zones_load(nw_zones* zones) { DEBUG("Loading zone '%s'...\n", name); // Create a new zone object - r = nw_zone_create(&zone, name); + r = nw_zone_create(&zone, zones->daemon, name); if (r) goto ERROR; @@ -173,11 +183,11 @@ ERROR: return r; } -int nw_zones_load(nw_zones** zones) { +int nw_zones_load(nw_zones** zones, nw_daemon* daemon) { int r; // Create a new zones object - r = nw_zones_create(zones); + r = nw_zones_create(zones, daemon); if (r) return r; diff --git a/src/networkd/zones.h b/src/networkd/zones.h index e41c74fd..330e5249 100644 --- a/src/networkd/zones.h +++ b/src/networkd/zones.h @@ -23,10 +23,12 @@ typedef struct nw_zones nw_zones; +#include "daemon.h" + nw_zones* nw_zones_ref(nw_zones* zones); nw_zones* nw_zones_unref(nw_zones* zones); -int nw_zones_load(nw_zones** zones); +int nw_zones_load(nw_zones** zones, nw_daemon* daemon); size_t nw_zones_num(nw_zones* zones);