2003-08-13 05:53:07 +04:00
/*
Unix SMB / CIFS implementation .
process model manager - main loop
Copyright ( C ) Andrew Tridgell 1992 - 2003
Copyright ( C ) James J Myers 2003 < myersjj @ samba . org >
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 10:18:24 +03:00
# include "smb_server/smb_server.h"
# include "smbd/process_model.h"
2003-08-13 05:53:07 +04:00
2004-06-24 03:44:50 +04:00
/*
setup the events for the chosen process model
*/
2005-01-14 04:32:56 +03:00
const struct model_ops * process_model_startup ( struct server_context * srv_ctx , const char * model )
2004-06-24 03:44:50 +04:00
{
const struct model_ops * ops ;
ops = process_model_byname ( model ) ;
if ( ! ops ) {
DEBUG ( 0 , ( " Unknown process model '%s' \n " , model ) ) ;
exit ( - 1 ) ;
}
2005-01-14 04:32:56 +03:00
ops - > model_init ( srv_ctx ) ;
2004-06-24 03:44:50 +04:00
2004-07-14 01:04:56 +04:00
return ops ;
2004-06-24 03:44:50 +04:00
}
2003-08-13 05:53:07 +04:00
/* the list of currently registered process models */
2004-12-03 09:42:06 +03:00
static struct process_model {
2003-08-13 05:53:07 +04:00
struct model_ops * ops ;
} * models = NULL ;
static int num_models ;
/*
register a process model .
The ' name ' can be later used by other backends to find the operations
structure for this backend .
*/
2004-11-15 01:23:23 +03:00
NTSTATUS register_process_model ( const void * _ops )
2003-08-13 05:53:07 +04:00
{
2004-02-02 16:43:03 +03:00
const struct model_ops * ops = _ops ;
if ( process_model_byname ( ops - > name ) ! = NULL ) {
2003-08-13 05:53:07 +04:00
/* its already registered! */
2004-02-02 16:43:03 +03:00
DEBUG ( 0 , ( " PROCESS_MODEL '%s' already registered \n " ,
ops - > name ) ) ;
return NT_STATUS_OBJECT_NAME_COLLISION ;
2003-08-13 05:53:07 +04:00
}
2004-12-03 09:42:06 +03:00
models = realloc_p ( models , struct process_model , num_models + 1 ) ;
2003-08-13 05:53:07 +04:00
if ( ! models ) {
smb_panic ( " out of memory in register_process_model " ) ;
}
models [ num_models ] . ops = smb_xmemdup ( ops , sizeof ( * ops ) ) ;
2004-02-02 16:43:03 +03:00
models [ num_models ] . ops - > name = smb_xstrdup ( ops - > name ) ;
2003-08-13 05:53:07 +04:00
num_models + + ;
2004-02-02 16:43:03 +03:00
DEBUG ( 3 , ( " PROCESS_MODEL '%s' registered \n " ,
ops - > name ) ) ;
return NT_STATUS_OK ;
2003-08-13 05:53:07 +04:00
}
/*
return the operations structure for a named backend of the specified type
*/
2004-02-02 16:43:03 +03:00
const struct model_ops * process_model_byname ( const char * name )
2003-08-13 05:53:07 +04:00
{
int i ;
for ( i = 0 ; i < num_models ; i + + ) {
2004-02-02 16:43:03 +03:00
if ( strcmp ( models [ i ] . ops - > name , name ) = = 0 ) {
2003-08-13 05:53:07 +04:00
return models [ i ] . ops ;
}
}
return NULL ;
}
2004-02-02 16:43:03 +03:00
/*
return the PROCESS_MODEL module version , and the size of some critical types
This can be used by process model modules to either detect compilation errors , or provide
multiple implementations for different smbd compilation options in one module
*/
const struct process_model_critical_sizes * process_model_version ( void )
{
static const struct process_model_critical_sizes critical_sizes = {
PROCESS_MODEL_VERSION ,
sizeof ( struct model_ops ) ,
2004-06-29 11:40:14 +04:00
sizeof ( struct smbsrv_connection ) ,
2004-02-02 16:43:03 +03:00
sizeof ( struct event_context ) ,
sizeof ( struct fd_event )
} ;
return & critical_sizes ;
}