From af1962b9a60930cd1f24eff2854bceaa2a6c964d Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 27 Mar 2024 08:28:09 +0100 Subject: [PATCH] uclient: add helper function for getting ustream-ssl context/ops Signed-off-by: Felix Fietkau --- uclient-fetch.c | 24 +----------------------- uclient.c | 28 ++++++++++++++++++++++++++++ uclient.h | 1 + 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/uclient-fetch.c b/uclient-fetch.c index 1e51ff3..359715c 100644 --- a/uclient-fetch.c +++ b/uclient-fetch.c @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -35,12 +34,6 @@ #include "uclient.h" #include "uclient-utils.h" -#ifdef __APPLE__ -#define LIB_EXT "dylib" -#else -#define LIB_EXT "so" -#endif - #ifndef strdupa #define strdupa(x) strcpy(alloca(strlen(x)+1),x) #endif @@ -513,21 +506,6 @@ static void init_ca_cert(void) globfree(&gl); } -static void init_ustream_ssl(void) -{ - void *dlh; - - dlh = dlopen("libustream-ssl." LIB_EXT, RTLD_LAZY | RTLD_LOCAL); - if (!dlh) - return; - - ssl_ops = dlsym(dlh, "ustream_ssl_ops"); - if (!ssl_ops) - return; - - ssl_ctx = ssl_ops->context_new(false); -} - static int no_ssl(const char *progname) { fprintf(stderr, @@ -590,7 +568,7 @@ int main(int argc, char **argv) int af = -1; signal(SIGPIPE, SIG_IGN); - init_ustream_ssl(); + ssl_ctx = uclient_new_ssl_context(&ssl_ops); while ((ch = getopt_long(argc, argv, "46cO:P:qsT:U:Y:", longopts, &longopt_idx)) != -1) { switch(ch) { diff --git a/uclient.c b/uclient.c index ce76bcf..4214c62 100644 --- a/uclient.c +++ b/uclient.c @@ -16,11 +16,18 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include +#include #include #include "uclient.h" #include "uclient-utils.h" #include "uclient-backend.h" +#ifdef __APPLE__ +#define LIB_EXT "dylib" +#else +#define LIB_EXT "so" +#endif + char *uclient_get_addr(char *dest, int *port, union uclient_addr *a) { int portval; @@ -361,6 +368,27 @@ int uclient_request(struct uclient *cl) return 0; } +struct ustream_ssl_ctx *uclient_new_ssl_context(const struct ustream_ssl_ops **ops) +{ + static const struct ustream_ssl_ops *ssl_ops; + void *dlh; + + if (!ssl_ops) { + dlh = dlopen("libustream-ssl." LIB_EXT, RTLD_LAZY | RTLD_LOCAL); + if (!dlh) + return NULL; + + ssl_ops = dlsym(dlh, "ustream_ssl_ops"); + if (!ssl_ops) { + dlclose(dlh); + return NULL; + } + } + + *ops = ssl_ops; + return ssl_ops->context_new(false); +} + int uclient_read(struct uclient *cl, char *buf, int len) { if (!cl->backend->read) diff --git a/uclient.h b/uclient.h index 4f37364..0901910 100644 --- a/uclient.h +++ b/uclient.h @@ -115,6 +115,7 @@ int uclient_write(struct uclient *cl, const char *buf, int len); int uclient_request(struct uclient *cl); char *uclient_get_addr(char *dest, int *port, union uclient_addr *a); +struct ustream_ssl_ctx *uclient_new_ssl_context(const struct ustream_ssl_ops **ops); /* HTTP */ extern const struct uclient_backend uclient_backend_http; -- 2.30.2