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"
/* the list of currently registered process models */
static struct {
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-02-02 16:43:03 +03:00
static NTSTATUS register_process_model ( 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
}
models = Realloc ( models , sizeof ( models [ 0 ] ) * ( num_models + 1 ) ) ;
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 ) ,
sizeof ( struct server_context ) ,
sizeof ( struct event_context ) ,
sizeof ( struct fd_event )
} ;
return & critical_sizes ;
}
2003-08-13 05:53:07 +04:00
2004-02-02 16:43:03 +03:00
/*
initialise the PROCESS_MODEL subsystem
*/
BOOL process_model_init ( void )
2003-08-13 05:53:07 +04:00
{
2004-02-02 16:43:03 +03:00
NTSTATUS status ;
status = register_subsystem ( " process_model " , register_process_model ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
}
/* FIXME: Perhaps panic if a basic process model, such as simple, fails to initialise? */
static_init_process_model ;
DEBUG ( 3 , ( " PROCESS subsystem version %d initialised \n " , PROCESS_MODEL_VERSION ) ) ;
return True ;
2003-08-13 05:53:07 +04:00
}