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"
# 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"
2011-05-03 03:35:07 +04:00
# include "file_server/file_server.h"
2010-10-11 02:41:22 +04:00
/*
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 ;
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 ) ;
2010-11-15 02:12:22 +03:00
status = smbsrv_add_socket ( task , task - > event_ctx , task - > lp_ctx , task - > model_ops , address ) ;
2010-10-11 02:41:22 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) goto failed ;
}
} else {
2011-05-12 14:35:02 +04:00
const char * * wcard ;
int i ;
wcard = iface_list_wildcard ( task , task - > lp_ctx ) ;
if ( wcard = = NULL ) {
DEBUG ( 0 , ( " No wildcard addresses available \n " ) ) ;
goto failed ;
}
for ( i = 0 ; wcard [ i ] ; i + + ) {
status = smbsrv_add_socket ( task , task - > event_ctx , task - > lp_ctx , task - > model_ops , wcard [ i ] ) ;
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 " ) ;
2010-10-11 02:41:22 +04:00
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 ) ;
}