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 ++++++++++++++++++++++++++++++++++++++++ source4/smb_server/smb_server.c | 44 ---------------------- source4/smb_server/wscript_build | 4 +- 3 files changed, 83 insertions(+), 46 deletions(-) create mode 100644 source4/smb_server/service_smb.c (limited to 'source4') 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); +} diff --git a/source4/smb_server/smb_server.c b/source4/smb_server/smb_server.c index 6ebefc6eba..8e54423706 100644 --- a/source4/smb_server/smb_server.c +++ b/source4/smb_server/smb_server.c @@ -199,48 +199,4 @@ _PUBLIC_ NTSTATUS smbsrv_add_socket(struct tevent_context *event_context, } -/* - 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); -} diff --git a/source4/smb_server/wscript_build b/source4/smb_server/wscript_build index 8ea4b48b81..45e697b7af 100644 --- a/source4/smb_server/wscript_build +++ b/source4/smb_server/wscript_build @@ -1,7 +1,7 @@ #!/usr/bin/env python bld.SAMBA_MODULE('SERVICE_SMB', - source='smb_server.c', + source='service_smb.c', autoproto='service_smb_proto.h', subsystem='service', init_function='server_service_smb_init', @@ -18,7 +18,7 @@ bld.SAMBA_MODULE('SERVICE_SAMBA3_SMB', bld.SAMBA_SUBSYSTEM('SMB_SERVER', - source='handle.c tcon.c session.c blob.c management.c', + source='handle.c tcon.c session.c blob.c management.c smb_server.c', autoproto='smb_server_proto.h', public_deps='share LIBPACKET SMB_PROTOCOL SMB2_PROTOCOL' ) -- cgit