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
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2003-08-13 05:53:07 +04:00
( 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
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2003-08-13 05:53:07 +04:00
*/
# include "includes.h"
2006-03-26 05:23:40 +04:00
# include "smbd/process_model.h"
2006-02-23 15:48:13 +03:00
# include "build.h"
2007-09-08 16:42:09 +04:00
# include "param/param.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
*/
2006-03-19 20:51:15 +03:00
_PUBLIC_ const struct model_ops * process_model_startup ( struct event_context * ev , 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-30 03:54:57 +03:00
ops - > model_init ( ev ) ;
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 .
*/
2006-03-19 20:51:15 +03:00
_PUBLIC_ 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
}
2007-12-03 00:32:11 +03:00
NTSTATUS process_model_init ( struct loadparm_context * lp_ctx )
2005-12-26 19:46:55 +03:00
{
2007-12-24 10:28:22 +03:00
init_module_fn static_init [ ] = { STATIC_process_model_MODULES } ;
2007-12-03 00:32:11 +03:00
init_module_fn * shared_init = load_samba_modules ( NULL , lp_ctx , " process_model " ) ;
2005-12-26 19:46:55 +03:00
run_init_functions ( static_init ) ;
run_init_functions ( shared_init ) ;
talloc_free ( shared_init ) ;
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 ,
2005-02-03 05:35:52 +03:00
sizeof ( struct model_ops )
2004-02-02 16:43:03 +03:00
} ;
return & critical_sizes ;
}