Rework service init functions to pass down service name. This is
[ira/wip.git] / source / nbt_server / nbt_server.c
index 6e4acba115651b9c6cab99513e7cfbccbbd008d6..bcdc63e984dbfe3610fa4748c3b85bad2e62f9c6 100644 (file)
@@ -7,7 +7,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
-#include "events.h"
 #include "smbd/service_task.h"
+#include "smbd/service.h"
 #include "nbt_server/nbt_server.h"
-
-
-/*
-  receive an incoming request
-*/
-static void nbt_request_handler(struct nbt_name_socket *nbtsock, 
-                               struct nbt_name_packet *packet, 
-                               const char *src_address, int src_port)
-{
-       switch (packet->operation & NBT_OPCODE) {
-       case NBT_OPCODE_QUERY:
-               nbt_request_query(nbtsock, packet, src_address, src_port);
-               break;
-       }
-}
-
+#include "nbt_server/wins/winsserver.h"
+#include "system/network.h"
+#include "lib/socket/netif.h"
+#include "auth/auth.h"
+#include "dsdb/samdb/samdb.h"
+#include "param/param.h"
 
 /*
   startup the nbtd task
 */
 static void nbtd_task_init(struct task_server *task)
 {
-       struct nbt_server *nbtsrv;
-       struct nbt_interface *iface;
+       struct nbtd_server *nbtsrv;
        NTSTATUS status;
+       struct interface *ifaces;
+
+       load_interfaces(task, lp_interfaces(task->lp_ctx), &ifaces);
+
+       if (iface_count(ifaces) == 0) {
+               task_server_terminate(task, "nbtd: no network interfaces configured");
+               return;
+       }
+
+       task_server_set_title(task, "task[nbtd]");
 
-       nbtsrv = talloc(task, struct nbt_server);
+       nbtsrv = talloc(task, struct nbtd_server);
        if (nbtsrv == NULL) {
-               task_terminate(task, "nbtd: out of memory");
+               task_server_terminate(task, "nbtd: out of memory");
                return;
        }
 
        nbtsrv->task            = task;
        nbtsrv->interfaces      = NULL;
        nbtsrv->bcast_interface = NULL;
+       nbtsrv->wins_interface  = NULL;
 
        /* start listening on the configured network interfaces */
-       status = nbt_startup_interfaces(nbtsrv);
+       status = nbtd_startup_interfaces(nbtsrv, task->lp_ctx, ifaces);
        if (!NT_STATUS_IS_OK(status)) {
-               task_terminate(task, "nbtd failed to setup interfaces");
+               task_server_terminate(task, "nbtd failed to setup interfaces");
+               return;
+       }
+
+       nbtsrv->sam_ctx = samdb_connect(nbtsrv, task->lp_ctx, anonymous_session(nbtsrv, task->lp_ctx));
+       if (nbtsrv->sam_ctx == NULL) {
+               task_server_terminate(task, "nbtd failed to open samdb");
                return;
        }
 
-       /* setup the incoming request handler for all our interfaces */
-       for (iface=nbtsrv->interfaces;iface;iface=iface->next) {
-               nbt_set_incoming_handler(iface->nbtsock, nbt_request_handler, iface);
+       /* start the WINS server, if appropriate */
+       status = nbtd_winsserver_init(nbtsrv);
+       if (!NT_STATUS_IS_OK(status)) {
+               task_server_terminate(task, "nbtd failed to start WINS server");
+               return;
        }
-       nbt_set_incoming_handler(nbtsrv->bcast_interface->nbtsock, nbt_request_handler, 
-                                nbtsrv->bcast_interface);
+
+       nbtd_register_irpc(nbtsrv);
 
        /* start the process of registering our names on all interfaces */
-       nbt_register_names(nbtsrv);
+       nbtd_register_names(nbtsrv);
+
+       irpc_add_name(task->msg_ctx, "nbt_server");
 }
 
 
 /*
   initialise the nbt server
  */
-static NTSTATUS nbtd_init(struct event_context *event_ctx, const struct model_ops *model_ops)
+static NTSTATUS nbtd_init(struct event_context *event_ctx, struct loadparm_context *lp_ctx, const struct model_ops *model_ops)
 {
-       return task_server_startup(event_ctx, model_ops, nbtd_task_init);
+       return task_server_startup(event_ctx, lp_ctx, "nbt",
+                                  model_ops, nbtd_task_init);
 }