"172.31.1.1;winsOwner:172.31.9.202;expireTime:20050923032330.0Z;"
are valid records
*/
-static NTSTATUS winsdb_addr_decode(struct winsdb_record *rec, struct ldb_val *val,
+static NTSTATUS winsdb_addr_decode(struct winsdb_handle *h, struct winsdb_record *rec, struct ldb_val *val,
TALLOC_CTX *mem_ctx, struct winsdb_addr **_addr)
{
NTSTATUS status;
struct winsdb_addr *addr;
- char *address;
- char *wins_owner;
- char *expire_time;
+ const char *address;
+ const char *wins_owner;
+ const char *expire_time;
char *p;
addr = talloc(mem_ctx, struct winsdb_addr);
}
*p = '\0';p++;
+ if (strcmp(wins_owner, "0.0.0.0") == 0) {
+ wins_owner = h->local_owner;
+ }
addr->wins_owner = talloc_strdup(addr, wins_owner);
if (!addr->wins_owner) {
status = NT_STATUS_NO_MEMORY;
talloc_steal(tmp_ctx, res);
- status = winsdb_record(res->msgs[0], tmp_ctx, &rec);
+ status = winsdb_record(h, res->msgs[0], tmp_ctx, &rec);
if (!NT_STATUS_IS_OK(status)) goto failed;
/* see if it has already expired */
return status;
}
-NTSTATUS winsdb_record(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct winsdb_record **_rec)
+NTSTATUS winsdb_record(struct winsdb_handle *h, struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct winsdb_record **_rec)
{
NTSTATUS status;
struct winsdb_record *rec;
talloc_steal(rec, rec->wins_owner);
talloc_steal(rec, rec->registered_by);
- if (!rec->wins_owner) {
- rec->wins_owner = talloc_strdup(rec, WINSDB_OWNER_LOCAL);
- if (rec->wins_owner == NULL) {
- status = NT_STATUS_NO_MEMORY;
- goto failed;
- }
+ if (!rec->wins_owner || strcmp(rec->wins_owner, "0.0.0.0") == 0) {
+ rec->wins_owner = h->local_owner;
}
el = ldb_msg_find_element(msg, "address");
}
for (i=0;i<num_values;i++) {
- status = winsdb_addr_decode(rec, &el->values[i], rec->addresses, &rec->addresses[i]);
+ status = winsdb_addr_decode(h, rec, &el->values[i], rec->addresses, &rec->addresses[i]);
if (!NT_STATUS_IS_OK(status)) goto failed;
}
rec->addresses[i] = NULL;
if (rec->version == 0) goto failed;
}
if (flags & WINSDB_FLAG_TAKE_OWNERSHIP) {
- rec->wins_owner = WINSDB_OWNER_LOCAL;
+ rec->wins_owner = h->local_owner;
}
msg = winsdb_message(wins_db, rec, tmp_ctx);
if (rec->version == 0) goto failed;
}
if (flags & WINSDB_FLAG_TAKE_OWNERSHIP) {
- rec->wins_owner = WINSDB_OWNER_LOCAL;
+ rec->wins_owner = h->local_owner;
}
msg = winsdb_message(wins_db, rec, tmp_ctx);
struct winsdb_handle *winsdb_connect(TALLOC_CTX *mem_ctx)
{
struct winsdb_handle *h = NULL;
+ const char *owner;
h = talloc(mem_ctx, struct winsdb_handle);
if (!h) return NULL;
system_session(h), NULL, 0, NULL);
if (!h->ldb) goto failed;
+ owner = lp_parm_string(-1, "winsdb", "local_owner");
+ if (!owner) {
+ owner = iface_n_ip(0);
+ }
+
+ h->local_owner = talloc_strdup(h, owner);
+ if (!h->local_owner) goto failed;
+
return h;
failed:
talloc_free(h);
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#define WINSDB_OWNER_LOCAL "0.0.0.0"
-#define WINSDB_GROUP_ADDRESS "255.255.255.255"
-
#define WINSDB_FLAG_ALLOC_VERSION (1<<0)
#define WINSDB_FLAG_TAKE_OWNERSHIP (1<<1)
struct winsdb_handle {
/* wins server database handle */
struct ldb_context *ldb;
+
+ /* local owner address */
+ const char *local_owner;
};
struct wins_server {
rec.addresses = winsdb_addr_list_add(rec.addresses,
address,
- WINSDB_OWNER_LOCAL,
+ winssrv->wins_db->local_owner,
rec.expire_time);
if (rec.addresses == NULL) return NBT_RCODE_SVR;
rec->registered_by = src->addr;
if (winsdb_addr) {
- winsdb_addr->wins_owner = WINSDB_OWNER_LOCAL;
+ winsdb_addr->wins_owner = winssrv->wins_db->local_owner;
winsdb_addr->expire_time = rec->expire_time;
}
- if (strcmp(WINSDB_OWNER_LOCAL, rec->wins_owner) != 0) {
+ if (strcmp(winssrv->wins_db->local_owner, rec->wins_owner) != 0) {
modify_flags = WINSDB_FLAG_ALLOC_VERSION | WINSDB_FLAG_TAKE_OWNERSHIP;
}
rec->addresses = winsdb_addr_list_add(rec->addresses,
address,
- WINSDB_OWNER_LOCAL,
+ winssrv->wins_db->local_owner,
rec->expire_time);
if (rec->addresses == NULL) return NBT_RCODE_SVR;
break;
}
if (found) {
- rec->addresses[i]->wins_owner = WINSDB_OWNER_LOCAL;
+ rec->addresses[i]->wins_owner = s->winssrv->wins_db->local_owner;
rec->addresses[i]->expire_time = rec->expire_time;
continue;
}
rec->addresses = winsdb_addr_list_add(rec->addresses,
s->reg_address,
- WINSDB_OWNER_LOCAL,
+ s->winssrv->wins_db->local_owner,
rec->expire_time);
if (rec->addresses == NULL) goto failed;
nbtd_negative_name_query_reply(nbtsock, packet, src);
return;
}
- addresses[0] = WINSDB_GROUP_ADDRESS;
+ addresses[0] = "255.255.255.255";
addresses[1] = NULL;
goto found;
}
}
/* if we're the owner of the old record, we'll be the owner of the new one too */
- if (strcmp(rec->wins_owner, WINSDB_OWNER_LOCAL)==0) {
+ if (strcmp(rec->wins_owner, partner->service->wins_db->local_owner)==0) {
become_owner = True;
}
}
NT_STATUS_NOT_OK_RETURN(status);
- if (strcmp(rec->wins_owner, WINSDB_OWNER_LOCAL)==0) {
+ if (strcmp(rec->wins_owner, partner->service->wins_db->local_owner)==0) {
local_vs_replica = True;
} else if (strcmp(rec->wins_owner, owner->address)==0) {
same_owner = True;
talloc_steal(mem_ctx, rec->name);
name->id = rec->version;
- name->unknown = WINSDB_GROUP_ADDRESS;
+ name->unknown = "255.255.255.255";
name->flags = WREPL_NAME_FLAGS(rec->type, rec->state, rec->node, rec->is_static);
NT_STATUS_HAVE_NO_MEMORY(ips);
for (i = 0; i < num_ips; i++) {
- if (strcasecmp(WINSDB_OWNER_LOCAL, rec->addresses[i]->wins_owner) == 0) {
- ips[i].owner = talloc_strdup(ips, our_address);
- NT_STATUS_HAVE_NO_MEMORY(ips[i].owner);
- } else {
- ips[i].owner = rec->addresses[i]->wins_owner;
- talloc_steal(ips, rec->addresses[i]->wins_owner);
- }
+ ips[i].owner = rec->addresses[i]->wins_owner;
+ talloc_steal(ips, rec->addresses[i]->wins_owner);
ips[i].ip = rec->addresses[i]->address;
talloc_steal(ips, rec->addresses[i]->address);
}
if (strcmp(call->wreplconn->our_ip, owner_in->address) == 0) {
ZERO_STRUCT(local_owner);
- local_owner.owner.address = WINSDB_OWNER_LOCAL;
+ local_owner.owner.address = service->wins_db->local_owner;
local_owner.owner.min_version = 0;
local_owner.owner.max_version = wreplsrv_local_max_version(service);
local_owner.owner.type = 1;
NT_STATUS_HAVE_NO_MEMORY(names);
for (i = 0; i < res->count; i++) {
- status = winsdb_record(res->msgs[i], call, &rec);
+ status = winsdb_record(service->wins_db, res->msgs[i], call, &rec);
NT_STATUS_NOT_OK_RETURN(status);
status = wreplsrv_record2wins_name(names, call->wreplconn->our_ip, &names[i], rec);
filter = talloc_asprintf(tmp_mem,
"(&(winsOwner=%s)(objectClass=winsRecord)"
"(expireTime<=%s)(!(isStatic=1)))",
- WINSDB_OWNER_LOCAL, now_timestr);
+ service->wins_db->local_owner, now_timestr);
NT_STATUS_HAVE_NO_MEMORY(filter);
ret = ldb_search(service->wins_db->ldb, NULL, LDB_SCOPE_SUBTREE, filter, NULL, &res);
if (ret != LDB_SUCCESS) return NT_STATUS_INTERNAL_DB_CORRUPTION;
delete_tombstones = timeval_expired(&tombstone_extra_time);
for (i=0; i < res->count; i++) {
- status = winsdb_record(res->msgs[i], tmp_mem, &rec);
+ status = winsdb_record(service->wins_db, res->msgs[i], tmp_mem, &rec);
NT_STATUS_NOT_OK_RETURN(status);
if (rec->is_static) {
filter = talloc_asprintf(tmp_mem,
"(&(!(winsOwner=%s))(objectClass=winsRecord)"
"(!(recordState=%u))(expireTime<=%s)(!(isStatic=1)))",
- WINSDB_OWNER_LOCAL, WREPL_STATE_ACTIVE, now_timestr);
+ service->wins_db->local_owner, WREPL_STATE_ACTIVE, now_timestr);
NT_STATUS_HAVE_NO_MEMORY(filter);
ret = ldb_search(service->wins_db->ldb, NULL, LDB_SCOPE_SUBTREE, filter, NULL, &res);
if (ret != LDB_SUCCESS) return NT_STATUS_INTERNAL_DB_CORRUPTION;
delete_tombstones = timeval_expired(&tombstone_extra_time);
for (i=0; i < res->count; i++) {
- status = winsdb_record(res->msgs[i], tmp_mem, &rec);
+ status = winsdb_record(service->wins_db, res->msgs[i], tmp_mem, &rec);
NT_STATUS_NOT_OK_RETURN(status);
if (rec->is_static) {
filter = talloc_asprintf(tmp_mem,
"(&(!(winsOwner=%s))(objectClass=winsRecord)"
"(recordState=%u)(expireTime<=%s)(!(isStatic=1)))",
- WINSDB_OWNER_LOCAL, WREPL_STATE_ACTIVE, now_timestr);
+ service->wins_db->local_owner, WREPL_STATE_ACTIVE, now_timestr);
NT_STATUS_HAVE_NO_MEMORY(filter);
ret = ldb_search(service->wins_db->ldb, NULL, LDB_SCOPE_SUBTREE, filter, NULL, &res);
if (ret != LDB_SUCCESS) return NT_STATUS_INTERNAL_DB_CORRUPTION;
talloc_steal(tmp_mem, res);
for (i=0; i < res->count; i++) {
- status = winsdb_record(res->msgs[i], tmp_mem, &rec);
+ status = winsdb_record(service->wins_db, res->msgs[i], tmp_mem, &rec);
NT_STATUS_NOT_OK_RETURN(status);
if (rec->is_static) {
struct wreplsrv_owner *table = *_table;
struct wreplsrv_owner *cur;
- if (strcmp(WINSDB_OWNER_LOCAL, wins_owner) == 0) {
+ if (strcmp(service->wins_db->local_owner, wins_owner) == 0 ||
+ strcmp("0.0.0.0", wins_owner) == 0) {
return NT_STATUS_OK;
}