lib/util: add server_id_set_disconnected() and server_id_is_disconnected()
authorMichael Adam <obnox@samba.org>
Mon, 6 Aug 2012 14:35:46 +0000 (16:35 +0200)
committerStefan Metzmacher <metze@samba.org>
Fri, 17 Aug 2012 18:07:07 +0000 (20:07 +0200)
Utility functions for handling the special placeholder server-id value
for disconnected clients (to be used for durable handles).

Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>

lib/util/samba_util.h
lib/util/server_id.c

index e69aa7c40ce7df4abe0f9a2f8330ac5dd0d79cee..4a6dd3bc80b26e783165d65c24237f88e9ff0d3f 100644 (file)
@@ -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_ */
index 722230354c6f3020d84156e0ed40169d55f006d1..a06891d80cceed563ba86097e950e112cb1789bb 100644 (file)
@@ -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);
+}