aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChloe Kudryavtsev <code@toast.bunkerlabs.net>2023-03-19 20:35:58 -0400
committerChloe Kudryavtsev <code@toast.bunkerlabs.net>2023-03-19 20:35:58 -0400
commit3ff98f94b98173f063de8990eac7140d65862a92 (patch)
tree1b79a7ba15345a754ccfeb47bfb2d6f5aca19a2c
parentinitial commit (diff)
add curl global init/cleanup
also move more stuff to JANET_CFUN
-rw-r--r--jurl.c44
-rw-r--r--main.c12
2 files changed, 52 insertions, 4 deletions
diff --git a/jurl.c b/jurl.c
index 479559a..f5d4204 100644
--- a/jurl.c
+++ b/jurl.c
@@ -16,7 +16,7 @@ const JanetAbstractType jurl_type = {
JANET_ATEND_GC
};
-Janet jurl_new(int32_t argc, Janet *argv) {
+JANET_CFUN(jurl_new) {
janet_fixarity(argc, 0);
jurl_handle *jurl = (jurl_handle*)janet_abstract(&jurl_type, sizeof(jurl));
jurl->handle = curl_easy_init();
@@ -27,14 +27,14 @@ Janet jurl_new(int32_t argc, Janet *argv) {
return janet_wrap_abstract(jurl);
}
-Janet jurl_reset(int32_t argc, Janet *argv) {
+JANET_CFUN(jurl_reset) {
janet_fixarity(argc, 1);
jurl_handle *jurl = (jurl_handle*)janet_getabstract(argv, 0, &jurl_type);
curl_easy_reset(jurl->handle);
return janet_wrap_abstract(jurl);
}
-Janet jurl_dup(int32_t argc, Janet *argv) {
+JANET_CFUN(jurl_dup) {
janet_fixarity(argc, 1);
jurl_handle *jurl = (jurl_handle*)janet_getabstract(argv, 0, &jurl_type);
jurl_handle *newj = (jurl_handle*)janet_abstract(&jurl_type, sizeof(jurl));
@@ -42,13 +42,49 @@ Janet jurl_dup(int32_t argc, Janet *argv) {
return janet_wrap_abstract(newj);
}
+JANET_CFUN(jurl_global_init) {
+ long flags;
+ if (argc == 0) {
+ flags = CURL_GLOBAL_ALL;
+ goto global_init_ret;
+ }
+ for (size_t i = 0; i < argc; i++) {
+ Janet kw = argv[i];
+ if(!janet_checktype(kw, JANET_KEYWORD)) {
+ janet_panicf(
+ "jurl_global_init: received a non-keyword argument of type %T: %v",
+ janet_type(kw), kw);
+ }
+ if (janet_keyeq(kw, "all")) {
+ flags |= CURL_GLOBAL_ALL;
+ } else if (janet_keyeq(kw, "ssl")) {
+ flags |= CURL_GLOBAL_SSL;
+ } else if (janet_keyeq(kw, "win32")) {
+ flags |= CURL_GLOBAL_WIN32;
+ } else if (janet_keyeq(kw, "nothing")) {
+ flags |= CURL_GLOBAL_NOTHING;
+ } else if (janet_keyeq(kw, "ack-eintr")) {
+ flags |= CURL_GLOBAL_ACK_EINTR;
+ } else {
+ janet_panicf("jurl_global_init: unknown keyword %v", kw);
+ }
+ }
+global_init_ret:
+ return janet_wrap_integer(curl_global_init(flags));
+}
+
+JANET_CFUN(jurl_global_cleanup) {
+ curl_global_cleanup();
+ return janet_wrap_nil();
+}
+
size_t write_buffer_callback(void *contents, size_t size, size_t nmemb, void* userp) {
size_t realsize = size * nmemb;
janet_buffer_push_bytes(userp, contents, realsize);
return realsize;
}
-Janet jurl_perform(int32_t argc, Janet *argv) {
+JANET_CFUN(jurl_perform) {
janet_fixarity(argc, 1);
jurl_handle *jurl = (jurl_handle*)janet_getabstract(argv, 0, &jurl_type);
diff --git a/main.c b/main.c
index 8337f60..980e6f9 100644
--- a/main.c
+++ b/main.c
@@ -19,6 +19,16 @@ JANET_FN(jurl_dup,
"(jurl-native/dup handle)",
"Duplicate an existing jurl handle");
+JANET_FN(jurl_global_init,
+ "(jurl-native/global-init)"
+ "\n"
+ "(jurl-native/global-init :ssl)",
+ "Run curl global init");
+
+JANET_FN(jurl_global_cleanup,
+ "(jurl-native/global-cleanup)",
+ "Run curl global cleanup");
+
JANET_FN(jurl_perform,
"(jurl-native/perform handle)",
"Perform the request associated with a handle");
@@ -42,6 +52,8 @@ static const JanetRegExt cfuns[] = {
JANET_REG("new", jurl_new),
JANET_REG("reset", jurl_reset),
JANET_REG("dup", jurl_dup),
+ JANET_REG("global-init", jurl_global_init),
+ JANET_REG("global-cleanup", jurl_global_cleanup),
JANET_REG("perform", jurl_perform),
// jurl_getinfo.c