From 6c3661596fb9a655652ec5b8f306e1c39b9a4765 Mon Sep 17 00:00:00 2001 From: kanjoe24 <165808281+kanjoe24@users.noreply.github.com> Date: Wed, 28 May 2025 12:20:30 +0100 Subject: [PATCH 1/6] Modify gh #79 : Modify source file to load curl library at runtime --- Makefile | 13 ++++---- src/ut_kvp.c | 86 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 81 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index ce88543..2cf7ab3 100755 --- a/Makefile +++ b/Makefile @@ -68,11 +68,8 @@ XLDFLAGS += $(LIBWEBSOCKETS_DIR)/lib/libwebsockets.a CURL_DIR = $(FRAMEWORK_BUILD_DIR)/curl ifneq ($(wildcard $(CURL_DIR)),) INC_DIRS += $(CURL_DIR)/include -XLDFLAGS += $(CURL_DIR)/lib/libcurl.a -else -# Commands to run if the directory does not exist -XLDFLAGS += -lcurl endif +XLDFLAGS += -ldl # UT Control library Requirements SRC_DIRS += ${TOP_DIR}/src @@ -80,6 +77,7 @@ INC_DIRS += ${TOP_DIR}/include XCFLAGS += -fPIC -Wall -shared # Flags for compilation XCFLAGS += -DNDEBUG +XCFLAGS += -DLIBCURL_PATH=\"$(LIBCURL_PATH)\" # CFLAGS += -DWEBSOCKET_SERVER MKDIR_P ?= @mkdir -p @@ -93,12 +91,14 @@ ifeq ($(TARGET),arm) #CC := arm-rdk-linux-gnueabi-gcc -mthumb -mfpu=vfp -mcpu=cortex-a9 -mfloat-abi=soft -mabi=aapcs-linux -mno-thumb-interwork -ffixed-r8 -fomit-frame-pointer # CFLAGS will be overriden by Caller as required INC_DIRS += $(UT_DIR)/sysroot/usr/include -XLDFLAGS += $(OPENSSL_LIB_DIR)/libssl.a $(OPENSSL_LIB_DIR)/libcrypto.a -ldl +XLDFLAGS += -ldl +LIBCURL_PATH="/usr/lib/libcurl.so.4" else #linux case +LIBCURL_PATH="/usr/lib/x86_64-linux-gnu/libcurl.so.4" # Check if the directory exists ifneq ($(wildcard $(OPENSSL_LIB_DIR)),) -XLDFLAGS += $(OPENSSL_LIB_DIR)/libssl.a $(OPENSSL_LIB_DIR)/libcrypto.a -ldl +XLDFLAGS += -ldl else # Commands to run if the directory does not exist XLDFLAGS += -lssl -lcrypto @@ -150,6 +150,7 @@ list: @$(ECHOE) ${YELLOW}SRC_DIRS:${NC} ${SRC_DIRS} @$(ECHOE) ${YELLOW}CFLAGS:${NC} ${CFLAGS} @$(ECHOE) ${YELLOW}XLDFLAGS:${NC} ${XLDFLAGS} + @$(ECHOE) ${YELLOW}XCFLAGS:${NC} ${XCFLAGS} @$(ECHOE) ${YELLOW}TARGET_LIB:${NC} ${TARGET_LIB} clean: diff --git a/src/ut_kvp.c b/src/ut_kvp.c index 7fef9fa..76675cc 100644 --- a/src/ut_kvp.c +++ b/src/ut_kvp.c @@ -24,6 +24,7 @@ #include #include #include +#include /* Application Includes */ #include @@ -62,6 +63,53 @@ static struct fy_node* process_include(const char *filename, int depth, struct f static void merge_nodes(struct fy_node *mainNode, struct fy_node *includeNode); static void remove_include_keys(struct fy_node *node); +// Typedefs for curl function pointers +typedef CURL* (*curl_easy_init_t)(void); +typedef CURLcode (*curl_easy_setopt_t)(CURL *, CURLoption, ...); +typedef CURLcode (*curl_easy_perform_t)(CURL *); +typedef CURLcode (*curl_easy_getinfo_t)(CURL *, CURLINFO, ...); +typedef void (*curl_easy_cleanup_t)(CURL *); +typedef const char* (*curl_easy_strerror_t)(CURLcode); + +// Function pointers for curl functions +static curl_easy_init_t kvp_curl_easy_init; +static curl_easy_setopt_t kvp_curl_easy_setopt; +static curl_easy_perform_t kvp_curl_easy_perform; +static curl_easy_getinfo_t kvp_curl_easy_getinfo; +static curl_easy_cleanup_t kvp_curl_easy_cleanup; +static curl_easy_strerror_t kvp_curl_easy_strerror; +static void *curl_lib = NULL; + +int init_curl_symbols() +{ + UT_LOG_DEBUG("Initializing curl symbols from %s", LIBCURL_PATH); + curl_lib = dlopen(LIBCURL_PATH, RTLD_LAZY); + if (curl_lib == NULL) + { + UT_LOG_ERROR("dlopen failed: %s\n", dlerror()); + return -1; + } + + // Load the curl function symbols + kvp_curl_easy_init = (curl_easy_init_t)dlsym(curl_lib, "curl_easy_init"); + kvp_curl_easy_setopt = (curl_easy_setopt_t)dlsym(curl_lib, "curl_easy_setopt"); + kvp_curl_easy_perform = (curl_easy_perform_t)dlsym(curl_lib, "curl_easy_perform"); + kvp_curl_easy_getinfo = (curl_easy_getinfo_t)dlsym(curl_lib, "curl_easy_getinfo"); + kvp_curl_easy_cleanup = (curl_easy_cleanup_t)dlsym(curl_lib, "curl_easy_cleanup"); + kvp_curl_easy_strerror = (curl_easy_strerror_t)dlsym(curl_lib, "curl_easy_strerror"); + + if ((kvp_curl_easy_init == NULL) || (kvp_curl_easy_setopt == NULL) || (kvp_curl_easy_perform == NULL) || + (kvp_curl_easy_getinfo == NULL) || (kvp_curl_easy_cleanup ==NULL) || (kvp_curl_easy_strerror == NULL)) + { + UT_LOG_ERROR("dlsym failed for one or more symbols\n"); + dlclose(curl_lib); + curl_lib = NULL; + return -1; + } + + return 0; +} + ut_kvp_instance_t *ut_kvp_createInstance(void) { ut_kvp_instance_internal_t *pInstance = malloc(sizeof(ut_kvp_instance_internal_t)); @@ -136,6 +184,13 @@ ut_kvp_status_t ut_kvp_open(ut_kvp_instance_t *pInstance, char *fileName) node = process_node(fy_document_root(pInternal->fy_handle), 0); remove_include_keys(node); + if (curl_lib) + { + // Close the curl library if it was opened + dlclose(curl_lib); + curl_lib = NULL; + } + if (node == NULL) { UT_LOG_ERROR("Unable to process node"); @@ -952,16 +1007,23 @@ static struct fy_node* process_include(const char *filename, int depth, struct f if (strncmp(filename, "http:", 5) == 0 || strncmp(filename, "https:", 6) == 0) { // URL include + if (curl_lib == NULL && init_curl_symbols() != 0) + { + UT_LOG_ERROR("Error: Could not initialize curl symbols\n"); + return NULL; + } + + // Initialize the memory chunk to store the downloaded data mChunk.memory = malloc(1); mChunk.size = 0; - if (!mChunk.memory) + if (mChunk.memory == NULL) { UT_LOG_ERROR( "Error: Not enough memory to store curl response\n"); return NULL; } - CURL *curl = curl_easy_init(); + CURL *curl = kvp_curl_easy_init(); if (!curl) { UT_LOG_ERROR( "Error: Could not initialize curl\n"); @@ -970,25 +1032,25 @@ static struct fy_node* process_include(const char *filename, int depth, struct f } CURLcode res; - curl_easy_setopt(curl, CURLOPT_URL, filename); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_memory_callback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&mChunk); - res = curl_easy_perform(curl); + kvp_curl_easy_setopt(curl, CURLOPT_URL, filename); + kvp_curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_memory_callback); + kvp_curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&mChunk); + res = kvp_curl_easy_perform(curl); if (res != CURLE_OK) { - UT_LOG_ERROR( "Error: curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); + UT_LOG_ERROR( "Error: curl_easy_perform() failed: %s\n", kvp_curl_easy_strerror(res)); free(mChunk.memory); - curl_easy_cleanup(curl); + kvp_curl_easy_cleanup(curl); return NULL; } long response_code; - curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); + kvp_curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); if (response_code != 200) { UT_LOG_ERROR( "Error: HTTP request failed with code %ld\n", response_code); free(mChunk.memory); - curl_easy_cleanup(curl); + kvp_curl_easy_cleanup(curl); return NULL; } @@ -997,7 +1059,7 @@ static struct fy_node* process_include(const char *filename, int depth, struct f { UT_LOG_ERROR("Error: Cannot parse included content\n"); free(mChunk.memory); - curl_easy_cleanup(curl); + kvp_curl_easy_cleanup(curl); return NULL; } @@ -1005,7 +1067,7 @@ static struct fy_node* process_include(const char *filename, int depth, struct f // UT_LOG_DEBUG("%s memory chunk = \n%s\n", __FUNCTION__, mChunk.memory); // free(mChunk.memory); // fy_document_build_from_malloc_string(): The string is expected to have been allocated by malloc(3) and when the document is destroyed it will be automatically freed. - curl_easy_cleanup(curl); + kvp_curl_easy_cleanup(curl); return fy_document_root(doc); } else From 2d509c64d85f860f5200c32a15e4c1c324a37549 Mon Sep 17 00:00:00 2001 From: kanjoe24 <165808281+kanjoe24@users.noreply.github.com> Date: Thu, 29 May 2025 13:29:12 +0000 Subject: [PATCH 2/6] Fix gh #79 : Fix review comments --- src/ut_kvp.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ut_kvp.c b/src/ut_kvp.c index 76675cc..0ebbd4e 100644 --- a/src/ut_kvp.c +++ b/src/ut_kvp.c @@ -84,19 +84,26 @@ int init_curl_symbols() { UT_LOG_DEBUG("Initializing curl symbols from %s", LIBCURL_PATH); curl_lib = dlopen(LIBCURL_PATH, RTLD_LAZY); + assert(curl_lib != NULL); if (curl_lib == NULL) { - UT_LOG_ERROR("dlopen failed: %s\n", dlerror()); + UT_LOG_ERROR("dlopen failed for library %s: %s\n", LIBCURL_PATH, dlerror()); return -1; } // Load the curl function symbols kvp_curl_easy_init = (curl_easy_init_t)dlsym(curl_lib, "curl_easy_init"); + assert(kvp_curl_easy_init != NULL); kvp_curl_easy_setopt = (curl_easy_setopt_t)dlsym(curl_lib, "curl_easy_setopt"); + assert(kvp_curl_easy_setopt != NULL); kvp_curl_easy_perform = (curl_easy_perform_t)dlsym(curl_lib, "curl_easy_perform"); + assert(kvp_curl_easy_perform != NULL); kvp_curl_easy_getinfo = (curl_easy_getinfo_t)dlsym(curl_lib, "curl_easy_getinfo"); + assert(kvp_curl_easy_getinfo != NULL); kvp_curl_easy_cleanup = (curl_easy_cleanup_t)dlsym(curl_lib, "curl_easy_cleanup"); + assert(kvp_curl_easy_cleanup != NULL); kvp_curl_easy_strerror = (curl_easy_strerror_t)dlsym(curl_lib, "curl_easy_strerror"); + assert(kvp_curl_easy_strerror != NULL); if ((kvp_curl_easy_init == NULL) || (kvp_curl_easy_setopt == NULL) || (kvp_curl_easy_perform == NULL) || (kvp_curl_easy_getinfo == NULL) || (kvp_curl_easy_cleanup ==NULL) || (kvp_curl_easy_strerror == NULL)) @@ -1006,7 +1013,7 @@ static struct fy_node* process_include(const char *filename, int depth, struct f if (strncmp(filename, "http:", 5) == 0 || strncmp(filename, "https:", 6) == 0) { - // URL include + // init curl symbols if not already initialized if (curl_lib == NULL && init_curl_symbols() != 0) { UT_LOG_ERROR("Error: Could not initialize curl symbols\n"); From f5c9b0ec283d72a8bbe0afcd0839a42b489df257 Mon Sep 17 00:00:00 2001 From: kanjoe24 <165808281+kanjoe24@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:41:29 +0000 Subject: [PATCH 3/6] Address gh#79 : Addressing review comments --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2cf7ab3..79784b0 100755 --- a/Makefile +++ b/Makefile @@ -95,7 +95,7 @@ XLDFLAGS += -ldl LIBCURL_PATH="/usr/lib/libcurl.so.4" else #linux case -LIBCURL_PATH="/usr/lib/x86_64-linux-gnu/libcurl.so.4" +LIBCURL_PATH := $(shell find /usr/ -type l -iname "libcurl.so*" 2>/dev/null | head -n1) # Check if the directory exists ifneq ($(wildcard $(OPENSSL_LIB_DIR)),) XLDFLAGS += -ldl From 70f3db927ba57cb6848dacafac6ba944aa6f8351 Mon Sep 17 00:00:00 2001 From: kanjoe24 <165808281+kanjoe24@users.noreply.github.com> Date: Wed, 11 Jun 2025 12:04:18 +0000 Subject: [PATCH 4/6] Fix gh #79 : Fixing further review comments --- Makefile | 3 --- configure.sh | 6 +++--- src/ut_kvp.c | 6 +++--- tests/src/ut_control_test.sh | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 79784b0..0246110 100755 --- a/Makefile +++ b/Makefile @@ -77,7 +77,6 @@ INC_DIRS += ${TOP_DIR}/include XCFLAGS += -fPIC -Wall -shared # Flags for compilation XCFLAGS += -DNDEBUG -XCFLAGS += -DLIBCURL_PATH=\"$(LIBCURL_PATH)\" # CFLAGS += -DWEBSOCKET_SERVER MKDIR_P ?= @mkdir -p @@ -92,10 +91,8 @@ ifeq ($(TARGET),arm) # CFLAGS will be overriden by Caller as required INC_DIRS += $(UT_DIR)/sysroot/usr/include XLDFLAGS += -ldl -LIBCURL_PATH="/usr/lib/libcurl.so.4" else #linux case -LIBCURL_PATH := $(shell find /usr/ -type l -iname "libcurl.so*" 2>/dev/null | head -n1) # Check if the directory exists ifneq ($(wildcard $(OPENSSL_LIB_DIR)),) XLDFLAGS += -ldl diff --git a/configure.sh b/configure.sh index ad4866a..097df72 100755 --- a/configure.sh +++ b/configure.sh @@ -288,13 +288,13 @@ build_curl() mkdir -p ${CURL_BUILD_DIR} if [ "$TARGET" = "arm" ]; then # For arm - ./configure CPPFLAGS="-I${OPENSSL_BUILD_DIR}/include" LDFLAGS="-L${OPENSSL_BUILD_DIR}/lib" --prefix=${CURL_BUILD_DIR} --host=arm --with-ssl=${OPENSSL_BUILD_DIR} --with-pic --without-libpsl --without-libidn2 --disable-docs --disable-libcurl-option --disable-alt-svc --disable-headers-api --disable-hsts --without-libgsasl --without-zlib + ./configure CPPFLAGS="-I${OPENSSL_BUILD_DIR}/include" LDFLAGS="-L${OPENSSL_BUILD_DIR}/lib" --prefix=${CURL_BUILD_DIR} --host=arm-none-linux-gnu --with-ssl=${OPENSSL_BUILD_DIR} --enable-shared --enable-static --with-pic --without-libpsl --without-libidn2 --disable-docs --disable-libcurl-option --disable-alt-svc --disable-headers-api --disable-hsts --without-libgsasl --without-zlib else # For linux if [ "$OPENSSL_IS_SYSTEM_INSTALLED" -eq 1 ]; then - ./configure --prefix=${CURL_BUILD_DIR} --with-ssl --without-zlib --without-libpsl --without-libidn2 --disable-docs --disable-libcurl-option --disable-alt-svc --disable-headers-api --disable-hsts --without-libgsasl + ./configure --prefix=${CURL_BUILD_DIR} --with-ssl --without-zlib --without-libpsl --without-libidn2 --disable-docs --disable-libcurl-option --disable-alt-svc --disable-headers-api --disable-hsts --without-libgsasl --enable-shared --enable-static else - ./configure CPPFLAGS="-I${OPENSSL_BUILD_DIR}/include" LDFLAGS="-L${OPENSSL_BUILD_DIR}/lib" --prefix=${CURL_BUILD_DIR} --with-ssl=${OPENSSL_BUILD_DIR} --with-pic --without-zlib --without-libpsl --without-libidn2 --disable-docs --disable-libcurl-option --disable-alt-svc --disable-headers-api --disable-hsts --without-libgsasl + ./configure CPPFLAGS="-I${OPENSSL_BUILD_DIR}/include" LDFLAGS="-L${OPENSSL_BUILD_DIR}/lib" --prefix=${CURL_BUILD_DIR} --with-ssl=${OPENSSL_BUILD_DIR} --with-pic --without-zlib --without-libpsl --without-libidn2 --disable-docs --disable-libcurl-option --disable-alt-svc --disable-headers-api --disable-hsts --without-libgsasl --enable-shared --enable-static fi fi make $@; make $@ install diff --git a/src/ut_kvp.c b/src/ut_kvp.c index 0ebbd4e..0b2b1d8 100644 --- a/src/ut_kvp.c +++ b/src/ut_kvp.c @@ -82,12 +82,12 @@ static void *curl_lib = NULL; int init_curl_symbols() { - UT_LOG_DEBUG("Initializing curl symbols from %s", LIBCURL_PATH); - curl_lib = dlopen(LIBCURL_PATH, RTLD_LAZY); + UT_LOG_DEBUG("Initializing curl symbols from %s", "libcurl.so.4"); + curl_lib = dlopen("libcurl.so.4", RTLD_LAZY); assert(curl_lib != NULL); if (curl_lib == NULL) { - UT_LOG_ERROR("dlopen failed for library %s: %s\n", LIBCURL_PATH, dlerror()); + UT_LOG_ERROR("dlopen failed for curl library %s: %s with major version 4\n", "libcurl.so.4", dlerror()); return -1; } diff --git a/tests/src/ut_control_test.sh b/tests/src/ut_control_test.sh index e52e322..fe89ee6 100755 --- a/tests/src/ut_control_test.sh +++ b/tests/src/ut_control_test.sh @@ -25,6 +25,6 @@ MY_DIR="$(dirname $SCRIPT_EXEC)" cd "$(dirname "$0")" -export LD_LIBRARY_PATH=/usr/lib:/lib:/home/root:${MY_DIR} +export LD_LIBRARY_PATH=/usr/lib:/lib:/home/root:${MY_DIR}:${MY_DIR}/lib ./ut_control_test $@ From 0035a7928f505741f0ae69da54cfdf59a9c0cc2a Mon Sep 17 00:00:00 2001 From: kanjoe24 <165808281+kanjoe24@users.noreply.github.com> Date: Thu, 12 Jun 2025 14:34:18 +0000 Subject: [PATCH 5/6] Add gh #79 : Adding few more improvements --- Makefile | 6 ------ tests/Makefile | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 0246110..bb5ac50 100755 --- a/Makefile +++ b/Makefile @@ -90,17 +90,11 @@ ifeq ($(TARGET),arm) #CC := arm-rdk-linux-gnueabi-gcc -mthumb -mfpu=vfp -mcpu=cortex-a9 -mfloat-abi=soft -mabi=aapcs-linux -mno-thumb-interwork -ffixed-r8 -fomit-frame-pointer # CFLAGS will be overriden by Caller as required INC_DIRS += $(UT_DIR)/sysroot/usr/include -XLDFLAGS += -ldl else #linux case -# Check if the directory exists -ifneq ($(wildcard $(OPENSSL_LIB_DIR)),) -XLDFLAGS += -ldl -else # Commands to run if the directory does not exist XLDFLAGS += -lssl -lcrypto endif -endif # Defaults for target linux ifeq ($(TARGET),linux) diff --git a/tests/Makefile b/tests/Makefile index bfcba10..504de34 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -75,6 +75,12 @@ build: $(ROOT_DIR)/build.sh make -C ./ut-core test @cp $(LIB_DIR)/lib* ${BIN_DIR} + @if [ -d $(LIB_DIR)/../curl ]; then \ + cp $(LIB_DIR)/../curl/lib/lib*.so* ${BIN_DIR}; \ + fi + @if [ -d $(LIB_DIR)/../openssl ]; then \ + cp $(LIB_DIR)/../openssl/lib/lib*.so* ${BIN_DIR}; \ + fi @cp ${ROOT_DIR}/src/*.sh ${BIN_DIR} @cp ${ROOT_DIR}/websocket-clients/* ${BIN_DIR} @$(ECHOE) ${GREEN}Copy Assets to [${BIN_DIR}/assets] ${NC} From 0f86b9ade95cb15fb406cd9e5c9199ef00795ff3 Mon Sep 17 00:00:00 2001 From: kanjoe24 <165808281+kanjoe24@users.noreply.github.com> Date: Thu, 12 Jun 2025 14:34:18 +0000 Subject: [PATCH 6/6] Add gh #79 : Adding few more improvements --- Makefile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Makefile b/Makefile index bb5ac50..0eb4cfa 100755 --- a/Makefile +++ b/Makefile @@ -90,10 +90,6 @@ ifeq ($(TARGET),arm) #CC := arm-rdk-linux-gnueabi-gcc -mthumb -mfpu=vfp -mcpu=cortex-a9 -mfloat-abi=soft -mabi=aapcs-linux -mno-thumb-interwork -ffixed-r8 -fomit-frame-pointer # CFLAGS will be overriden by Caller as required INC_DIRS += $(UT_DIR)/sysroot/usr/include -else -#linux case -# Commands to run if the directory does not exist -XLDFLAGS += -lssl -lcrypto endif # Defaults for target linux