r12618: use our primary interface address or the "winsdb:local_owner" -address
authorStefan Metzmacher <metze@samba.org>
Fri, 30 Dec 2005 21:12:15 +0000 (21:12 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:49:05 +0000 (13:49 -0500)
as winsOwner: attrbute for owned records

metze

source/nbt_server/wins/winsdb.c
source/nbt_server/wins/winsdb.h
source/nbt_server/wins/winsserver.c
source/wrepl_server/wrepl_apply_records.c
source/wrepl_server/wrepl_in_call.c
source/wrepl_server/wrepl_scavenging.c
source/wrepl_server/wrepl_server.c

index 42a6f19d84c298d3154617f69dc24e063ee722ab..47abcd4a630b3f3e582e104c940ef1270f0a4037 100644 (file)
@@ -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);
index f890a10148527ce67ec1ea11b960e744b9f41859..6bc1442f3cc1870a242bff5123cced2dd48df107 100644 (file)
@@ -20,9 +20,6 @@
    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)
 
@@ -53,6 +50,9 @@ struct winsdb_record {
 struct winsdb_handle {
        /* wins server database handle */
        struct ldb_context *ldb;
+
+       /* local owner address */
+       const char *local_owner;
 };
 
 struct wins_server {
index c01ab9a19ba45d3384ce02ddb938f227ef96e668..3eddfb763982b99a1d85d86c6dbd9a8903bc209f 100644 (file)
@@ -91,7 +91,7 @@ static uint8_t wins_register_new(struct nbt_name_socket *nbtsock,
 
        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;
 
@@ -122,11 +122,11 @@ static uint8_t wins_update_ttl(struct nbt_name_socket *nbtsock,
        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;
        }
 
@@ -155,7 +155,7 @@ static uint8_t wins_sgroup_merge(struct nbt_name_socket *nbtsock,
 
        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;
 
@@ -243,7 +243,7 @@ static void wins_wack_allow(struct wack_state *s)
                        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;
                }
@@ -253,7 +253,7 @@ static void wins_wack_allow(struct wack_state *s)
 
        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;
 
@@ -597,7 +597,7 @@ static void nbtd_winsserver_query(struct nbt_name_socket *nbtsock,
                        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;
        }
index 7fb73728e5d631a8d122a184f8408c645ee25206..6035041f114da26aa4c1d43b1a90e4f606e08167 100644 (file)
@@ -1187,7 +1187,7 @@ static NTSTATUS r_do_sgroup_merge(struct wreplsrv_partner *partner,
        }
 
        /* 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;
        }
 
@@ -1239,7 +1239,7 @@ static NTSTATUS wreplsrv_apply_one_record(struct wreplsrv_partner *partner,
        }
        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;
index a2637d1b39565e3085d70a07b8daba1708396e06..9bd01c14bbcc11a5b32cbfd90df7ff03bb83aaf8 100644 (file)
@@ -138,7 +138,7 @@ static NTSTATUS wreplsrv_record2wins_name(TALLOC_CTX *mem_ctx,
        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);
 
@@ -153,13 +153,8 @@ static NTSTATUS wreplsrv_record2wins_name(TALLOC_CTX *mem_ctx,
                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);
                }
@@ -190,7 +185,7 @@ static NTSTATUS wreplsrv_in_send_request(struct wreplsrv_in_call *call)
 
        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;
@@ -260,7 +255,7 @@ static NTSTATUS wreplsrv_in_send_request(struct wreplsrv_in_call *call)
        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);
index bc25354e3c3f18f8f1f0b10b666c7cd2069df34f..24ef974f2de29a0edefb2921af89c211be41fc23 100644 (file)
@@ -51,7 +51,7 @@ static NTSTATUS wreplsrv_scavenging_owned_records(struct wreplsrv_service *servi
        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;
@@ -63,7 +63,7 @@ static NTSTATUS wreplsrv_scavenging_owned_records(struct wreplsrv_service *servi
        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) {
@@ -159,7 +159,7 @@ static NTSTATUS wreplsrv_scavenging_replica_non_active_records(struct wreplsrv_s
        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;
@@ -171,7 +171,7 @@ static NTSTATUS wreplsrv_scavenging_replica_non_active_records(struct wreplsrv_s
        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) {
@@ -262,14 +262,14 @@ static NTSTATUS wreplsrv_scavenging_replica_active_records(struct wreplsrv_servi
        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) {
index 2682ca6721b51da56579e5d0f3c9e933a486f493..9f1664bc225e7a00e6f82ad41f5d70342bb21652 100644 (file)
@@ -264,7 +264,8 @@ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service,
        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;
        }