diff options
-rw-r--r-- | lib/util/samba_util.h | 12 | ||||
-rw-r--r-- | lib/util/server_id.c | 37 |
2 files changed, 48 insertions, 1 deletions
diff --git a/lib/util/samba_util.h b/lib/util/samba_util.h index e69aa7c40c..4a6dd3bc80 100644 --- a/lib/util/samba_util.h +++ b/lib/util/samba_util.h @@ -904,4 +904,16 @@ 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); +/** + * Set the serverid to the special value that represents a disconnected + * client for (e.g.) durable handles. + */ +void server_id_set_disconnected(struct server_id *id); + +/** + * check whether a serverid is the special placeholder for + * a disconnected client + */ +bool server_id_is_disconnected(const struct server_id *id); + #endif /* _SAMBA_UTIL_H_ */ diff --git a/lib/util/server_id.c b/lib/util/server_id.c index 722230354c..a06891d80c 100644 --- a/lib/util/server_id.c +++ b/lib/util/server_id.c @@ -43,7 +43,9 @@ 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) { - if (id->vnn == NONCLUSTER_VNN && id->task_id == 0) { + if (server_id_is_disconnected(id)) { + return talloc_strdup(mem_ctx, "disconnected"); + } else if (id->vnn == NONCLUSTER_VNN && id->task_id == 0) { return talloc_asprintf(mem_ctx, "%llu", (unsigned long long)id->pid); @@ -95,9 +97,42 @@ struct server_id server_id_from_string(uint32_t local_vnn, } else if (sscanf(pid_string, "%llu", &pid) == 1) { result.vnn = local_vnn; result.pid = pid; + } else if (strcmp(pid_string, "disconnected") ==0) { + server_id_set_disconnected(&result); } else { result.vnn = NONCLUSTER_VNN; result.pid = UINT64_MAX; } return result; } + +/** + * Set the serverid to the special value that represents a disconnected + * client for (e.g.) durable handles. + */ +void server_id_set_disconnected(struct server_id *id) +{ + SMB_ASSERT(id != NULL); + + id->pid = UINT64_MAX; + id->task_id = UINT32_MAX; + id->vnn = NONCLUSTER_VNN; + id->unique_id = SERVERID_UNIQUE_ID_NOT_TO_VERIFY; + + return; +} + +/** + * check whether a serverid is the special placeholder for + * a disconnected client + */ +bool server_id_is_disconnected(const struct server_id *id) +{ + struct server_id dis; + + SMB_ASSERT(id != NULL); + + server_id_set_disconnected(&dis); + + return server_id_equal(id, &dis); +} |