From 4522aa13bc8287ee56c548fbde5755ac022fb249 Mon Sep 17 00:00:00 2001 From: Arslaan Pathan Date: Fri, 3 Jul 2026 22:02:27 +1200 Subject: Fix memory leaks and issues and implement strerr, also start working on the next part of updating repos --- src/libmbpk.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 18 deletions(-) (limited to 'src/libmbpk.c') diff --git a/src/libmbpk.c b/src/libmbpk.c index 1347e8b..ef745c8 100644 --- a/src/libmbpk.c +++ b/src/libmbpk.c @@ -3,7 +3,6 @@ #include #include "libmbpk.h" #include "ini.h" -#include #include #include @@ -54,12 +53,22 @@ static size_t curl_memory_write_calback(void *contents, size_t size, size_t nmem } int mbpk_init(void) { + CURLcode result; struct stat st; if (stat(MBPK_DB_DIR, &st) == -1) { if (mkdir(MBPK_DB_DIR, 0755) == -1) { return MBPK_DB_FAIL; } } + if (stat(MBPK_REPO_DIR, &st) == -1) { + if (mkdir(MBPK_REPO_DIR, 0755) == -1) { + return MBPK_REPO_FAIL; + } + } + result = curl_global_init(CURL_GLOBAL_ALL); + if (result != CURLE_OK) { + return MBPK_CURL_INIT_FAIL; + } return MBPK_OK; } @@ -101,7 +110,10 @@ int mbpk_update_repositories(void) { mbpk_repository *repo; CURL* curl; CURLcode result; - char* repo_ini_url; + char *repo_ini_url; + char *repo_ini_path; + char *repo_dir; + size_t dir_len; struct curl_memory chunk; repo_count = 0; @@ -109,21 +121,14 @@ int mbpk_update_repositories(void) { return MBPK_REPO_FAIL; } - if (stat(MBPK_REPO_DIR, &st) == -1) { - if (mkdir(MBPK_REPO_DIR, 0755) == -1) { - return MBPK_REPO_FAIL; - } - } - for (i = 0; i < repo_count; i++) { repo = repos[i]; printf("[libmbpk debug] processing repo %s\n", repo->name); chunk.memory = malloc(1); - chunk.size = 0; - result = curl_global_init(CURL_GLOBAL_ALL); - if (result != CURLE_OK) { - return MBPK_CURL_INIT_FAIL; + if (!chunk.memory) { + return MBPK_OUT_OF_MEMORY; } + chunk.size = 0; curl = curl_easy_init(); if (curl) { @@ -141,28 +146,77 @@ int mbpk_update_repositories(void) { curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk); result = curl_easy_perform(curl); + curl_easy_cleanup(curl); + free(repo_ini_url); if (result != CURLE_OK) { printf("[libmbpk debug] perform cURL failed\n"); + free(chunk.memory); return MBPK_CURL_PERFORM_FAIL; } else { printf("[libmbpk debug] %lu bytes received\n", (unsigned long)chunk.size); printf("[libmbpk debug] Response:\n%s\n", chunk.memory); } - - curl_easy_cleanup(curl); } else { free(chunk.memory); - curl_global_cleanup(); return MBPK_CURL_INIT_FAIL; } + + dir_len = strlen(MBPK_REPO_DIR) + 1 + strlen(repo->name) + 1; + repo_dir = malloc(dir_len); + free(chunk.memory); - curl_global_cleanup(); } return MBPK_OK; } -void mbpk_cleanup(void) { - +void mbpk_cleanup(void) { + int i; + for (i = 0; i < repo_count; i++) { + if (repos[i]) { + free((void*)repos[i]->name); + free((void*)repos[i]->url); + free((void*)repos[i]->desc); + free((void*)repos[i]->packages); + free((void*)repos[i]); + repos[i] = NULL; + } + } + repo_count = 0; + curl_global_cleanup(); +} + +const char* mbpk_strerr(int code) { + const char* strerr; + switch (code) { + case MBPK_OK: + strerr = "MBPK_OK (0)"; + break; + case MBPK_DB_FAIL: + strerr = "MBPK_DB_FAIL (1)"; + break; + case MBPK_REPO_FAIL: + strerr = "MBPK_REPO_FAIL (2)"; + break; + case MBPK_DL_FAIL: + strerr = "MBPK_DL_FAIL (3)"; + break; + case MBPK_EXTRACT_FAIL: + strerr = "MBPK_EXTRACT_FAIL (4)"; + break; + case MBPK_CURL_INIT_FAIL: + strerr = "MBPK_CURL_INIT_FAIL (5)"; + break; + case MBPK_CURL_PERFORM_FAIL: + strerr = "MBPK_CURL_PERFORM_FAIL (6)"; + break; + case MBPK_OUT_OF_MEMORY: + strerr = "MBPK_OUT_OF_MEMORY (7)"; + break; + default: + strerr = "MBPK_UNKNOWN_ERR"; + break; + } + return strerr; } -- cgit v1.2.3