s4: Add TALLOC_CTX * to register_server_service().
[garming/samba-autobuild/.git] / source4 / wrepl_server / wrepl_server.c
index a5c80072852650faa2ddf1dc22b22ce8aa6d5b4d..dc28e23371e574bb9cdf1d92eeb7a74cd97a3c4e 100644 (file)
 */
 
 #include "includes.h"
-#include "lib/util/dlinklist.h"
+#include "../lib/util/dlinklist.h"
 #include "smbd/service_task.h"
 #include "smbd/service.h"
 #include "lib/messaging/irpc.h"
 #include "librpc/gen_ndr/winsrepl.h"
 #include "wrepl_server/wrepl_server.h"
 #include "nbt_server/wins/winsdb.h"
-#include "ldb/include/ldb.h"
-#include "ldb/include/ldb_errors.h"
+#include <ldb.h>
+#include <ldb_errors.h>
 #include "auth/auth.h"
 #include "ldb_wrap.h"
 #include "param/param.h"
+#include "lib/socket/netif.h"
 
 static struct ldb_context *wins_config_db_connect(TALLOC_CTX *mem_ctx, 
+                                                 struct tevent_context *ev_ctx,
                                                  struct loadparm_context *lp_ctx)
 {
-       return ldb_wrap_connect(mem_ctx, lp_ctx, private_path(mem_ctx, 
-                               lp_ctx, lp_wins_config_url(lp_ctx)),
-                               system_session(mem_ctx), NULL, 0, NULL);
+       return ldb_wrap_connect(mem_ctx, ev_ctx, lp_ctx, lpcfg_private_path(mem_ctx,
+                               lp_ctx, "wins_config.ldb"),
+                               system_session(lp_ctx), NULL, 0);
 }
 
 static uint64_t wins_config_db_get_seqnumber(struct ldb_context *ldb)
@@ -53,10 +55,8 @@ static uint64_t wins_config_db_get_seqnumber(struct ldb_context *ldb)
        if (!dn) goto failed;
 
        /* find the record in the WINS database */
-       ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, 
-                        NULL, NULL, &res);
+       ret = ldb_search(ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE, NULL, NULL);
        if (ret != LDB_SUCCESS) goto failed;
