#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
-#include <dlfcn.h>
#include <getopt.h>
#include <fcntl.h>
#include <glob.h>
#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
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,
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) {
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <arpa/inet.h>
+#include <dlfcn.h>
#include <libubox/ustream-ssl.h>
#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;
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)
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;