summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author0x221E2026-04-23 23:55:09 +0200
committer0x221E2026-04-23 23:55:09 +0200
commitab9a7898f4fc97588a394fb0b5140eb47bfecdf5 (patch)
treeac6efe271b252c34ecb5da4b2171f6b48da99f68
parent871e8819bdbad30bf64ae775ee825193f9be2706 (diff)
net: add write to file callback
Creates a write_opts argument in net_send_request() where you can specify WRITE_OPT_MEMORY or WRITE_OPT_FILE. Modifies existing calls.
-rw-r--r--include/net.h12
-rw-r--r--src/main.c2
-rw-r--r--src/net.c27
3 files changed, 37 insertions, 4 deletions
diff --git a/include/net.h b/include/net.h
index f599122..e6cb32a 100644
--- a/include/net.h
+++ b/include/net.h
@@ -2,15 +2,25 @@
#define NET_H
#include <stddef.h>
+#include <stdio.h>
+
+#define WRITE_OPT_MEMORY 1
+#define WRITE_OPT_FILE 2
+
+typedef struct string_view string_view;
struct memory {
char *buffer;
size_t size;
};
+struct net_fwrite_userdata {
+ FILE *file;
+};
+
int net_init();
void net_shutdown();
-int net_send_request(char *url, struct memory *mem);
+int net_send_request(char *url, struct memory *mem, int write_opts);
#endif
diff --git a/src/main.c b/src/main.c
index 0ac5739..4ed2ff4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -48,7 +48,7 @@ int cmd_install(int argc, char **argv)
int ret = 1;
struct memory mem = { 0 };
- net_send_request("https://packages.0xinfinity.dev/list", &mem);
+ net_send_request("https://packages.0xinfinity.dev/list", &mem, WRITE_OPT_MEMORY);
struct um_user_data userdata = { 0 };
struct parser parser;
diff --git a/src/net.c b/src/net.c
index 962e26c..6f14089 100644
--- a/src/net.c
+++ b/src/net.c
@@ -24,6 +24,21 @@ size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
return nmemb;
}
+size_t write_file_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
+{
+ assert(ptr != NULL);
+ assert(ptr != NULL);
+
+ struct net_fwrite_userdata *user = (struct net_fwrite_userdata*)userdata;
+
+ if (user->file == NULL) {
+ fprintf(stderr, "net: Write failed, file stream could not be found!\n");
+ return 0;
+ }
+
+ return fwrite(ptr, nmemb, 1, user->file);
+}
+
int net_init()
{
CURLcode result = curl_global_init(CURL_GLOBAL_ALL);
@@ -37,7 +52,7 @@ void net_shutdown()
curl_global_cleanup();
}
-int net_send_request(char *url, struct memory *mem)
+int net_send_request(char *url, struct memory *mem, int write_opts)
{
assert(mem != NULL);
CURL *curl;
@@ -46,7 +61,15 @@ int net_send_request(char *url, struct memory *mem)
return -CONINITERR;
curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
+
+ if (write_opts == WRITE_OPT_MEMORY)
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
+ else if (write_opts == WRITE_OPT_FILE)
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_file_cb);
+ else {
+ fprintf(stderr, "net: a valid write_opts must be specified! current: %d", write_opts);
+ }
+
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)mem);
curl_easy_setopt(curl, CURLOPT_CA_CACHE_TIMEOUT, 604800L);