From a9c9263cbedcded33387c51edaaea5bfb68e6041 Mon Sep 17 00:00:00 2001 From: "yu.dongyang" Date: Sun, 10 Aug 2025 20:23:16 +0800 Subject: [PATCH] add += feature Change-Id: I385426f8a63050b089f6b0fe04ff9e95132857a3 --- ldso/linux/ns_config.c | 59 +++++++++++++++++++++++++++++++++++++++--- ldso/linux/strops.c | 35 +++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 4 deletions(-) diff --git a/ldso/linux/ns_config.c b/ldso/linux/ns_config.c index a1947e88e..b09ed9368 100644 --- a/ldso/linux/ns_config.c +++ b/ldso/linux/ns_config.c @@ -20,7 +20,7 @@ #include "ld_log.h" /*---------------------------- Defines -------------------------------------*/ -#define MAX_LINE_SIZE (1024) +#define MAX_LINE_SIZE (2048) #define INI_INVALID_KEY ((char*)-1) #ifdef UNIT_TEST_STATIC @@ -40,6 +40,31 @@ typedef enum _line_status_ { #define MAX_KEY_LEN 256 static char g_key[MAX_KEY_LEN + 1] = {0}; +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) +static char* get_split_by_key(const char *key) +{ + static char *keys[] = { "nslist", "inherits", "paths", "libs" }; + static char *splits[] = { ",", ":", ":", ":" }; + static int key_size = ARRAY_SIZE(keys); + + if (key == NULL || *key == '\0') { + return ":"; + } + + size_t klen = strlen(key); + for (int i = 0; i < key_size; i++) + { + size_t item_len = strlen(keys[i]); + if (item_len <= klen) { + if (strcmp(key + klen - item_len, keys[i]) == 0) { + return splits[i]; + } + } + } + + return ":"; +} + static char *config_key_join(const char *join, bool start) { if (start) g_key[0] = 0; @@ -91,6 +116,20 @@ static line_status config_line(char *line, char *section, char *key, char *value strtrim(section); return LINE_SECTION; } + if (split = strchr(line, '+') && *(split + 1) == '=') { + /* key and value */ + size_t klen, vlen; + klen = split - line; + vlen = len - klen - 1; + if (klen > 0) memcpy(key, line, klen); + if (vlen > 0) memcpy(value, split + 1, vlen); + value[0] = '+'; + key[klen] = 0; + value[vlen] = 0; + strtrim(key); + strtrim(value); + return LINE_VALUE; + } if ((split = strchr(line, '='))) { /* key and value */ size_t klen, vlen; @@ -227,19 +266,30 @@ static void kvlist_set(kvlist *kvs, const char *key, const char *val) } if (i < kvs->num) { - char * v = ld_strdup(val); + char *v = NULL; + if (*val == '+') { + v = ld_str_extend(kvs->val[i], val + 1, get_split_by_key(key)); + } else { + v = ld_strdup(val); + } if (v) { __libc_free(kvs->val[i]); kvs->val[i] = v; } return; } + if (kvs->num == kvs->size) { kvlist_realloc(kvs); } + if (kvs->num < kvs->size) { kvs->key[kvs->num] = ld_strdup(key); - kvs->val[kvs->num] = ld_strdup(val); + if (*val == '+') { + kvs->val[kvs->num] = ld_strdup(val + 1); + } else { + kvs->val[kvs->num] = ld_strdup(val); + } if (kvs->key[kvs->num] && kvs->val[kvs->num]) { kvs->num++; } else { @@ -247,6 +297,7 @@ static void kvlist_set(kvlist *kvs, const char *key, const char *val) __libc_free(kvs->val[kvs->num]); } } + return; } @@ -677,4 +728,4 @@ void configor_free() __libc_free(g_configor.exe_path); g_configor.exe_path = NULL; } -} \ No newline at end of file +} diff --git a/ldso/linux/strops.c b/ldso/linux/strops.c index 652489753..96e7aeb33 100644 --- a/ldso/linux/strops.c +++ b/ldso/linux/strops.c @@ -60,6 +60,9 @@ strlist *strsplit(const char *str, const char *split_s) } cur = ss; + if (*cur == *split_s) { + cur += 1; + } while ((next = strstr(cur, split_s))) { *next = 0; strtrim(cur); @@ -135,4 +138,36 @@ char *ld_strdup(const char *s) char *d = __libc_malloc(l + 1); if (!d) return NULL; return memcpy(d, s, l + 1); +} + +char *ld_str_extend(const char *src, const char *ext, const char *split) +{ + if (!src && !ext) return NULL; + if (!src) return ext ? ld_strdup(ext) : NULL; + if (!ext) return ld_strdup(src); + + size_t src_len = strlen(src); + size_t ext_len = strlen(ext); + size_t split_len = 0; + + if (split != NULL && split[0] != '\0') { + split_len = 1; + } + + size_t total_len = src_len + ext_len + split_len + 1; + char *result = (char *)__libc_malloc(total_len); + if (result == NULL) { + return NULL; + } + + memcpy(result, src, src_len); + + if (split_len > 0) { + result[src_len] = split[0]; + } + + memcpy(result + src_len + split_len, ext, ext_len); + result[total_len - 1] = '\0'; + + return result; } \ No newline at end of file -- Gitee