1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00
samba-mirror/source4/smbd/process_model.c

126 lines
3.2 KiB
C
Raw Normal View History

/*
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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
#include "smbd/process_model.h"
#include "build.h"
#include "param/param.h"
/*
setup the events for the chosen process model
*/
_PUBLIC_ const struct model_ops *process_model_startup(struct event_context *ev, const char *model)
{
const struct model_ops *ops;
ops = process_model_byname(model);
if (!ops) {
DEBUG(0,("Unknown process model '%s'\n", model));
exit(-1);
}
r5102: This is a major simplification of the logic for controlling top level servers in smbd. The old code still contained a fairly bit of legacy from the time when smbd was only handling SMB connection. The new code gets rid of all of the smb_server specific code in smbd/, and creates a much simpler infrastructures for new server code. Major changes include: - simplified the process model code a lot. - got rid of the top level server and service structures completely. The top level context is now the event_context. This got rid of service.h and server.h completely (they were the most confusing parts of the old code) - added service_stream.[ch] for the helper functions that are specific to stream type services (services that handle streams, and use a logically separate process per connection) - got rid of the builtin idle_handler code in the service logic, as none of the servers were using it, and it can easily be handled by a server in future by adding its own timed_event to the event context. - fixed some major memory leaks in the rpc server code. - added registration of servers, rather than hard coding our list of possible servers. This allows for servers as modules in the future. - temporarily disabled the winbind code until I add the helper functions for that type of server - added error checking on service startup. If a configured server fails to startup then smbd doesn't startup. - cleaned up the command line handling in smbd, removing unused options (This used to be commit cf6a46c3cbde7b1eb1b86bd3882b953a2de3a42e)
2005-01-30 03:54:57 +03:00
ops->model_init(ev);
return ops;
}
/* the list of currently registered process models */
static struct process_model {
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.
*/
_PUBLIC_ NTSTATUS register_process_model(const void *_ops)
{
const struct model_ops *ops = _ops;
if (process_model_byname(ops->name) != NULL) {
/* its already registered! */
DEBUG(0,("PROCESS_MODEL '%s' already registered\n",
ops->name));
return NT_STATUS_OBJECT_NAME_COLLISION;
}
models = realloc_p(models, struct process_model, num_models+1);
if (!models) {
smb_panic("out of memory in register_process_model");
}
models[num_models].ops = smb_xmemdup(ops, sizeof(*ops));
models[num_models].ops->name = smb_xstrdup(ops->name);
num_models++;
DEBUG(3,("PROCESS_MODEL '%s' registered\n",
ops->name));
return NT_STATUS_OK;
}
NTSTATUS process_model_init(struct loadparm_context *lp_ctx)
{
init_module_fn static_init[] = { STATIC_process_model_MODULES };
init_module_fn *shared_init = load_samba_modules(NULL, lp_ctx, "process_model");
run_init_functions(static_init);
run_init_functions(shared_init);
talloc_free(shared_init);
return NT_STATUS_OK;
}
/*
return the operations structure for a named backend of the specified type
*/
const struct model_ops *process_model_byname(const char *name)
{
int i;
for (i=0;i<num_models;i++) {
if (strcmp(models[i].ops->name, name) == 0) {
return models[i].ops;
}
}
return NULL;
}
/*
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)
};
return &critical_sizes;
}