]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Move libcurl init to global_lib framework
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 2 Jun 2022 18:14:16 +0000 (14:14 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 2 Jun 2022 18:14:53 +0000 (14:14 -0400)
src/lib/curl/base.c
src/lib/curl/base.h
src/lib/server/module_rlm.c
src/lib/server/virtual_servers.c
src/modules/rlm_imap/rlm_imap.c
src/modules/rlm_rest/rlm_rest.c
src/modules/rlm_smtp/rlm_smtp.c

index 417d0af5e3a124be699975668a5097e81f658278..2f6d02267e30ddaeb4f37c3e925bea01c4364fb4 100644 (file)
@@ -30,8 +30,6 @@
 
 #include "attrs.h"
 
-static uint32_t instance_count = 0;
-
 fr_dict_attr_t const *attr_tls_certificate;
 static fr_dict_t const *dict_freeradius; /*internal dictionary for server*/
 
@@ -74,72 +72,6 @@ CONF_PARSER fr_curl_tls_config[] = {
        CONF_PARSER_TERMINATOR
 };
 
-/** Initialise global curl options
- *
- * libcurl is meant to performa reference counting, but still seems to
- * leak lots of memory if we call curl_global_init many times.
- */
-int fr_curl_init(void)
-{
-       CURLcode ret;
-       curl_version_info_data *curlversion;
-
-       if (instance_count > 0) {
-               instance_count++;
-               return 0;
-       }
-
-#ifdef WITH_TLS
-       /*
-        *      Use our OpenSSL init with the hope that
-        *      the free function will also free the
-        *      memory allocated during SSL init.
-        */
-       if (fr_openssl_init() < 0) return -1;
-#endif
-
-       if (fr_dict_autoload(curl_dict) < 0) {
-               PERROR("Failed loading dictionaries for curl");
-               return -1;
-       }
-
-       if (fr_dict_attr_autoload(curl_attr) < 0) {
-               PERROR("Failed loading dictionaries for curl");
-               return -1;
-       }
-
-       ret = curl_global_init(CURL_GLOBAL_ALL);
-       if (ret != CURLE_OK) {
-               ERROR("CURL init returned error: %i - %s", ret, curl_easy_strerror(ret));
-               fr_dict_autofree(curl_dict);
-               return -1;
-       }
-
-       curlversion = curl_version_info(CURLVERSION_NOW);
-       if (strcmp(LIBCURL_VERSION, curlversion->version) != 0) {
-               WARN("libcurl version changed since the server was built");
-               WARN("linked: %s built: %s", curlversion->version, LIBCURL_VERSION);
-       }
-
-       INFO("libcurl version: %s", curl_version());
-
-       instance_count++;
-
-       return 0;
-}
-
-void fr_curl_free(void)
-{
-       if (--instance_count > 0) return;
-
-       fr_dict_autofree(curl_dict);
-
-#ifdef WITH_TLS
-       fr_openssl_free();
-#endif
-       curl_global_cleanup();
-}
-
 int fr_curl_easy_tls_init(fr_curl_io_request_t *randle, fr_curl_tls_t const *conf)
 {
        request_t *request = randle->request;
@@ -241,3 +173,70 @@ int fr_curl_response_certinfo(request_t *request, fr_curl_io_request_t *randle)
        }
        return 0;
 }
