From: Stefan Metzmacher Date: Fri, 2 Aug 2024 06:25:16 +0000 (+0200) Subject: lib/util: split out server_id_from_string_ex allow the unique delimiter to be passed in X-Git-Tag: tdb-1.4.13~1322 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=20431cc62272f228023297a09eb256263184fa63;p=thirdparty%2Fsamba.git lib/util: split out server_id_from_string_ex allow the unique delimiter to be passed in In future it also allows to specifiy another delemiter than '/' in order to use the resulting buffer as part of a file/directory name. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15693 Signed-off-by: Stefan Metzmacher Reviewed-by: Ralph Boehme --- diff --git a/lib/util/server_id.c b/lib/util/server_id.c index 7ea5d7aa64e..8e72a722080 100644 --- a/lib/util/server_id.c +++ b/lib/util/server_id.c @@ -115,11 +115,19 @@ size_t server_id_str_buf_unique(struct server_id id, char *buf, size_t buflen) struct server_id server_id_from_string(uint32_t local_vnn, const char *pid_string) +{ + return server_id_from_string_ex(local_vnn, '/', pid_string); +} + +struct server_id server_id_from_string_ex(uint32_t local_vnn, + char unique_delimiter, + const char *pid_string) { struct server_id templ = { .vnn = NONCLUSTER_VNN, .pid = UINT64_MAX }; struct server_id result; + char unique_delimiter_found = '\0'; int ret; /* @@ -130,10 +138,10 @@ struct server_id server_id_from_string(uint32_t local_vnn, */ result = templ; - ret = sscanf(pid_string, "%"SCNu32":%"SCNu64".%"SCNu32"/%"SCNu64, + ret = sscanf(pid_string, "%"SCNu32":%"SCNu64".%"SCNu32"%c%"SCNu64, &result.vnn, &result.pid, &result.task_id, - &result.unique_id); - if (ret == 4) { + &unique_delimiter_found, &result.unique_id); + if (ret == 5 && unique_delimiter_found == unique_delimiter) { return result; } @@ -145,9 +153,10 @@ struct server_id server_id_from_string(uint32_t local_vnn, } result = templ; - ret = sscanf(pid_string, "%"SCNu32":%"SCNu64"/%"SCNu64, - &result.vnn, &result.pid, &result.unique_id); - if (ret == 3) { + ret = sscanf(pid_string, "%"SCNu32":%"SCNu64"%c%"SCNu64, + &result.vnn, &result.pid, + &unique_delimiter_found, &result.unique_id); + if (ret == 4 && unique_delimiter_found == unique_delimiter) { return result; } @@ -159,9 +168,10 @@ struct server_id server_id_from_string(uint32_t local_vnn, } result = templ; - ret = sscanf(pid_string, "%"SCNu64".%"SCNu32"/%"SCNu64, - &result.pid, &result.task_id, &result.unique_id); - if (ret == 3) { + ret = sscanf(pid_string, "%"SCNu64".%"SCNu32"%c%"SCNu64, + &result.pid, &result.task_id, + &unique_delimiter_found, &result.unique_id); + if (ret == 4 && unique_delimiter_found == unique_delimiter) { result.vnn = local_vnn; return result; } @@ -175,9 +185,9 @@ struct server_id server_id_from_string(uint32_t local_vnn, } result = templ; - ret = sscanf(pid_string, "%"SCNu64"/%"SCNu64, - &result.pid, &result.unique_id); - if (ret == 2) { + ret = sscanf(pid_string, "%"SCNu64"%c%"SCNu64, + &result.pid, &unique_delimiter_found, &result.unique_id); + if (ret == 3 && unique_delimiter_found == unique_delimiter) { result.vnn = local_vnn; return result; } diff --git a/lib/util/server_id.h b/lib/util/server_id.h index 77cbd045a28..bef2af2ad6f 100644 --- a/lib/util/server_id.h +++ b/lib/util/server_id.h @@ -56,6 +56,9 @@ size_t server_id_str_buf_unique(struct server_id id, char *buf, size_t buflen); struct server_id server_id_from_string(uint32_t local_vnn, const char *pid_string); +struct server_id server_id_from_string_ex(uint32_t local_vnn, + char unique_delimiter, + const char *pid_string); /** * Set the serverid to the special value that represents a disconnected