]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Auto unload SNMP attributes
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 15 May 2024 01:25:52 +0000 (19:25 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 15 May 2024 01:26:25 +0000 (19:26 -0600)
src/bin/radiusd.c
src/lib/server/snmp.c
src/lib/server/stats.h

index 5c947964b095a117e1699553109fe95f749d6638..aedfd93ec7561f8428b530eedd6f4d560aad42f1 100644 (file)
@@ -1105,8 +1105,6 @@ cleanup:
         */
        fr_atexit_thread_trigger_all();
 
-       fr_snmp_free();
-
        server_free();
 
 #ifdef WITH_TLS
index b69aa6ab91411d20f3f43113085c4ca73c399530..291f27e72a35d2c7040c1cdb73d0cc9c68b1cfc6 100644 (file)
@@ -28,6 +28,8 @@
 RCSID("$Id$")
 
 #include <freeradius-devel/server/base.h>
+
+#include <freeradius-devel/util/atexit.h>
 #include <freeradius-devel/util/debug.h>
 
 #include <freeradius-devel/util/misc.h>
@@ -1051,7 +1053,7 @@ int fr_snmp_process(request_t *request)
 /** Internal SNMP initialisation function (used for recursion)
  *
  */
-static int _fr_snmp_init(fr_snmp_map_t map[], fr_dict_attr_t const *parent)
+static int _fr_snmp_init_r(fr_snmp_map_t map[], fr_dict_attr_t const *parent)
 {
        unsigned int i;
 
@@ -1067,7 +1069,7 @@ static int _fr_snmp_init(fr_snmp_map_t map[], fr_dict_attr_t const *parent)
                                return -1;
                        }
 
-                       ret = _fr_snmp_init(map[i].child, map[i].da);
+                       ret = _fr_snmp_init_r(map[i].child, map[i].da);
                        if (ret < 0) return -1;
 
                        continue;
@@ -1094,11 +1096,7 @@ static int _fr_snmp_init(fr_snmp_map_t map[], fr_dict_attr_t const *parent)
 
        return 0;
 }
-
-/** Initialise the tree of SNMP map structures used to attach callbacks to OIDs
- *
- */
-int fr_snmp_init(void)
+static int _fr_snmp_init(UNUSED void *uctx)
 {
        start_time = fr_time();
        reset_time = start_time;
@@ -1113,10 +1111,24 @@ int fr_snmp_init(void)
                return -1;
        }
 
-       return _fr_snmp_init(snmp_iso, fr_dict_root(dict_snmp));        /* The SNMP root node */
+       return _fr_snmp_init_r(snmp_iso, fr_dict_root(dict_snmp));      /* The SNMP root node */
 }
 
-void fr_snmp_free(void)
+static int _fr_snmp_free(UNUSED void *uctx)
 {
        fr_dict_autofree(snmp_dict);
+
+       return 0;
+}
+
+/** Initialise the tree of SNMP map structures used to attach callbacks to OIDs
+ *
+ */
+int fr_snmp_init(void)
+{
+       int ret;
+
+       fr_atexit_global_once_ret(&ret, _fr_snmp_init, _fr_snmp_free, NULL);
+
+       return ret;
 }
index e3ee82510fa0ef1914114483d3c41e38164f127e..f1cc663a2aabb42b2911c5dfcb20bf092c33d50f 100644 (file)
@@ -71,7 +71,6 @@ void radius_stats_ema(fr_stats_ema_t *ema,
 void fr_stats_bins(fr_stats_t *stats, fr_time_t start, fr_time_t end);
 int fr_snmp_process(request_t *request);
 int fr_snmp_init(void);
-void fr_snmp_free(void);
 
 
 #define FR_STATS_INC(_x, _y) radius_ ## _x ## _stats._y++;if (listener) listener->stats._y++;if (client) client->_x._y++;