From 57bf052e683e6ebc99dd85e3d1a6cf62d2fb89ea Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 11 Oct 2010 00:41:22 +0200 Subject: smb_server: Split core out of service, since the service can be built as a .so against which we can't link. --- source4/smb_server/service_smb.c | 81 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 source4/smb_server/service_smb.c (limited to 'source4/smb_server/service_smb.c') diff --git a/source4/smb_server/service_smb.c b/source4/smb_server/service_smb.c new file mode 100644 index 0000000000..54feccbe05 --- /dev/null +++ b/source4/smb_server/service_smb.c @@ -0,0 +1,81 @@ +/* + Unix SMB/CIFS implementation. + process incoming packets - main loop + Copyright (C) Andrew Tridgell 2004-2005 + Copyright (C) Stefan Metzmacher 2004-2005 + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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, see . +*/ + +#include "includes.h" +#include "smbd/service_task.h" +#include "smbd/service_stream.h" +#include "smbd/service.h" +#include "smb_server/smb_server.h" +#include "smb_server/service_smb_proto.h" +#include "lib/messaging/irpc.h" +#include "lib/stream/packet.h" +#include "libcli/smb2/smb2.h" +#include "smb_server/smb2/smb2_server.h" +#include "system/network.h" +#include "lib/socket/netif.h" +#include "param/share.h" +#include "dsdb/samdb/samdb.h" +#include "param/param.h" + +/* + open the smb server sockets +*/ +static void smbsrv_task_init(struct task_server *task) +{ + NTSTATUS status; + + task_server_set_title(task, "task[smbsrv]"); + + if (lpcfg_interfaces(task->lp_ctx) && lpcfg_bind_interfaces_only(task->lp_ctx)) { + int num_interfaces; + int i; + struct interface *ifaces; + + load_interfaces(task, lpcfg_interfaces(task->lp_ctx), &ifaces); + + num_interfaces = iface_count(ifaces); + + /* We have been given an interfaces line, and been + told to only bind to those interfaces. Create a + socket per interface and bind to only these. + */ + for(i = 0; i < num_interfaces; i++) { + const char *address = iface_n_ip(ifaces, i); + status = smbsrv_add_socket(task->event_ctx, task->lp_ctx, task->model_ops, address); + if (!NT_STATUS_IS_OK(status)) goto failed; + } + } else { + /* Just bind to lpcfg_socket_address() (usually 0.0.0.0) */ + status = smbsrv_add_socket(task->event_ctx, task->lp_ctx, task->model_ops, + lpcfg_socket_address(task->lp_ctx)); + if (!NT_STATUS_IS_OK(status)) goto failed; + } + + return; +failed: + task_server_terminate(task, "Failed to startup smb server task", true); +} + +/* called at smbd startup - register ourselves as a server service */ +NTSTATUS server_service_smb_init(void) +{ + share_init(); + return register_server_service("smb", smbsrv_task_init); +} -- cgit