2003-08-13 05:53:07 +04:00
/*
Unix SMB / CIFS implementation .
process model : process ( 1 process handles all client connections )
Copyright ( C ) Andrew Tridgell 2003
Copyright ( C ) James J Myers 2003 < myersjj @ samba . org >
2004-07-14 01:04:56 +04:00
Copyright ( C ) Stefan ( metze ) Metzmacher 2004
2003-08-13 05:53:07 +04:00
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
( 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 , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
2004-11-02 15:15:17 +03:00
# include "events.h"
2004-11-02 09:42:15 +03:00
# include "dlinklist.h"
2004-11-02 10:18:24 +03:00
# include "smb_server/smb_server.h"
# include "process_model.h"
2003-08-13 05:53:07 +04:00
2004-07-14 01:04:56 +04:00
2003-08-13 05:53:07 +04:00
/*
called when the process model is selected
*/
2004-07-14 01:04:56 +04:00
static void single_start_server ( void )
2003-08-13 05:53:07 +04:00
{
smbd_process_init ( ) ;
}
/*
called when a listening socket becomes readable
*/
2004-07-14 01:04:56 +04:00
static void single_accept_connection ( struct event_context * ev , struct fd_event * srv_fde , time_t t , uint16_t flags )
2003-08-13 05:53:07 +04:00
{
2004-09-20 16:31:07 +04:00
NTSTATUS status ;
struct socket_context * sock ;
2004-07-14 01:04:56 +04:00
struct server_socket * server_socket = srv_fde - > private ;
struct server_connection * conn ;
2003-08-13 05:53:07 +04:00
/* accept an incoming connection. */
2004-10-28 11:55:33 +04:00
status = socket_accept ( server_socket - > socket , & sock ) ;
2004-09-20 16:31:07 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2003-08-13 05:53:07 +04:00
DEBUG ( 0 , ( " accept_connection_single: accept: %s \n " ,
2004-09-20 16:31:07 +04:00
nt_errstr ( status ) ) ) ;
2003-08-13 05:53:07 +04:00
return ;
}
2004-10-17 06:55:47 +04:00
conn = server_setup_connection ( ev , server_socket , sock , t , socket_get_fd ( sock ) ) ;
2004-07-14 01:04:56 +04:00
if ( ! conn ) {
2004-09-20 16:31:07 +04:00
DEBUG ( 0 , ( " server_setup_connection(ev, server_socket, sock, t) failed \n " ) ) ;
2003-12-13 13:58:48 +03:00
return ;
}
2004-07-14 01:04:56 +04:00
2004-09-26 07:05:04 +04:00
talloc_steal ( conn , sock ) ;
2004-07-14 01:04:56 +04:00
DLIST_ADD ( server_socket - > connection_list , conn ) ;
/* return to event handling */
return ;
2003-08-13 05:53:07 +04:00
}
2004-07-14 01:04:56 +04:00
/* called when a SMB connection goes down */
static void single_terminate_connection ( struct server_connection * conn , const char * reason )
2003-12-14 02:25:15 +03:00
{
2004-09-24 10:52:19 +04:00
DEBUG ( 2 , ( " single_terminate_connection: reason[%s] \n " , reason ) ) ;
2004-07-15 13:43:32 +04:00
if ( conn ) {
2004-09-26 07:50:24 +04:00
talloc_free ( conn ) ;
2004-07-15 13:43:32 +04:00
}
2003-12-14 02:25:15 +03:00
}
2004-07-14 01:04:56 +04:00
static int single_get_id ( struct smbsrv_request * req )
2003-08-13 05:53:07 +04:00
{
2004-06-29 11:40:14 +04:00
return ( int ) req - > smb_conn - > pid ;
2003-08-13 05:53:07 +04:00
}
2004-07-14 01:04:56 +04:00
static void single_exit_server ( struct server_context * srv_ctx , const char * reason )
2004-02-02 16:43:03 +03:00
{
DEBUG ( 1 , ( " single_exit_server: reason[%s] \n " , reason ) ) ;
}
2003-08-13 05:53:07 +04:00
/*
2004-02-02 16:43:03 +03:00
initialise the single process model , registering ourselves with the process model subsystem
2003-08-13 05:53:07 +04:00
*/
2004-02-02 16:43:03 +03:00
NTSTATUS process_model_single_init ( void )
2003-08-13 05:53:07 +04:00
{
2004-02-02 16:43:03 +03:00
NTSTATUS ret ;
2003-08-13 05:53:07 +04:00
struct model_ops ops ;
ZERO_STRUCT ( ops ) ;
2004-02-02 16:43:03 +03:00
/* fill in our name */
ops . name = " single " ;
2003-08-13 05:53:07 +04:00
/* fill in all the operations */
2004-07-14 01:04:56 +04:00
ops . model_startup = single_start_server ;
ops . accept_connection = single_accept_connection ;
ops . terminate_connection = single_terminate_connection ;
ops . exit_server = single_exit_server ;
ops . get_id = single_get_id ;
2003-08-13 05:53:07 +04:00
2004-02-02 16:43:03 +03:00
/* register ourselves with the PROCESS_MODEL subsystem. */
ret = register_backend ( " process_model " , & ops ) ;
if ( ! NT_STATUS_IS_OK ( ret ) ) {
DEBUG ( 0 , ( " Failed to register process_model 'single'! \n " ) ) ;
return ret ;
}
return ret ;
2003-08-13 05:53:07 +04:00
}