summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/util/samba_util.h2
-rw-r--r--lib/util/server_id.c36
2 files changed, 38 insertions, 0 deletions
diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h
index 26a5c6872b..e69aa7c40c 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 7370ad9335..d41fb0b287 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;
+}