2003-08-13 01:53:07 +00: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"
2006-03-26 01:23:40 +00:00
# include "smbd/process_model.h"
2006-02-23 12:48:13 +00:00
# include "build.h"
2003-08-13 01:53:07 +00:00
2004-06-23 23:44:50 +00:00
/*
setup the events for the chosen process model
*/
2006-03-19 17:51:15 +00:00
_PUBLIC_ const struct model_ops * process_model_startup ( struct event_context * ev , const char * model )
2004-06-23 23:44:50 +00: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-30 00:54:57 +00:00
ops - > model_init ( ev ) ;
2004-06-23 23:44:50 +00:00
2004-07-13 21:04:56 +00:00
return ops ;
2004-06-23 23:44:50 +00:00
}
2003-08-13 01:53:07 +00:00
/* the list of currently registered process models */
2004-12-03 06:42:06 +00:00
static struct process_model {
2003-08-13 01:53:07 +00: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 .
*/
2006-03-19 17:51:15 +00:00
_PUBLIC_ NTSTATUS register_process_model ( const void * _ops )
2003-08-13 01:53:07 +00:00
{
2004-02-02 13:43:03 +00:00
const struct model_ops * ops = _ops ;
if ( process_model_byname ( ops - > name ) ! = NULL ) {
2003-08-13 01:53:07 +00:00
/* its already registered! */
2004-02-02 13:43:03 +00:00
DEBUG ( 0 , ( " PROCESS_MODEL '%s' already registered \n " ,
ops - > name ) ) ;
return NT_STATUS_OBJECT_NAME_COLLISION ;
2003-08-13 01:53:07 +00:00
}
2004-12-03 06:42:06 +00:00
models = realloc_p ( models , struct process_model , num_models + 1 ) ;
2003-08-13 01:53:07 +00:00
if ( ! models ) {
smb_panic ( " out of memory in register_process_model " ) ;
}
models [ num_models ] . ops = smb_xmemdup ( ops , sizeof ( * ops ) ) ;
2004-02-02 13:43:03 +00:00
models [ num_models ] . ops - > name = smb_xstrdup ( ops - > name ) ;
2003-08-13 01:53:07 +00:00
num_models + + ;
2004-02-02 13:43:03 +00:00
DEBUG ( 3 , ( " PROCESS_MODEL '%s' registered \n " ,
ops - > name ) ) ;
return NT_STATUS_OK ;
2003-08-13 01:53:07 +00:00
}
2005-12-26 16:46:55 +00:00
NTSTATUS process_model_init ( void )
{
2006-03-09 19:55:04 +00:00
init_module_fn static_init [ ] = STATIC_process_model_MODULES ;
2005-12-26 16:46:55 +00:00
init_module_fn * shared_init = load_samba_modules ( NULL , " process_model " ) ;
run_init_functions ( static_init ) ;
run_init_functions ( shared_init ) ;
talloc_free ( shared_init ) ;
return NT_STATUS_OK ;
}
2003-08-13 01:53:07 +00:00
/*
return the operations structure for a named backend of the specified type
*/
2004-02-02 13:43:03 +00:00
const struct model_ops * process_model_byname ( const char * name )
2003-08-13 01:53:07 +00:00
{
int i ;
for ( i = 0 ; i < num_models ; i + + ) {
2004-02-02 13:43:03 +00:00
if ( strcmp ( models [ i ] . ops - > name , name ) = = 0 ) {
2003-08-13 01:53:07 +00:00
return models [ i ] . ops ;
}
}
return NULL ;
}
2004-02-02 13:43:03 +00: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 ,
2005-02-03 02:35:52 +00:00
sizeof ( struct model_ops )
2004-02-02 13:43:03 +00:00
} ;
return & critical_sizes ;
}