s3-includes: only include system/filesys.h when needed.
[vlendec/samba-autobuild/.git] / source3 / lib / serverid.c
index 74effa4c31db053f3b0cc0f6ff856d5575d52edb..f13c66e2c912c4eab66cc252a6ff5eadca80a08f 100644 (file)
 */
 
 #include "includes.h"
+#include "system/filesys.h"
 #include "serverid.h"
+#include "dbwrap.h"
 
 struct serverid_key {
        pid_t pid;
-#ifdef CLUSTER_SUPPORT
        uint32_t vnn;
-#endif
 };
 
-bool serverid_parent_init(void)
+struct serverid_data {
+       uint64_t unique_id;
+       uint32_t msg_flags;
+};
+
+bool serverid_parent_init(TALLOC_CTX *mem_ctx)
 {
        struct tdb_wrap *db;
 
@@ -37,9 +42,8 @@ bool serverid_parent_init(void)
         * work.
         */
 
-       db = tdb_wrap_open(talloc_autofree_context(),
-                          lock_path("serverid.tdb"),
-                          0, TDB_DEFAULT|TDB_CLEAR_IF_FIRST, O_RDWR|O_CREAT,
+       db = tdb_wrap_open(mem_ctx, lock_path("serverid.tdb"),
+                          0, TDB_DEFAULT|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH, O_RDWR|O_CREAT,
                           0644);
        if (db == NULL) {
                DEBUG(1, ("could not open serverid.tdb: %s\n",
@@ -49,11 +53,6 @@ bool serverid_parent_init(void)
        return true;
 }
 
-struct serverid_data {
-       uint64_t unique_id;
-       uint32_t msg_flags;
-};
-
 static struct db_context *serverid_db(void)
 {
        static struct db_context *db;
@@ -61,8 +60,8 @@ static struct db_context *serverid_db(void)
        if (db != NULL) {
                return db;
        }
-       db = db_open(talloc_autofree_context(), lock_path("serverid.tdb"),
-                    0, TDB_DEFAULT|TDB_CLEAR_IF_FIRST, O_RDWR|O_CREAT, 0644);
+       db = db_open(NULL, lock_path("serverid.tdb"), 0,
+                    TDB_DEFAULT|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH, O_RDWR|O_CREAT, 0644);
        return db;
 }
 
@@ -71,9 +70,7 @@ static void serverid_fill_key(const struct server_id *id,
 {
        ZERO_STRUCTP(key);
        key->pid = id->pid;
-#ifdef CLUSTER_SUPPORT
        key->vnn = id->vnn;
-#endif
 }
 
 bool serverid_register(const struct server_id id, uint32_t msg_flags)
@@ -124,7 +121,7 @@ bool serverid_register_msg_flags(const struct server_id id, bool do_reg,
        struct serverid_key key;
        struct serverid_data *data;
        struct db_record *rec;
-       TDB_DATA tdbkey, tdbdata;
+       TDB_DATA tdbkey;
        NTSTATUS status;
        bool ret = false;
 
@@ -145,7 +142,7 @@ bool serverid_register_msg_flags(const struct server_id id, bool do_reg,
        if (rec->value.dsize != sizeof(struct serverid_data)) {
                DEBUG(1, ("serverid record has unexpected size %d "
                          "(wanted %d)\n", (int)rec->value.dsize,
-                         sizeof(struct serverid_data)));
+                         (int)sizeof(struct serverid_data)));
                goto done;
        }
 
@@ -157,7 +154,7 @@ bool serverid_register_msg_flags(const struct server_id id, bool do_reg,
                data->msg_flags &= ~msg_flags;
        }
 
-       status = rec->store(rec, tdbdata, 0);
+       status = rec->store(rec, rec->value, 0);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(1, ("Storing serverid.tdb record failed: %s\n",
                          nt_errstr(status)));
@@ -234,6 +231,10 @@ bool serverid_exists(const struct server_id *id)
        struct serverid_key key;
        TDB_DATA tdbkey;
 
+       if (lp_clustering() && !process_exists(*id)) {
+               return false;
+       }
+
        db = serverid_db();
        if (db == NULL) {
                return false;
@@ -272,9 +273,7 @@ static bool serverid_rec_parse(const struct db_record *rec,
        memcpy(&data, rec->value.dptr, sizeof(data));
 
        id->pid = key.pid;
-#ifdef CLUSTER_SUPPORT
        id->vnn = key.vnn;
-#endif
        id->unique_id = data.unique_id;
        *msg_flags = data.msg_flags;
        return true;