r11047:
authorStefan Metzmacher <metze@samba.org>
Fri, 14 Oct 2005 13:00:36 +0000 (13:00 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:44:42 +0000 (13:44 -0500)
(This used to be commit 177d60f42ac05da2efe47fe4911bc5818662a7cd)

source4/nbt_server/wins/winsdb.c

index 7a4afd9b3b3998317afa6b7daeb9502d57f2fb16..49ffb13797f0625f8a9ab23b6505a3fe319a148e 100644 (file)
@@ -149,14 +149,79 @@ failed:
  "172.31.1.1;winsOwner:172.31.9.202;expireTime:20050923032330.0Z;"
  are valid records
 */
-static BOOL winsdb_remove_version(struct wins_server *winssrv, uint64_t version)
+static NTSTATUS winsdb_addr_decode(struct winsdb_record *rec, struct ldb_val *val,
+                                  TALLOC_CTX *mem_ctx, struct winsdb_addr **_addr)
 {
-       if (version == winssrv->min_version) {
-               winssrv->min_version++;
-               return winsdb_save_version(winssrv);
+       NTSTATUS status;
+       struct winsdb_addr *addr;
+       char *address;
+       char *wins_owner;
+       char *expire_time;
+       char *p;
+
+       addr = talloc(mem_ctx, struct winsdb_addr);
+       if (!addr) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       address = (char *)val->data;
+
+       p = strchr(address, ';');
+       if (!p) {
+               /* support old entries, with only the address */
+               addr->address           = talloc_steal(addr, val->data);
+               addr->wins_owner        = rec->wins_owner;
+               addr->expire_time       = rec->expire_time;
+               *_addr = addr;
+               return NT_STATUS_OK;
+       }
+
+       *p = '\0';p++;
+       addr->address = talloc_strdup(addr, address);
+       if (!addr->address) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
        }
 
-       return True;
+       if (strncmp("winsOwner:", p, 10) != 0) {
+               status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+               goto failed;
+       }
+       wins_owner = p + 10;
+       p = strchr(wins_owner, ';');
+       if (!p) {
+               status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+               goto failed;
+       }
+
+       *p = '\0';p++;
+       addr->wins_owner = talloc_strdup(addr, wins_owner);
+       if (!addr->wins_owner) {
+               status = NT_STATUS_NO_MEMORY;
+               goto failed;
+       }
+
+       if (strncmp("expireTime:", p, 11) != 0) {
+               status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+               goto failed;
+       }
+
+       expire_time = p + 11;
+       p = strchr(expire_time, ';');
+       if (!p) {
+               status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+               goto failed;
+       }
+
+       *p = '\0';p++;
+       addr->expire_time = ldap_string_to_time(expire_time);
+
+       *_addr = addr;
+       return NT_STATUS_OK;
+failed:
+       talloc_free(addr);
+       return status;
 }
 
 /*
@@ -784,9 +849,6 @@ uint8_t winsdb_delete(struct wins_server *winssrv, struct winsdb_record *rec)
        int trans;
        int ret;
 
-       trans = ldb_transaction_start(ldb);
-       if (trans != LDB_SUCCESS) goto failed;
-
        if(!winsdb_remove_version(winssrv, rec->version))
                goto failed;