Author: metze Date: 2005-09-19 09:08:37 +0000 (Mon, 19 Sep 2005) New Revision: 10309
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10309 Log: - add winsdb_connect() function, so that the winsdb can be opened by the wrepl_server/ code - remove maintaining of a min_version field, as it was implemented incorrect, and is maybe not needed at all - fix handling of max_version, (we started with 0, on each server start) metze Modified: branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c Changeset: Modified: branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c =================================================================== --- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c 2005-09-19 05:30:46 UTC (rev 10308) +++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.c 2005-09-19 09:08:37 UTC (rev 10309) @@ -28,63 +28,58 @@ #include "system/time.h" /* - save the min/max version IDs for the database + return the new maxVersion and save it */ -static BOOL winsdb_save_version(struct wins_server *winssrv) +static uint64_t winsdb_allocate_version(struct wins_server *winssrv) { - int i, ret = 0; + int ret; struct ldb_context *ldb = winssrv->wins_db; - struct ldb_message *msg = ldb_msg_new(winssrv); - if (msg == NULL) goto failed; + struct ldb_dn *dn; + struct ldb_message **res = NULL; + struct ldb_message *msg = NULL; + TALLOC_CTX *tmp_ctx = talloc_new(winssrv); + uint64_t maxVersion = 0; - msg->dn = ldb_dn_explode(msg, "CN=VERSION"); - if (msg->dn == NULL) goto failed; + dn = ldb_dn_explode(tmp_ctx, "CN=VERSION"); + if (!dn) goto failed; - ret |= ldb_msg_add_fmt(ldb, msg, "minVersion", "%llu", winssrv->min_version); - ret |= ldb_msg_add_fmt(ldb, msg, "maxVersion", "%llu", winssrv->max_version); - if (ret != 0) goto failed; + /* find the record in the WINS database */ + ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, + NULL, NULL, &res); + if (res != NULL) { + talloc_steal(tmp_ctx, res); + } + if (ret < 0) goto failed; + if (ret > 1) goto failed; - for (i=0;i<msg->num_elements;i++) { - msg->elements[i].flags = LDB_FLAG_MOD_REPLACE; + if (ret == 1) { + maxVersion = ldb_msg_find_uint64(res[0], "maxVersion", 0); } + maxVersion++; + msg = ldb_msg_new(tmp_ctx); + if (!msg) goto failed; + msg->dn = dn; + + + ret = ldb_msg_add_empty(ldb, msg, "maxVersion", LDB_FLAG_MOD_REPLACE); + if (ret != 0) goto failed; + ret = ldb_msg_add_fmt(ldb, msg, "maxVersion", "%llu", maxVersion); + if (ret != 0) goto failed; + ret = ldb_modify(ldb, msg); if (ret != 0) ret = ldb_add(ldb, msg); if (ret != 0) goto failed; - talloc_free(msg); - return True; + talloc_free(tmp_ctx); + return maxVersion; failed: - talloc_free(msg); - return False; + talloc_free(tmp_ctx); + return 0; } /* - allocate a new version id for a record -*/ -static uint64_t winsdb_allocate_version(struct wins_server *winssrv) -{ - winssrv->max_version++; - if (!winsdb_save_version(winssrv)) { - return 0; - } - return winssrv->max_version; -} - -/* - remove a version id -*/ -static void winsdb_remove_version(struct wins_server *winssrv, uint64_t version) -{ - if (version == winssrv->min_version) { - winssrv->min_version++; - winsdb_save_version(winssrv); - } -} - - -/* return a DN for a nbt_name */ static struct ldb_dn *winsdb_dn(TALLOC_CTX *mem_ctx, struct nbt_name *name) @@ -267,8 +262,6 @@ int ret; const struct ldb_dn *dn; - winsdb_remove_version(winssrv, rec->version); - dn = winsdb_dn(tmp_ctx, rec->name); if (dn == NULL) goto failed; @@ -283,16 +276,7 @@ return NBT_RCODE_SVR; } - -/* - connect to the WINS database -*/ -NTSTATUS winsdb_init(struct wins_server *winssrv) +struct ldb_context *winsdb_connect(TALLOC_CTX *mem_ctx) { - winssrv->wins_db = ldb_wrap_connect(winssrv, lp_wins_url(), 0, NULL); - if (winssrv->wins_db == NULL) { - return NT_STATUS_INTERNAL_DB_ERROR; - } - - return NT_STATUS_OK; + return ldb_wrap_connect(mem_ctx, lp_wins_url(), 0, NULL); } Modified: branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h =================================================================== --- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h 2005-09-19 05:30:46 UTC (rev 10308) +++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsdb.h 2005-09-19 09:08:37 UTC (rev 10309) @@ -44,9 +44,4 @@ uint32_t min_ttl; uint32_t max_ttl; - - /* these are the minimum and maximum record version IDs in the - database. They are needed for replication */ - uint64_t min_version; - uint64_t max_version; }; Modified: branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c =================================================================== --- branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c 2005-09-19 05:30:46 UTC (rev 10308) +++ branches/tmp/samba4-winsrepl/source/nbt_server/wins/winsserver.c 2005-09-19 09:08:37 UTC (rev 10309) @@ -274,15 +274,18 @@ return NT_STATUS_OK; } - nbtsrv->winssrv = talloc(nbtsrv, struct wins_server); + nbtsrv->winssrv = talloc_zero(nbtsrv, struct wins_server); NT_STATUS_HAVE_NO_MEMORY(nbtsrv->winssrv); nbtsrv->winssrv->max_ttl = lp_max_wins_ttl(); nbtsrv->winssrv->min_ttl = lp_min_wins_ttl(); - nbtsrv->winssrv->min_version = 0; - nbtsrv->winssrv->max_version = 0; + nbtsrv->winssrv->wins_db = winsdb_connect(nbtsrv->winssrv); + if (!nbtsrv->winssrv->wins_db) { + return NT_STATUS_INTERNAL_DB_ERROR; + } + irpc_add_name(nbtsrv->task->msg_ctx, "wins_server"); - return winsdb_init(nbtsrv->winssrv); + return NT_STATUS_OK; }