-       talloc_steal(tmp_ctx, res);
        if (res->count > 1) goto failed;
 
        if (res->count == 1) {
@@ -74,37 +74,45 @@ failed:
 static NTSTATUS wreplsrv_open_winsdb(struct wreplsrv_service *service, 
                                     struct loadparm_context *lp_ctx)
 {
-       service->wins_db     = winsdb_connect(service, WINSDB_HANDLE_CALLER_WREPL);
+       const char *owner = lpcfg_parm_string(lp_ctx, NULL, "winsdb", "local_owner");
+
+       if (owner == NULL) {
+               struct interface *ifaces;
+               load_interface_list(service, lp_ctx, &ifaces);
+               owner = iface_list_first_v4(ifaces);
+       }
+
+       service->wins_db     = winsdb_connect(service, service->task->event_ctx, lp_ctx, owner, WINSDB_HANDLE_CALLER_WREPL);
        if (!service->wins_db) {
                return NT_STATUS_INTERNAL_DB_ERROR;
        }
 
-       service->config.ldb = wins_config_db_connect(service, lp_ctx);
+       service->config.ldb = wins_config_db_connect(service, service->task->event_ctx, lp_ctx);
        if (!service->config.ldb) {
                return NT_STATUS_INTERNAL_DB_ERROR;
        }
 
        /* the default renew interval is 6 days */
-       service->config.renew_interval    = lp_parm_int(lp_ctx, NULL,"wreplsrv","renew_interval", 6*24*60*60);
+       service->config.renew_interval    = lpcfg_parm_int(lp_ctx, NULL,"wreplsrv","renew_interval", 6*24*60*60);
 
        /* the default tombstone (extinction) interval is 6 days */
-       service->config.tombstone_interval= lp_parm_int(lp_ctx, NULL,"wreplsrv","tombstone_interval", 6*24*60*60);
+       service->config.tombstone_interval= lpcfg_parm_int(lp_ctx, NULL,"wreplsrv","tombstone_interval", 6*24*60*60);
 
        /* the default tombstone (extinction) timeout is 1 day */
-       service->config.tombstone_timeout = lp_parm_int(lp_ctx, NULL,"wreplsrv","tombstone_timeout", 1*24*60*60);
+       service->config.tombstone_timeout = lpcfg_parm_int(lp_ctx, NULL,"wreplsrv","tombstone_timeout", 1*24*60*60);
 
        /* the default tombstone extra timeout is 3 days */
-       service->config.tombstone_extra_timeout = lp_parm_int(lp_ctx, NULL,"wreplsrv","tombstone_extra_timeout", 3*24*60*60);
+       service->config.tombstone_extra_timeout = lpcfg_parm_int(lp_ctx, NULL,"wreplsrv","tombstone_extra_timeout", 3*24*60*60);
 
        /* the default verify interval is 24 days */
-       service->config.verify_interval   = lp_parm_int(lp_ctx, NULL,"wreplsrv","verify_interval", 24*24*60*60);
+       service->config.verify_interval   = lpcfg_parm_int(lp_ctx, NULL,"wreplsrv","verify_interval", 24*24*60*60);
 
        /* the default scavenging interval is 'renew_interval/2' */
-       service->config.scavenging_interval=lp_parm_int(lp_ctx, NULL,"wreplsrv","scavenging_interval",
+       service->config.scavenging_interval=lpcfg_parm_int(lp_ctx, NULL,"wreplsrv","scavenging_interval",
                                                        service->config.renew_interval/2);
 
        /* the maximun interval to the next periodic processing event */
-       service->config.periodic_interval = lp_parm_int(lp_ctx, NULL,"wreplsrv","periodic_interval", 15);
+       service->config.periodic_interval = lpcfg_parm_int(lp_ctx, NULL,"wreplsrv","periodic_interval", 15);
 
        return NT_STATUS_OK;
 }
@@ -131,7 +139,7 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service)
        struct ldb_result *res = NULL;
        int ret;
        TALLOC_CTX *tmp_ctx;
-       int i;
+       unsigned int i;
        uint64_t new_seqnumber;
 
        new_seqnumber = wins_config_db_get_seqnumber(service->config.ldb);
@@ -147,10 +155,10 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service)
        service->config.seqnumber = new_seqnumber;
 
        /* find the record in the WINS database */
-       ret = ldb_search(service->config.ldb, ldb_dn_new(tmp_ctx, service->config.ldb, "CN=PARTNERS"), LDB_SCOPE_SUBTREE,
-                        "(objectClass=wreplPartner)", NULL, &res);
+       ret = ldb_search(service->config.ldb, tmp_ctx, &res,
+                        ldb_dn_new(tmp_ctx, service->config.ldb, "CN=PARTNERS"),
+                        LDB_SCOPE_SUBTREE, NULL, "(objectClass=wreplPartner)");
        if (ret != LDB_SUCCESS) goto failed;
-       talloc_steal(tmp_ctx, res);
 
        /* first disable all existing partners */
        for (partner=service->partners; partner; partner = partner->next) {
@@ -184,7 +192,7 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service)
                        partner->address = address;
                        talloc_steal(partner, partner->address);
 
-                       DLIST_ADD_END(service->partners, partner, struct wreplsrv_partner *);
+                       DLIST_ADD_END(service->partners, partner);
                }
 
                partner->name                   = ldb_msg_find_attr_as_string(res->msgs[i], "name", partner->address);
@@ -199,7 +207,7 @@ NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service)
                                                                    WINSREPL_DEFAULT_PULL_RETRY_INTERVAL);
                partner->push.change_count      = ldb_msg_find_attr_as_uint(res->msgs[i], "pushChangeCount",
                                                                    WINSREPL_DEFAULT_PUSH_CHANGE_COUNT);
-               partner->push.use_inform        = ldb_msg_find_attr_as_uint(res->msgs[i], "pushUseInform", false);
+               partner->push.use_inform        = ldb_msg_find_attr_as_uint(res->msgs[i], "pushUseInform", true);
 
                DEBUG(3,("wreplsrv_load_partners: found partner: %s type: 0x%X\n",
                        partner->address, partner->type));