+
+
+/** Initialise global curl options
+ *
+ * libcurl is meant to performa reference counting, but still seems to
+ * leak lots of memory if we call curl_global_init many times.
+ */
+static int fr_curl_init(void)
+{
+       CURLcode ret;
+       curl_version_info_data *curlversion;
+
+#ifdef WITH_TLS
+       /*
+        *      Use our OpenSSL init with the hope that
+        *      the free function will also free the
+        *      memory allocated during SSL init.
+        */
+       if (fr_openssl_init() < 0) return -1;
+#endif
+
+       if (fr_dict_autoload(curl_dict) < 0) {
+               PERROR("Failed loading dictionaries for curl");
+               return -1;
+       }
+
+       if (fr_dict_attr_autoload(curl_attr) < 0) {
+               PERROR("Failed loading dictionaries for curl");
+               return -1;
+       }
+
+       ret = curl_global_init(CURL_GLOBAL_ALL);
+       if (ret != CURLE_OK) {
+               ERROR("CURL init returned error: %i - %s", ret, curl_easy_strerror(ret));
+               fr_dict_autofree(curl_dict);
+               return -1;
+       }
+
+       curlversion = curl_version_info(CURLVERSION_NOW);
+       if (strcmp(LIBCURL_VERSION, curlversion->version) != 0) {
+               WARN("libcurl version changed since the server was built");
+               WARN("linked: %s built: %s", curlversion->version, LIBCURL_VERSION);
+       }
+
+       INFO("libcurl version: %s", curl_version());
+
+       return 0;
+}
+
+static void fr_curl_free(void)
+{
+       fr_dict_autofree(curl_dict);
+
+#ifdef WITH_TLS
+       fr_openssl_free();
+#endif
+       curl_global_cleanup();
+}
+
+/*
+ *     Public symbol modules can reference to auto instantiate libcurl
+ */
+global_lib_autoinst_t fr_curl_autoinst = {
+       .name = "curl",
+       .init = fr_curl_init,
+       .free = fr_curl_free
+};
index 4f2b01f447080105f85f0eaa9bc1d84884300356..788dbfa1c1c9094063ff98e1839f0f9c7947eb40 100644 (file)
@@ -32,9 +32,10 @@ extern "C" {
 #define CURL_NO_OLDIES 1
 
 #include <curl/curl.h>
+#include <freeradius-devel/server/global_lib.h>
+#include <freeradius-devel/server/module.h>
 #include <freeradius-devel/server/request.h>
 #include <freeradius-devel/util/event.h>
-#include <freeradius-devel/server/module.h>
 
 DIAG_OFF(DIAG_UNKNOWN_PRAGMAS)
 DIAG_OFF(disabled-macro-expansion)
@@ -116,7 +117,8 @@ typedef struct {
        bool                    extract_cert_attrs;
 } fr_curl_tls_t;
 
-extern CONF_PARSER      fr_curl_tls_config[];
+extern CONF_PARSER             fr_curl_tls_config[];
+extern global_lib_autoinst_t   fr_curl_autoinst;
 
 int                    fr_curl_io_request_enqueue(fr_curl_handle_t *mhandle,
                                                   request_t *request, fr_curl_io_request_t *creq);
@@ -125,10 +127,6 @@ fr_curl_io_request_t       *fr_curl_io_request_alloc(TALLOC_CTX *ctx);
 
 fr_curl_handle_t       *fr_curl_io_init(TALLOC_CTX *ctx, fr_event_list_t *el, bool multiplex);
 
-int                    fr_curl_init(void);
-
-void                   fr_curl_free(void);
-
 int                    fr_curl_response_certinfo(request_t *request, fr_curl_io_request_t *randle);
 
 int                    fr_curl_easy_tls_init (fr_curl_io_request_t *randle, fr_curl_tls_t const *conf);
index 158325ecee2aac791bfef831ef0e08eb409fff11..ac73a926f0b0bd907e3235f118fc89a6754ea0f3 100644 (file)
@@ -29,6 +29,7 @@
 RCSID("$Id$")
 
 #include <freeradius-devel/server/cf_file.h>
+#include <freeradius-devel/server/global_lib.h>
 #include <freeradius-devel/server/modpriv.h>
 #include <freeradius-devel/server/module_rlm.h>
 #include <freeradius-devel/server/pair.h>
index 54e9f42672e4eb9a7c9ba01ed4336918a26123d4..5ae9ee979d6b52ad9ea848dc36bebd8ee6431114 100644 (file)
 
 RCSID("$Id$")
 
+#include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
 #include <freeradius-devel/server/base.h>
 #include <freeradius-devel/server/command.h>
+#include <freeradius-devel/server/cond.h>
 #include <freeradius-devel/server/dl_module.h>
+#include <freeradius-devel/server/global_lib.h>
 #include <freeradius-devel/server/modpriv.h>
-#include <freeradius-devel/server/cond.h>
-#include <freeradius-devel/server/protocol.h>
 #include <freeradius-devel/server/process.h>
+#include <freeradius-devel/server/protocol.h>
 #include <freeradius-devel/server/virtual_servers.h>
-#include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
 
 #include <freeradius-devel/io/application.h>
 #include <freeradius-devel/io/master.h>
index e03958d2083d274689c354b1d813e400c49095af..312662edf88d3d8e12df9d5fc8dda056d03fdddc 100644 (file)
  */
 RCSID("$Id$")
 
+#include <freeradius-devel/curl/base.h>
 #include <freeradius-devel/server/base.h>
+#include <freeradius-devel/server/global_lib.h>
 #include <freeradius-devel/server/module_rlm.h>
-#include <freeradius-devel/curl/base.h>
 
 static fr_dict_t       const           *dict_radius; /*dictionary for radius protocol*/
 
@@ -46,6 +47,12 @@ fr_dict_attr_autoload_t rlm_imap_dict_attr[] = {
        { NULL },
 };
 
+extern global_lib_autoinst_t const * const rlm_imap_lib[];
+global_lib_autoinst_t const * const rlm_imap_lib[] = {
+       &fr_curl_autoinst,
+       GLOBAL_LIB_TERMINATOR
+};
+
 typedef struct {
        char const                      *uri;           //!< URI of imap server
        fr_time_delta_t                 timeout;        //!< Timeout for connection and server response
@@ -164,23 +171,6 @@ static unlang_action_t CC_HINT(nonnull(1,2)) mod_authenticate(rlm_rcode_t *p_res
        return unlang_module_yield(request, mod_authenticate_resume, NULL, randle);
 }
 
-/*
- *     Initialize global curl instance
- */
-static int mod_load(void)
-{
-       if (fr_curl_init() < 0) return -1;
-       return 0;
-}
-
-/*
- *     Close global curl instance
- */
-static void mod_unload(void)
-{
-       fr_curl_free();
-}
-
 /*
  *     Initialize a new thread with a curl instance
  */
@@ -225,8 +215,6 @@ module_rlm_t rlm_imap = {
                .inst_size              = sizeof(rlm_imap_t),
                .thread_inst_size       = sizeof(rlm_imap_thread_t),
                .config                 = module_config,
-               .onload                 = mod_load,
-               .unload                 = mod_unload,
                .thread_instantiate     = mod_thread_instantiate,
                .thread_detach          = mod_thread_detach,
        },
index 13c38b3892301412579204323acbd543c1cd3f5f..deee9f2919b28df03b346bae47c3a54d735cb6cc 100644 (file)
@@ -25,6 +25,7 @@ RCSID("$Id$")
 
 #include <freeradius-devel/curl/base.h>
 #include <freeradius-devel/server/base.h>
+#include <freeradius-devel/server/global_lib.h>
 #include <freeradius-devel/server/module_rlm.h>
 #include <freeradius-devel/server/pairmove.h>
 #include <freeradius-devel/tls/base.h>
@@ -173,6 +174,12 @@ fr_dict_attr_autoload_t rlm_rest_dict_attr[] = {
        { NULL }
 };
 
+extern global_lib_autoinst_t const * const rlm_rest_lib[];
+global_lib_autoinst_t const * const rlm_rest_lib[] = {
+       &fr_curl_autoinst,
+       GLOBAL_LIB_TERMINATOR
+};
+
 /** Update the status attribute
  *
  * @param[in] request  The current request.
@@ -1208,8 +1215,6 @@ static int mod_load(void)
        /* developer sanity */
        fr_assert((NUM_ELEMENTS(http_body_type_supported)) == REST_HTTP_BODY_NUM_ENTRIES);
 
-       if (fr_curl_init() < 0) return -1;
-
 #ifdef HAVE_JSON
        fr_json_version_print();
 #endif
@@ -1217,15 +1222,6 @@ static int mod_load(void)
        return 0;
 }
 
-/** Called to free resources held by libcurl
- *
- * @see mod_load
- */
-static void mod_unload(void)
-{
-       fr_curl_free();
-}
-
 /*
  *     The module name should be the only globally exported symbol.
  *     That is, everything else should be 'static'.
@@ -1245,7 +1241,6 @@ module_rlm_t rlm_rest = {
                .thread_inst_size       = sizeof(rlm_rest_thread_t),
                .config                 = module_config,
                .onload                 = mod_load,
-               .unload                 = mod_unload,
                .bootstrap              = mod_bootstrap,
                .instantiate            = instantiate,
                .thread_instantiate     = mod_thread_instantiate,
index fc04edcfca6d48bd585518046a317081c8d9db79..8f5b19a8b2cdf6aa3d1a16ead26a0ce42b0abdfb 100644 (file)
@@ -27,6 +27,7 @@ RCSID("$Id$")
 #include <freeradius-devel/curl/base.h>
 #include <freeradius-devel/server/base.h>
 #include <freeradius-devel/server/cf_priv.h>
+#include <freeradius-devel/server/global_lib.h>
 #include <freeradius-devel/server/module_rlm.h>
 #include <freeradius-devel/server/tmpl_dcursor.h>
 #include <freeradius-devel/util/talloc.h>
@@ -59,6 +60,12 @@ fr_dict_attr_autoload_t rlm_smtp_dict_attr[] = {
        { NULL },
 };
 
+extern global_lib_autoinst_t const * const rlm_smtp_lib[];
+global_lib_autoinst_t const * const rlm_smtp_lib[] = {
+       &fr_curl_autoinst,
+       GLOBAL_LIB_TERMINATOR
+};
+
 typedef struct {
        char const              *uri;                   //!< URI of smtp server
        char const              *template_dir;          //!< The directory that contains all email attachments
@@ -1002,23 +1009,6 @@ static unlang_action_t CC_HINT(nonnull(1,2)) mod_authenticate(rlm_rcode_t *p_res
        return unlang_module_yield(request, mod_authenticate_resume, NULL, randle);
 }
 
-/*
- *     Initialize global curl instance
- */
-static int mod_load(void)
-{
-       if (fr_curl_init() < 0) return -1;
-       return 0;
-}
-
-/*
- *     Close global curl instance
- */
-static void mod_unload(void)
-{
-       fr_curl_free();
-}
-
 /** Verify that a map in the header section makes sense
  *
  */
@@ -1117,8 +1107,6 @@ module_rlm_t rlm_smtp = {
                .config                 = module_config,
                .bootstrap              = mod_bootstrap,
                .instantiate            = mod_instantiate,
-               .onload                 = mod_load,
-               .unload                 = mod_unload,
                .thread_instantiate     = mod_thread_instantiate,
                .thread_detach          = mod_thread_detach,
        },