summaryrefslogtreecommitdiff
path: root/src/curl
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-11-25 10:40:00 -0500
committerAndrew Opalach <andrew@akon.city> 2024-11-25 10:40:00 -0500
commit159db01883ae7e058d1102b8fd0ab7dba95c9d33 (patch)
tree1676c11f6ce59728a29f64144cb12e77605f584e /src/curl
parentfa9c52314e0339af360a9dfa36628c920d4dfe55 (diff)
downloadlibnaunet-159db01883ae7e058d1102b8fd0ab7dba95c9d33.tar.gz
libnaunet-159db01883ae7e058d1102b8fd0ab7dba95c9d33.tar.bz2
libnaunet-159db01883ae7e058d1102b8fd0ab7dba95c9d33.zip
Android build, packet stream fixes
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/curl')
-rw-r--r--src/curl/curl.c14
-rw-r--r--src/curl/curl.h1
2 files changed, 12 insertions, 3 deletions
diff --git a/src/curl/curl.c b/src/curl/curl.c
index 5560487..b96d46f 100644
--- a/src/curl/curl.c
+++ b/src/curl/curl.c
@@ -2,6 +2,8 @@
#include "curl.h"
+// TODO: https://curl.se/libcurl/c/externalsocket.html
+
static void curl_socket_action_callback(struct ev_loop *loop, ev_io *w, s32 revents)
{
(void)loop;
@@ -36,10 +38,8 @@ static s32 sock_callback(CURL *e, curl_socket_t s, s32 what, void *cbp, void *so
if (!sockp) {
curl->sock = s;
curl_multi_assign(curl->multi_handle, curl->sock, curl);
- set_sock(curl, what);
- } else {
- set_sock(curl, what);
}
+ set_sock(curl, what);
}
return 0;
}
@@ -88,6 +88,7 @@ bool aki_curl_init(struct aki_curl *curl)
curl_multi_setopt(curl->multi_handle, CURLMOPT_SOCKETDATA, curl);
curl_multi_setopt(curl->multi_handle, CURLMOPT_TIMERFUNCTION, timer_callback);
curl_multi_setopt(curl->multi_handle, CURLMOPT_TIMERDATA, curl);
+ curl->added = false;
curl->timer_started = false;
curl->loop = NULL;
curl->event.data = curl;
@@ -107,6 +108,7 @@ void aki_curl_set_url(struct aki_curl *curl, str *url)
bool aki_curl_add_handle(struct aki_curl *curl)
{
+ al_assert(!curl->added);
// CURLM_RECURSIVE_API_CALL (8) also means we can't even call this
// while a callback is running on another thread.
CURLMcode mc = curl_multi_add_handle(curl->multi_handle, curl->handle);
@@ -114,21 +116,27 @@ bool aki_curl_add_handle(struct aki_curl *curl)
al_log_error("curl", "curl_multi_add_handle() failed (%s).", curl_multi_strerror(mc));
return false;
}
+ curl->added = true;
return true;
}
bool aki_curl_remove_handle(struct aki_curl *curl)
{
+ al_assert(curl->added);
CURLMcode mc = curl_multi_remove_handle(curl->multi_handle, curl->handle);
if (mc != CURLM_OK) {
al_log_error("curl", "curl_multi_remove_handle() failed (%s).", curl_multi_strerror(mc));
return false;
}
+ curl->added = false;
return true;
}
void aki_curl_close(struct aki_curl *curl)
{
+ if (curl->handle && curl->multi_handle && curl->added) {
+ aki_curl_remove_handle(curl);
+ }
if (curl->handle) curl_easy_cleanup(curl->handle);
if (curl->multi_handle) curl_multi_cleanup(curl->multi_handle);
}
diff --git a/src/curl/curl.h b/src/curl/curl.h
index 5bb38c0..ce14f3c 100644
--- a/src/curl/curl.h
+++ b/src/curl/curl.h
@@ -12,6 +12,7 @@ struct aki_curl {
struct aki_event_loop *loop;
CURL *handle;
CURLM *multi_handle;
+ bool added;
curl_socket_t sock;
void (*handle_events)(void *, struct aki_curl *);
void *userdata;