1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +03:00

- we now specify the object files in the subsystems config.m4 file

I plan to convert all objectfile group to use SMB_SUBSYSTEM
  later I'll add a SMB_BINARY() and SMB_LIBRARY(), then there will be no more need
  to touch Makefile.in, because all make rules will be autogenerated by configure

- convert the PROCESS_MODEL subsystem to this new scheme
  and move the pthread test to smbd/process_model.m4

- convert the CHARSET subsystem to this new scheme
  and move the iconv test to lib/iconv.m4
This commit is contained in:
Stefan Metzmacher -
parent 5ac4f87868
commit 2e57ee884e
15 changed files with 355 additions and 201 deletions

View File

@ -98,7 +98,9 @@ MODULES = $(CHARSET_MODULES) $(DCERPC_MODULES) $(NTVFS_MODULES)
TDBBASE_OBJ = tdb/tdb.o tdb/spinlock.o
TDB_OBJ = $(TDBBASE_OBJ) tdb/tdbutil.o
LIB_OBJ = lib/version.o lib/charcnv.o lib/debug.o lib/fault.o \
CHARSET_OBJS = @CHARSET_OBJS@
LIB_OBJ = lib/version.o lib/debug.o lib/fault.o \
lib/getsmbpass.o lib/interface.o lib/md4.o \
lib/interfaces.o lib/pidfile.o lib/replace.o \
lib/signal.o lib/system.o lib/sendfile.o lib/time.o \
@ -112,12 +114,12 @@ LIB_OBJ = lib/version.o lib/charcnv.o lib/debug.o lib/fault.o \
lib/talloc.o lib/substitute.o lib/fsusage.o \
lib/ms_fnmatch.o lib/select.o lib/messages.o \
lib/tallocmsg.o lib/dmallocmsg.o \
lib/md5.o lib/hmacmd5.o lib/iconv.o lib/smbpasswd.o \
lib/md5.o lib/hmacmd5.o lib/smbpasswd.o \
nsswitch/wb_client.o nsswitch/wb_common.o \
lib/pam_errors.o intl/lang_tdb.o lib/account_pol.o \
lib/gencache.o $(TDB_OBJ) \
lib/module.o \
lib/ldap_escape.o lib/events.o lib/mutex.o
lib/ldap_escape.o lib/events.o lib/mutex.o $(CHARSET_OBJS)
READLINE_OBJ = lib/readline.o
@ -197,42 +199,32 @@ AUTH_OBJ = auth/auth.o auth/auth_sam.o \
SMBD_OBJ_MAIN = smbd/server.o
NTVFS_CIFS_OBJ = ntvfs/cifs/vfs_cifs.o
NTVFS_SIMPLE_OBJ = ntvfs/simple/vfs_simple.o ntvfs/simple/svfs_util.o
NTVFS_IPC_OBJ = ntvfs/ipc/vfs_ipc.o
NTVFS_PRINT_OBJ = ntvfs/print/vfs_print.o
NTVFS_POSIX_OBJ = ntvfs/posix/vfs_posix.o
NTVFS_OBJS = @NTVFS_OBJS@
NTVFS_LIBS = @NTVFS_LIBS@
SMBD_NTVFS_OBJ = ntvfs/ntvfs_base.o ntvfs/ntvfs_util.o \
ntvfs/ntvfs_generic.o @NTVFS_STATIC@
DCERPC_RPCECHO_OBJ = rpc_server/echo/rpc_echo.o
DCERPC_EPMAPPER_OBJ = rpc_server/epmapper/rpc_epmapper.o
DCERPC_REMOTE_OBJ = rpc_server/remote/dcesrv_remote.o
SMBD_RPC_OBJ = rpc_server/dcerpc_server.o rpc_server/dcesrv_auth.o \
rpc_server/dcerpc_tcp.o rpc_server/handles.o @DCERPC_STATIC@
DCERPC_OBJS = @DCERPC_OBJS@
DCERPC_LIBS = @DCERPC_LIBS@
SMBD_OBJ_SRV = smbd/connection.o \
smbd/session.o \
smbd/session.o smbd/process.o \
smbd/password.o smbd/conn.o \
smbd/negprot.o smbd/request.o \
smbd/reply.o smbd/sesssetup.o \
smbd/trans2.o smbd/search.o smbd/nttrans.o \
lib/server_mutex.o \
smbd/build_options.o smbd/service.o \
smbd/rewrite.o $(SMBD_RPC_OBJ) \
$(SMBD_NTVFS_OBJ) @SMBD_EXTRA_OBJS@
smbd/rewrite.o $(DCERPC_OBJS) \
$(NTVFS_OBJS) @SMBD_EXTRA_OBJS@
PROCESS_MODEL_OBJ = smbd/process.o smbd/process_model.o smbd/process_standard.o \
smbd/process_single.o
PROCESS_MODEL_OBJS = @PROCESS_MODEL_OBJS@
PROCESS_MODEL_LIBS = @PROCESS_MODEL_LIBS@
SMBD_OBJ_BASE = $(PROCESS_MODEL_OBJ) $(SMBD_OBJ_SRV) \
SMBD_OBJ_BASE = $(PROCESS_MODEL_OBJS) $(SMBD_OBJ_SRV) \
$(PARAM_OBJ) $(SECRETS_OBJ) $(PASSDB_OBJ) \
$(AUTH_OBJ) $(LIB_OBJ) $(POPT_LIB_OBJ) $(LIBSMB_OBJ)
SMBD_OBJ = $(SMBD_OBJ_MAIN) $(SMBD_OBJ_BASE)
SMBD_OBJS = $(SMBD_OBJ_MAIN) $(SMBD_OBJ_BASE) @BUILD_POPT@
SMBD_LIBS = $(LIBS) $(PROCESS_MODEL_LIBS) $(DCERPC_LIBS) $(NTVFS_LIBS)
CLIENT_OBJ1 = client/client.o client/clitar.o libcli/raw/clirewrite.o
@ -273,14 +265,14 @@ NDRDUMP_OBJ = utils/ndrdump.o utils/rewrite.o \
$(LIBSMB_OBJ) $(PARAM_OBJ) $(LIB_OBJ)
PROTO_OBJ = $(SMBD_OBJ_SRV) \
$(SMBD_OBJ_MAIN) $(PROCESS_MODEL_OBJ) \
$(SMBD_OBJ_MAIN) $(PROCESS_MODEL_OBJS) \
$(LIBSMB_OBJ) \
$(LIBRAW_OBJ) $(LIBCLIAUTH_OBJ) \
$(SMBTORTURE_OBJ1) \
$(AUTH_OBJ) $(PARAM_OBJ) $(SECRETS_OBJ) \
$(PASSDB_OBJ) \
$(READLINE_OBJ) $(CLIENT_OBJ1) \
$(LIB_OBJ) $(POPT_LIB_OBJ)
$(LIB_OBJ) $(POPT_LIB_OBJ) \
POPT_OBJS=popt/findme.o popt/popt.o popt/poptconfig.o \
popt/popthelp.o popt/poptparse.o
@ -398,10 +390,9 @@ bin/.dummy:
dir=bin $(MAKEDIR); fi
@: >> $@ || : > $@ # what a fancy emoticon!
bin/smbd@EXEEXT@: $(SMBD_OBJ) @BUILD_POPT@ bin/.dummy
bin/smbd@EXEEXT@: $(SMBD_OBJS) bin/.dummy
@echo Linking $@
@$(CC) $(FLAGS) -o $@ $(SMBD_OBJ) $(LDFLAGS) $(DYNEXP) \
$(LIBS) @SMBD_EXTRA_LIBS@ @BUILD_POPT@
@$(CC) $(FLAGS) -o $@ $(SMBD_OBJS) $(LDFLAGS) $(DYNEXP) $(SMBD_LIBS)
bin/smbclient@EXEEXT@: $(CLIENT_OBJ) @BUILD_POPT@ bin/.dummy
@echo Linking $@
@ -528,7 +519,7 @@ proto_test:
.PHONY: headers proto
realclean: clean delheaders
-rm -f config.log $(BIN_PROGS) $(MODULES) $(SBIN_PROGS) bin/.dummy script/findsmb
-rm -f config.log $(BIN_PROGS) $(MODULES) $(SBIN_PROGS) bin/.dummy
distclean: realclean
-rm -f include/stamp-h

