summaryrefslogtreecommitdiff
path: root/source4/nbt_server/wins/winsdb.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2005-12-30 21:12:15 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:49:05 -0500
commit905c3ff8e1e63f2151f63552e556086968424118 (patch)
treee779dacb6c33f939ccb67effc8cabbfca2ebbbc8 /source4/nbt_server/wins/winsdb.c
parent0391b1cb3a1527aed5beefbdda67a6ce5062bbab (diff)
downloadsamba-905c3ff8e1e63f2151f63552e556086968424118.tar.gz
samba-905c3ff8e1e63f2151f63552e556086968424118.tar.bz2
samba-905c3ff8e1e63f2151f63552e556086968424118.zip
r12618: use our primary interface address or the "winsdb:local_owner" -address
as winsOwner: attrbute for owned records metze (This used to be commit 37dece8304c0b9887740f4d4e8096732045a1785)
Diffstat (limited to 'source4/nbt_server/wins/winsdb.c')
-rw-r--r--source4/nbt_server/wins/winsdb.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/source4/nbt_server/wins/winsdb.c b/source4/nbt_server/wins/winsdb.c
index 42a6f19d84..47abcd4a63 100644
--- a/source4/nbt_server/wins/winsdb.c
+++ b/source4/nbt_server/wins/winsdb.c
@@ -165,14 +165,14 @@ failed:
"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);
@@ -216,6 +216,9 @@ static NTSTATUS winsdb_addr_decode(struct winsdb_record *rec, struct ldb_val *va
}
*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;
@@ -393,7 +396,7 @@ NTSTATUS winsdb_lookup(struct winsdb_handle *h,
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 */
@@ -414,7 +417,7 @@ failed:
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;
@@ -453,12 +456,8 @@ NTSTATUS winsdb_record(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct wins
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");
@@ -488,7 +487,7 @@ NTSTATUS winsdb_record(struct ldb_message *msg, TALLOC_CTX *mem_ctx, struct wins
}
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;
@@ -596,7 +595,7 @@ uint8_t winsdb_add(struct winsdb_handle *h, struct winsdb_record *rec, uint32_t
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);
@@ -637,7 +636,7 @@ uint8_t winsdb_modify(struct winsdb_handle *h, struct winsdb_record *rec, uint32
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);
@@ -698,6 +697,7 @@ failed:
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;
@@ -706,6 +706,14 @@ struct winsdb_handle *winsdb_connect(TALLOC_CTX *mem_ctx)
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);