2010-10-11 02:41:22 +04:00
/*
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 < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
2020-11-20 17:27:17 +03:00
# include "samba/service_task.h"
# include "samba/service_stream.h"
# include "samba/service.h"
2010-10-11 02:41:22 +04:00
# 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"
2016-05-10 20:33:17 +03:00
# include "ntvfs/ntvfs.h"
2021-01-14 11:50:10 +03:00
# include "lib/cmdline/cmdline.h"
2010-10-11 02:41:22 +04:00
/*
open the smb server sockets
*/
2018-08-23 00:35:52 +03:00
static NTSTATUS smbsrv_task_init ( struct task_server * task )
2010-10-11 02:41:22 +04:00
{
2018-08-23 00:35:52 +03:00
NTSTATUS status = NT_STATUS_UNSUCCESSFUL ;
2010-10-11 02:41:22 +04:00
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 ;
2011-06-02 09:40:28 +04:00
load_interface_list ( task , task - > lp_ctx , & ifaces ) ;
2010-10-11 02:41:22 +04:00
2011-05-02 09:57:19 +04:00
num_interfaces = iface_list_count ( ifaces ) ;
2010-10-11 02:41:22 +04:00
/* 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 + + ) {
2011-05-02 09:57:19 +04:00
const char * address = iface_list_n_ip ( ifaces , i ) ;
2017-09-14 22:09:23 +03:00
status = smbsrv_add_socket ( task , task - > event_ctx ,
task - > lp_ctx ,
task - > model_ops ,
address ,
task - > process_context ) ;
2010-10-11 02:41:22 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) goto failed ;
}
} else {
2014-02-27 13:28:23 +04:00
char * * wcard ;
2011-05-12 14:35:02 +04:00
int i ;
2014-02-27 13:28:23 +04:00
wcard = iface_list_wildcard ( task ) ;
2011-05-12 14:35:02 +04:00
if ( wcard = = NULL ) {
DEBUG ( 0 , ( " No wildcard addresses available \n " ) ) ;
2018-08-23 00:35:52 +03:00
status = NT_STATUS_UNSUCCESSFUL ;
2011-05-12 14:35:02 +04:00
goto failed ;
}
for ( i = 0 ; wcard [ i ] ; i + + ) {
2017-09-14 22:09:23 +03:00
status = smbsrv_add_socket ( task , task - > event_ctx ,
task - > lp_ctx ,
task - > model_ops ,
wcard [ i ] ,
task - > process_context ) ;
2011-05-12 14:35:02 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) goto failed ;
}
talloc_free ( wcard ) ;
2010-10-11 02:41:22 +04:00
}
2013-05-27 14:10:57 +04:00
irpc_add_name ( task - > msg_ctx , " smb_server " ) ;
2018-08-23 00:35:52 +03:00
return NT_STATUS_OK ;
2010-10-11 02:41:22 +04:00
failed :
task_server_terminate ( task , " Failed to startup smb server task " , true ) ;
2018-08-23 00:35:52 +03:00
return status ;
2010-10-11 02:41:22 +04:00
}
/* called at smbd startup - register ourselves as a server service */
2017-04-20 22:24:43 +03:00
NTSTATUS server_service_smb_init ( TALLOC_CTX * ctx )
2010-10-11 02:41:22 +04:00
{
2021-01-14 11:50:10 +03:00
struct loadparm_context * lp_ctx = samba_cmdline_get_lp_ctx ( ) ;
2018-08-23 00:29:56 +03:00
static const struct service_details details = {
2017-09-14 22:09:23 +03:00
. inhibit_fork_on_accept = true ,
2018-08-23 00:35:52 +03:00
. inhibit_pre_fork = true ,
. task_init = smbsrv_task_init ,
. post_fork = NULL
2017-09-14 22:09:23 +03:00
} ;
2021-01-14 11:50:10 +03:00
ntvfs_init ( lp_ctx ) ;
2010-10-11 02:41:22 +04:00
share_init ( ) ;
2018-08-23 00:35:52 +03:00
return register_server_service ( ctx , " smb " , & details ) ;
2010-10-11 02:41:22 +04:00
}