@@ -320,7 +328,7 @@ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service,
 
                cur->partner            = wreplsrv_find_partner(service, wins_owner);
 
-               DLIST_ADD_END(table, cur, struct wreplsrv_owner *);
+               DLIST_ADD_END(table, cur);
                *_table = table;
        }
 
@@ -355,7 +363,7 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service)
        NTSTATUS status;
        TALLOC_CTX *tmp_ctx = talloc_new(service);
        struct ldb_context *ldb = service->wins_db->ldb;
-       int i;
+       unsigned int i;
        struct wreplsrv_owner *local_owner;
        const char *wins_owner;
        uint64_t version;
@@ -381,11 +389,10 @@ static NTSTATUS wreplsrv_load_table(struct wreplsrv_service *service)
        }
 
        /* find the record in the WINS database */
-       ret = ldb_search(ldb, NULL, LDB_SCOPE_SUBTREE,
-                        "(objectClass=winsRecord)", attrs, &res);
+       ret = ldb_search(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE,
+                        attrs, "(objectClass=winsRecord)");
        status = NT_STATUS_INTERNAL_DB_CORRUPTION;
        if (ret != LDB_SUCCESS) goto failed;
-       talloc_steal(tmp_ctx, res);
 
        for (i=0; i < res->count; i++) {
                wins_owner     = ldb_msg_find_attr_as_string(res->msgs[i], "winsOwner", NULL);
@@ -444,23 +451,27 @@ static void wreplsrv_task_init(struct task_server *task)
        NTSTATUS status;
        struct wreplsrv_service *service;
 
+       if (!lpcfg_we_are_a_wins_server(task->lp_ctx)) {
+               return;
+       }
+
        task_server_set_title(task, "task[wreplsrv]");
 
        service = talloc_zero(task, struct wreplsrv_service);
        if (!service) {
-               task_server_terminate(task, "wreplsrv_task_init: out of memory");
+               task_server_terminate(task, "wreplsrv_task_init: out of memory", true);
                return;
        }
        service->task           = task;
        service->startup_time   = timeval_current();
-       task->private           = service;
+       task->private_data      = service;
 
        /*
         * setup up all partners, and open the winsdb
         */
        status = wreplsrv_open_winsdb(service, task->lp_ctx);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_open_winsdb() failed");
+               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_open_winsdb() failed", true);
                return;
        }
 
@@ -469,45 +480,33 @@ static void wreplsrv_task_init(struct task_server *task)
         */
        status = wreplsrv_setup_partners(service);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_partners() failed");
+               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_partners() failed", true);
                return;
        }
 
        /* 
-        * setup listen sockets, so we can anwser requests from our partners,
+        * setup listen sockets, so we can answer requests from our partners,
         * which pull from us
         */
        status = wreplsrv_setup_sockets(service, task->lp_ctx);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_sockets() failed");
+               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_sockets() failed", true);
                return;
        }
 
        status = wreplsrv_setup_periodic(service);
        if (!NT_STATUS_IS_OK(status)) {
-               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_periodic() failed");
+               task_server_terminate(task, "wreplsrv_task_init: wreplsrv_setup_periodic() failed", true);
                return;
        }
 
        irpc_add_name(task->msg_ctx, "wrepl_server");
 }
 
-/*
-  initialise the WREPL server
- */
-static NTSTATUS wreplsrv_init(struct event_context *event_ctx, const struct model_ops *model_ops)
-{
-       if (!lp_wins_support(global_loadparm)) {
-               return NT_STATUS_OK;
-       }
-
-       return task_server_startup(event_ctx, model_ops, wreplsrv_task_init);
-}
-
 /*
   register ourselves as a available server
 */
-NTSTATUS server_service_wrepl_init(void)
+NTSTATUS server_service_wrepl_init(TALLOC_CTX *ctx)
 {
-       return register_server_service("wrepl", wreplsrv_init);
+       return register_server_service(ctx, "wrepl", wreplsrv_task_init);
 }