32
source/aclocal.m4 vendored
View File

@ -49,7 +49,7 @@ AC_DEFUN(SMB_MODULE_DEFAULT,
])
dnl Mark specified module as shared
dnl SMB_MODULE(1:name,2:subsystem,3:default_build,4:object_files,5:shared_object,6:libs,7:whatif-static,8:whatif-shared,9:whatif-not)
dnl SMB_MODULE(1:name,2:subsystem,3:default_build,4:object_files,5:private_proto_file,6:libs,7:whatif-static,8:whatif-shared,9:whatif-not)
AC_DEFUN(SMB_MODULE,
[
AC_MSG_CHECKING([how to build $1])
@ -71,7 +71,8 @@ AC_DEFUN(SMB_MODULE,
if test x"$DEST" = xSHARED; then
AC_DEFINE([$1][_init], [init_module], [Whether to build $1 as shared module])
$2_MODULES="$$2_MODULES $5"
$2_MODULES="$$2_MODULES bin/$1.$SHLIBEXT"
[MODULE_][$1][_PROTO]="$5"
[MODULE_][$1][_LIBS]="$6"
AC_MSG_RESULT([shared])
[$8]
@ -79,6 +80,7 @@ AC_DEFUN(SMB_MODULE,
elif test x"$DEST" = xSTATIC; then
[init_static_modules_]translit([$2], [A-Z], [a-z])="$[init_static_modules_]translit([$2], [A-Z], [a-z]) $1_init();"
string_static_modules="$string_static_modules $1"
[MODULE_][$1][_PROTO]="$5"
$2_STATIC="$$2_STATIC $4"
$2_LIBS="$$2_LIBS $6"
[$7]
@ -90,13 +92,35 @@ AC_DEFUN(SMB_MODULE,
fi
])
dnl Mark specified module as shared
dnl SMB_SUBSYSTEM(1:name,2:init_objectfile)
dnl SMB_SUBSYSTEM(1:name,2:init_objectfile,3:extra_objectfiles,4:public_proto_header,5:private_proto_header,6:libs)
AC_DEFUN(SMB_SUBSYSTEM,
[
dnl the core object files of the subsystem
$1_BASE="$2 $3"
AC_SUBST($1_BASE)
dnl the staticly linked modules of the subsystem
AC_SUBST($1_STATIC)
dnl all object files of the subsystem
$1_OBJS="$$1_BASE $$1_STATIC"
AC_SUBST($1_OBJS)
dnl the libs required by the subsystem
$1_LIBS="$6 $$1_LIBS"
AC_SUBST($1_LIBS)
dnl the shared objects modules of the subsystem
AC_SUBST($1_MODULES)
dnl the public_prototype_header file
$1_PUBLIC_HEADER="$4"
AC_SUBST($1_PUBLIC_PROTO)
dnl the private_prototype_header file
$1_PRIVATE_HEADER="$5"
AC_SUBST($1_PRIVATE_PROTO)
AC_DEFINE_UNQUOTED([static_init_]translit([$1], [A-Z], [a-z]), [{$init_static_modules_]translit([$1], [A-Z], [a-z])[}], [Static init functions])
ifelse([$2], , :, [rm -f $2])
])

View File

@ -1248,70 +1248,6 @@ if test x"$samba_cv_HAVE_UTIMBUF" = x"yes"; then
AC_DEFINE(HAVE_UTIMBUF,1,[Whether struct utimbuf is available])
fi
ICONV_LOCATION=standard
LOOK_DIRS="/usr /usr/local /sw"
AC_ARG_WITH(libiconv,
[ --with-libiconv=BASEDIR Use libiconv in BASEDIR/lib and BASEDIR/include (default=auto) ],
[
if test "$withval" = "no" ; then
AC_MSG_ERROR(I won't take no for an answer)
else
if test "$withval" != "yes" ; then
LOOK_DIRS="$withval $LOOK_DIRS"
fi
fi
])
ICONV_FOUND="no"
for i in $LOOK_DIRS ; do
save_LIBS=$LIBS
save_LDFLAGS=$LDFLAGS
save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="-I$i/include"
LDFLAGS="-L$i/lib"
LIBS=
export LDFLAGS LIBS CPPFLAGS
dnl Try to find iconv(3)
jm_ICONV($i)
CPPFLAGS=$save_CPPFLAGS
if test -n "$ICONV_FOUND" ; then
LDFLAGS=$save_LDFLAGS
LIB_ADD_DIR(LDFLAGS, "$i/lib")
CFLAGS_ADD_DIR(CPPFLAGS, "$i/include")
LIBS="$save_LIBS $LIBS"
ICONV_LOCATION=$i
export LDFLAGS LIBS CPPFLAGS
break
else
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS
export LDFLAGS LIBS CPPFLAGS
fi
done
############
# check for iconv in libc
AC_CACHE_CHECK([for working iconv],samba_cv_HAVE_NATIVE_ICONV,[
AC_TRY_RUN([
#include <iconv.h>
main() {
iconv_t cd = iconv_open("ASCII", "UCS-2LE");
if (cd == 0 || cd == (iconv_t)-1) return -1;
return 0;
}
],
samba_cv_HAVE_NATIVE_ICONV=yes,samba_cv_HAVE_NATIVE_ICONV=no,samba_cv_HAVE_NATIVE_ICONV=cross)])
if test x"$samba_cv_HAVE_NATIVE_ICONV" = x"yes"; then
AC_DEFINE(HAVE_NATIVE_ICONV,1,[Whether to use native iconv])
fi
if test x"$ICONV_FOUND" = x"no" -o x"$samba_cv_HAVE_NATIVE_ICONV" != x"yes" ; then
AC_MSG_WARN([Sufficient support for iconv function was not found.
Install libiconv from http://freshmeat.net/projects/libiconv/ for better charset compatibility!])
fi
AC_CACHE_CHECK([for Linux kernel oplocks],samba_cv_HAVE_KERNEL_OPLOCKS_LINUX,[
AC_TRY_RUN([
#include <sys/types.h>
@ -1778,25 +1714,6 @@ if test x"$samba_cv_BROKEN_NISPLUS_INCLUDE_FILES" = x"yes"; then
AC_DEFINE(BROKEN_NISPLUS_INCLUDE_FILES,1,[Whether the nisplus include files are broken])
fi
#################################################
# check for pthread support
AC_MSG_CHECKING(whether to use pthreads)
AC_ARG_WITH(pthreads,
[ --with-pthreads Include pthreads (default=no) ],
[ case "$withval" in
yes)
AC_MSG_RESULT(yes)
AC_DEFINE(WITH_PTHREADS,1,[Whether to use pthreads])
SMBD_EXTRA_OBJS="smbd/process_thread.o"
SMBD_EXTRA_LIBS="-lpthread"
;;
*)
AC_MSG_RESULT(no)
;;
esac ],
AC_MSG_RESULT(no)
)
AC_SUBST(SMBD_EXTRA_OBJS)
AC_SUBST(SMBD_EXTRA_LIBS)
@ -2067,8 +1984,8 @@ AC_ARG_WITH(static-modules,
done
fi ])
SMB_SUBSYSTEM(CHARSET,lib/iconv.o)
sinclude(lib/iconv.m4)
sinclude(smbd/process_model.m4)
sinclude(ntvfs/config.m4)
sinclude(rpc_server/config.m4)
@ -2101,4 +2018,4 @@ dnl Remove -I/usr/include/? from CFLAGS and CPPFLAGS
CFLAGS_REMOVE_USR_INCLUDE(CFLAGS)
CFLAGS_REMOVE_USR_INCLUDE(CPPFLAGS)
AC_OUTPUT(include/stamp-h Makefile script/findsmb)
AC_OUTPUT(include/stamp-h Makefile)

View File

@ -326,32 +326,7 @@ struct timers_context {
time_t last_smb_conf_reload;
};
/* the process model operations structure - contains function pointers to
the model-specific implementations of each operation */
struct model_ops {
/* called at startup when the model is selected */
void (*model_startup)(void);
/* function to accept new connection */
void (*accept_connection)(struct event_context *, struct fd_event *, time_t, uint16);
/* function to accept new rpc over tcp connection */
void (*accept_rpc_connection)(struct event_context *, struct fd_event *, time_t, uint16);
/* function to terminate a connection */
void (*terminate_connection)(struct server_context *smb, const char *reason);
/* function to terminate a connection */
void (*terminate_rpc_connection)(void *r, const char *reason);
/* function to exit server */
void (*exit_server)(struct server_context *smb, const char *reason);
/* returns process or thread id */
int (*get_id)(struct request_context *req);
};
#include "smbd/process_model.h"
/* smb context structure. This should contain all the state
* information associated with a SMB server */

66
source/lib/iconv.m4 Normal file
View File

@ -0,0 +1,66 @@
dnl # ICONV/CHARSET subsystem
ICONV_LOCATION=standard
LOOK_DIRS="/usr /usr/local /sw"
AC_ARG_WITH(libiconv,
[ --with-libiconv=BASEDIR Use libiconv in BASEDIR/lib and BASEDIR/include (default=auto) ],
[
if test "$withval" = "no" ; then
AC_MSG_ERROR(I won't take no for an answer)
else
if test "$withval" != "yes" ; then
LOOK_DIRS="$withval $LOOK_DIRS"
fi
fi
])
ICONV_FOUND="no"
for i in $LOOK_DIRS ; do
save_LIBS=$LIBS
save_LDFLAGS=$LDFLAGS
save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="-I$i/include"
LDFLAGS="-L$i/lib"
LIBS=
export LDFLAGS LIBS CPPFLAGS
dnl Try to find iconv(3)
jm_ICONV($i)
CPPFLAGS=$save_CPPFLAGS
if test -n "$ICONV_FOUND" ; then
LDFLAGS=$save_LDFLAGS
LIB_ADD_DIR(LDFLAGS, "$i/lib")
CFLAGS_ADD_DIR(CPPFLAGS, "$i/include")
LIBS="$save_LIBS $LIBS"
ICONV_LOCATION=$i
export LDFLAGS LIBS CPPFLAGS
break
else
LDFLAGS=$save_LDFLAGS
LIBS=$save_LIBS
export LDFLAGS LIBS CPPFLAGS
fi
done
############
# check for iconv in libc
AC_CACHE_CHECK([for working iconv],samba_cv_HAVE_NATIVE_ICONV,[
AC_TRY_RUN([
#include <iconv.h>
main() {
iconv_t cd = iconv_open("ASCII", "UCS-2LE");
if (cd == 0 || cd == (iconv_t)-1) return -1;
return 0;
}
],
samba_cv_HAVE_NATIVE_ICONV=yes,samba_cv_HAVE_NATIVE_ICONV=no,samba_cv_HAVE_NATIVE_ICONV=cross)])
if test x"$samba_cv_HAVE_NATIVE_ICONV" = x"yes"; then
AC_DEFINE(HAVE_NATIVE_ICONV,1,[Whether to use native iconv])
fi
if test x"$ICONV_FOUND" = x"no" -o x"$samba_cv_HAVE_NATIVE_ICONV" != x"yes" ; then
AC_MSG_WARN([Sufficient support for iconv function was not found.
Install libiconv from http://freshmeat.net/projects/libiconv/ for better charset compatibility!])
fi
SMB_SUBSYSTEM(CHARSET,lib/iconv.o,lib/charcnv.o)

View File

@ -1,9 +1,17 @@
dnl # NTVFS Server subsystem
SMB_MODULE(ntvfs_cifs, NTVFS, STATIC, \$(NTVFS_CIFS_OBJ), "bin/cifs.$SHLIBEXT$")
SMB_MODULE(ntvfs_simple, NTVFS, STATIC, \$(NTVFS_SIMPLE_OBJ), "bin/ntvfs_simple.$SHLIBEXT$")
SMB_MODULE(ntvfs_print, NTVFS, STATIC, \$(NTVFS_PRINT_OBJ), "bin/ntvfs_print.$SHLIBEXT$")
SMB_MODULE(ntvfs_ipc, NTVFS, STATIC, \$(NTVFS_IPC_OBJ), "bin/ntvfs_ipc.$SHLIBEXT$")
SMB_MODULE(ntvfs_posix, NTVFS, NOT, \$(NTVFS_POSIX_OBJ), "bin/ntvfs_posix.$SHLIBEXT$")
SMB_MODULE(ntvfs_cifs, NTVFS, STATIC, [ntvfs/cifs/vfs_cifs.o])
SMB_SUBSYSTEM(NTVFS,ntvfs/ntvfs_base.o)
SMB_MODULE(ntvfs_simple, NTVFS, STATIC,
[ntvfs/simple/vfs_simple.o ntvfs/simple/svfs_util.o],
ntvfs/simple/svfs_private.h)
SMB_MODULE(ntvfs_print, NTVFS, STATIC, [ntvfs/print/vfs_print.o])
SMB_MODULE(ntvfs_ipc, NTVFS, STATIC, [ntvfs/ipc/vfs_ipc.o])
SMB_MODULE(ntvfs_posix, NTVFS, NOT, [ntvfs/posix/vfs_posix.o])
SMB_SUBSYSTEM(NTVFS,ntvfs/ntvfs_base.o,
[ntvfs/ntvfs_generic.o ntvfs/ntvfs_util.o],
ntvfs_public_proto.h)

View File

@ -1,7 +1,9 @@
dnl # DCERPC Server subsystem
SMB_MODULE(dcerpc_rpcecho, DCERPC, STATIC, \$(DCERPC_RPCECHO_OBJ), "bin/dcerpc_rpcecho.$SHLIBEXT$")
SMB_MODULE(dcerpc_epmapper, DCERPC, STATIC, \$(DCERPC_EPMAPPER_OBJ), "bin/dcerpc_epmapper.$SHLIBEXT$")
SMB_MODULE(dcerpc_remote, DCERPC, STATIC, \$(DCERPC_REMOTE_OBJ), "bin/dcerpc_remote.$SHLIBEXT$")
SMB_MODULE(dcerpc_rpcecho,DCERPC,STATIC,[rpc_server/echo/rpc_echo.o])
SMB_MODULE(dcerpc_epmapper,DCERPC,STATIC,[rpc_server/epmapper/rpc_epmapper.o])
SMB_MODULE(dcerpc_remote,DCERPC,STATIC,[rpc_server/remote/dcesrv_remote.o])
SMB_SUBSYSTEM(DCERPC,rpc_server/dcerpc_server.o)
SMB_SUBSYSTEM(DCERPC,rpc_server/dcerpc_server.o,
[rpc_server/dcerpc_tcp.o rpc_server/dcesrv_auth.o rpc_server/handles.o],
rpc_server/dcesrv_public_proto.h)

View File

@ -255,7 +255,7 @@ static void setup_listen_rpc(struct event_context *events,
add a socket address to the list of events, one event per dcerpc endpoint
*/
static void add_socket_rpc(struct event_context *events,
struct model_ops *model_ops,
const struct model_ops *model_ops,
struct in_addr *ifip)
{
struct dcesrv_endpoint *e;
@ -289,7 +289,7 @@ static void add_socket_rpc(struct event_context *events,
Open the listening sockets for RPC over TCP
****************************************************************************/
void open_sockets_rpc(struct event_context *events,
struct model_ops *model_ops)
const struct model_ops *model_ops)
{
if (lp_interfaces() && lp_bind_interfaces_only()) {
int num_interfaces = iface_count();

View File

@ -24,7 +24,6 @@
/* the list of currently registered process models */
static struct {
const char *name;
struct model_ops *ops;
} *models = NULL;
static int num_models;
@ -35,13 +34,15 @@ static int num_models;
The 'name' can be later used by other backends to find the operations
structure for this backend.
*/
BOOL register_process_model(const char *name, struct model_ops *ops)
static NTSTATUS register_process_model(void *_ops)
{
if (process_model_byname(name) != NULL) {
const struct model_ops *ops = _ops;
if (process_model_byname(ops->name) != NULL) {
/* its already registered! */
DEBUG(2,("process_model '%s' already registered\n",
name));
return False;
DEBUG(0,("PROCESS_MODEL '%s' already registered\n",
ops->name));
return NT_STATUS_OBJECT_NAME_COLLISION;
}
models = Realloc(models, sizeof(models[0]) * (num_models+1));
@ -49,23 +50,26 @@ BOOL register_process_model(const char *name, struct model_ops *ops)
smb_panic("out of memory in register_process_model");
}
models[num_models].name = smb_xstrdup(name);
models[num_models].ops = smb_xmemdup(ops, sizeof(*ops));
models[num_models].ops->name = smb_xstrdup(ops->name);
num_models++;
return True;
DEBUG(3,("PROCESS_MODEL '%s' registered\n",
ops->name));
return NT_STATUS_OK;
}
/*
return the operations structure for a named backend of the specified type
*/
struct model_ops *process_model_byname(const char *name)
const struct model_ops *process_model_byname(const char *name)
{
int i;
for (i=0;i<num_models;i++) {
if (strcmp(models[i].name, name) == 0) {
if (strcmp(models[i].ops->name, name) == 0) {
return models[i].ops;
}
}
@ -73,13 +77,39 @@ struct model_ops *process_model_byname(const char *name)
return NULL;
}
/* initialise the builtin process models */
void process_model_init(void)
/*
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)
{
process_model_standard_init();
process_model_single_init();
#ifdef WITH_PTHREADS
process_model_thread_init();
#endif
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;
}
/*
initialise the PROCESS_MODEL subsystem
*/
BOOL process_model_init(void)
{
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;
}

View File

@ -0,0 +1,69 @@
/*
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 02139, USA.
*/
#ifndef SAMBA_PROCESS_MODEL_H
#define SAMBA_PROCESS_MODEL_H
/* modules can use the following to determine if the interface has changed
* please increment the version number after each interface change
* with a comment and maybe update struct process_model_critical_sizes.
*/
/* version 1 - initial version - metze */
#define PROCESS_MODEL_VERSION 1
/* the process model operations structure - contains function pointers to
the model-specific implementations of each operation */
struct model_ops {
/* the name of the process_model */
const char *name;
/* called at startup when the model is selected */
void (*model_startup)(void);
/* function to accept new connection */
void (*accept_connection)(struct event_context *, struct fd_event *, time_t, uint16);
/* function to accept new rpc over tcp connection */
void (*accept_rpc_connection)(struct event_context *, struct fd_event *, time_t, uint16);
/* function to terminate a connection */
void (*terminate_connection)(struct server_context *smb, const char *reason);
/* function to terminate a connection */
void (*terminate_rpc_connection)(void *r, const char *reason);
/* function to exit server */
void (*exit_server)(struct server_context *smb, const char *reason);
/* returns process or thread id */
int (*get_id)(struct request_context *req);
};
/* this structure is used by modules to determine the size of some critical types */
struct process_model_critical_sizes {
int interface_version;
int sizeof_model_ops;
int sizeof_server_context;
int sizeof_event_context;
int sizeof_fd_event;
};
#endif /* SAMBA_PROCESS_MODEL_H */

View File

@ -0,0 +1,27 @@
dnl # Server process model subsystem
SMB_MODULE(process_model_single,PROCESS_MODEL,STATIC,[smbd/process_single.o])
SMB_MODULE(process_model_standard,PROCESS_MODEL,STATIC,[smbd/process_standard.o])
#################################################
# check for pthread support
AC_MSG_CHECKING(whether to use pthreads)
AC_ARG_WITH(pthreads,
[ --with-pthreads Include pthreads (default=no) ],
[ case "$withval" in
yes)
AC_MSG_RESULT(yes)
SMB_MODULE_DEFAULT(process_model_thread,STATIC)
;;
*)
AC_MSG_RESULT(no)
;;
esac ],
AC_MSG_RESULT(no)
)
SMB_MODULE(process_model_thread,PROCESS_MODEL,NOT,
[smbd/process_thread.o],[],[-lpthread])
SMB_SUBSYSTEM(PROCESS_MODEL,smbd/process_model.o,
[],smbd/process_model_public_proto.h)

View File

@ -92,24 +92,39 @@ static int get_id(struct request_context *req)
return (int)req->smb->pid;
}
/*
initialise the single process model, registering ourselves with the model subsystem
*/
void process_model_single_init(void)
static void single_exit_server(struct server_context *smb, const char *reason)
{
DEBUG(1,("single_exit_server: reason[%s]\n",reason));
}
/*
initialise the single process model, registering ourselves with the process model subsystem
*/
NTSTATUS process_model_single_init(void)
{
NTSTATUS ret;
struct model_ops ops;
ZERO_STRUCT(ops);
/* fill in our name */
ops.name = "single";
/* fill in all the operations */
ops.model_startup = model_startup;
ops.accept_connection = accept_connection;
ops.accept_rpc_connection = accept_rpc_connection;
ops.terminate_connection = terminate_connection;
ops.terminate_rpc_connection = terminate_rpc_connection;
ops.exit_server = NULL;
ops.exit_server = single_exit_server;
ops.get_id = get_id;
/* register ourselves with the process model subsystem. We register under the name 'single'. */
register_process_model("single", &ops);
/* register ourselves with the PROCESS_MODEL subsystem. */
ret = register_backend("process_model", &ops);
if (!NT_STATUS_IS_OK(ret)) {
DEBUG(0,("Failed to register process_model 'single'!\n"));
return ret;
}
return ret;
}

View File

@ -134,23 +134,39 @@ static int get_id(struct request_context *req)
return (int)req->smb->pid;
}
/*
initialise the standard process model, registering ourselves with the model subsystem
*/
void process_model_standard_init(void)
static void standard_exit_server(struct server_context *smb, const char *reason)
{
DEBUG(1,("standard_exit_server: reason[%s]\n",reason));
}
/*
initialise the standard process model, registering ourselves with the process model subsystem
*/
NTSTATUS process_model_standard_init(void)
{
NTSTATUS ret;
struct model_ops ops;
ZERO_STRUCT(ops);
/* fill in our name */
ops.name = "standard";
/* fill in all the operations */
ops.model_startup = model_startup;
ops.accept_connection = accept_connection;
ops.accept_rpc_connection = accept_rpc_connection;
ops.terminate_connection = terminate_connection;
ops.terminate_rpc_connection = terminate_rpc_connection;
ops.exit_server = standard_exit_server;
ops.get_id = get_id;
/* register ourselves with the process model subsystem. We register under the name 'standard'. */
register_process_model("standard", &ops);
/* register ourselves with the PROCESS_MODEL subsystem. */
ret = register_backend("process_model", &ops);
if (!NT_STATUS_IS_OK(ret)) {
DEBUG(0,("Failed to register process_model 'standard'!\n"));
return ret;
}
return ret;
}

View File

@ -465,25 +465,39 @@ static void model_startup(void)
register_debug_handlers("thread", &d_ops);
}
static void thread_exit_server(struct server_context *smb, const char *reason)
{
DEBUG(1,("thread_exit_server: reason[%s]\n",reason));
}
/*
initialise the thread process model, registering ourselves with the model subsystem
*/
void process_model_thread_init(void)
NTSTATUS process_model_thread_init(void)
{
NTSTATUS ret;
struct model_ops ops;
ZERO_STRUCT(ops);
/* fill in our name */
ops.name = "thread";
/* fill in all the operations */
ops.model_startup = model_startup;
ops.accept_connection = accept_connection;
ops.accept_rpc_connection = accept_rpc_connection;
ops.terminate_connection = terminate_connection;
ops.terminate_rpc_connection = terminate_rpc_connection;
ops.exit_server = NULL;
ops.exit_server = thread_exit_server;
ops.get_id = get_id;
/* register ourselves with the process model subsystem. We
register under the name 'thread'. */
register_process_model("thread", &ops);
/* register ourselves with the PROCESS_MODEL subsystem. */
ret = register_backend("process_model", &ops);
if (!NT_STATUS_IS_OK(ret)) {
DEBUG(0,("Failed to register process_model 'thread'!\n"));
return ret;
}
return ret;
}

View File

@ -91,7 +91,7 @@ static void add_socket(struct event_context *events,
Open the socket communication.
****************************************************************************/
static void open_sockets_smbd(struct event_context *events,
struct model_ops *model_ops)
const struct model_ops *model_ops)
{
if (lp_interfaces() && lp_bind_interfaces_only()) {
int num_interfaces = iface_count();
@ -194,7 +194,7 @@ static BOOL init_structs(void)
static void setup_process_model(struct event_context *events,
const char *model)
{
struct model_ops *ops;
const struct model_ops *ops;
process_model_init();