From: Stefan Metzmacher Date: Fri, 17 Aug 2012 10:47:57 +0000 (+0200) Subject: lib/util: add server_id_from_string() X-Git-Tag: samba-4.0.0beta7~139 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d4a0aeb49a3e7536b34d101cf7b70b48cfa5f4ba;p=thirdparty%2Fsamba.git lib/util: add server_id_from_string() metze --- diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h index 26a5c6872b2..e69aa7c40ce 100644 --- a/lib/util/samba_util.h +++ b/lib/util/samba_util.h @@ -901,5 +901,7 @@ const char *shlib_ext(void); struct server_id; bool server_id_equal(const struct server_id *p1, const struct server_id *p2); char *server_id_str(TALLOC_CTX *mem_ctx, const struct server_id *id); +struct server_id server_id_from_string(uint32_t local_vnn, + const char *pid_string); #endif /* _SAMBA_UTIL_H_ */ diff --git a/lib/util/server_id.c b/lib/util/server_id.c index 7370ad93356..d41fb0b2877 100644 --- a/lib/util/server_id.c +++ b/lib/util/server_id.c @@ -60,3 +60,39 @@ char *server_id_str(TALLOC_CTX *mem_ctx, const struct server_id *id) (unsigned)id->task_id); } } + +struct server_id server_id_from_string(uint32_t local_vnn, + const char *pid_string) +{ + struct server_id result; + unsigned long long pid; + unsigned int vnn, task_id = 0; + + ZERO_STRUCT(result); + + /* + * We accept various forms with 1, 2 or 3 component forms + * because the server_id_str() can print different forms, and + * we want backwards compatibility for scripts that may call + * smbclient. + */ + if (sscanf(pid_string, "%u:%llu.%u", &vnn, &pid, &task_id) == 3) { + result.vnn = vnn; + result.pid = pid; + result.task_id = task_id; + } else if (sscanf(pid_string, "%u:%llu", &vnn, &pid) == 2) { + result.vnn = vnn; + result.pid = pid; + } else if (sscanf(pid_string, "%llu.%u", &pid, &task_id) == 2) { + result.vnn = local_vnn; + result.pid = pid; + result.task_id = task_id; + } else if (sscanf(pid_string, "%llu", &pid) == 1) { + result.vnn = local_vnn; + result.pid = pid; + } else { + result.vnn = NONCLUSTER_VNN; + result.pid = UINT64_MAX; + } + return result; +}