The new modules system

Jelmer Vernooij jelmer at samba.org
Thu Mar 20 09:42:56 GMT 2003


Hi,

I've finally committed my modules patch to CVS. Here are the docs (now 
in dev-doc as well). 

Next things I'll work on:

- Adapting VFS to use the new modules system
- Winsdb (after metze resends his patch)

Tomorrow I continue learning for my exams so the VFS patch 
probably won't come until next week,

Jelmer

Chapter 14. Modules

14.1. Advantages

   The new modules system has the following advantages:

   Transparent loading of static and shared modules (no need for
   a subsystem to know about modules)
   Simple selection between shared and static modules at
   configure time
   "preload modules" option for increasing performance for stable
   modules
   No nasty #define stuff anymore
   All backends are available as plugin now (including pdb_ldap
   and pdb_tdb)
     _________________________________________________________

14.2. Loading modules

   Some subsystems in samba use different backends. These
   backends can be either statically linked in to samba or
   available as a plugin. A subsystem should have a function that
   allows a module to register itself. For example, the passdb
   subsystem has:

BOOL smb_register_passdb(const char *name, pdb_init_function init, int
version);

   This function will be called by the initialisation function of
   the module to register itself.
     _________________________________________________________

14.2.1. Static modules

   The modules system compiles a list of initialisation functions
   for the static modules of each subsystem. This is a define.
   For example, it is here currently (from include/config.h):

/* Static init functions */
#define static_init_pdb { pdb_mysql_init(); pdb_ldap_init(); pdb_smbpas
swd_init(); pdb_tdbsam_init(); pdb_guest_init();}

   These functions should be called before the subsystem is used.
   That can be done either from the executable that will be using
   the subsystem ( static_init_rpc is called from the main()
   function of smbd), or from the subsystem itself when it's
   first used (like passdb's lazy_initialise_passdb does).
     _________________________________________________________

14.2.2. Shared modules

   If a subsystem needs a certain backend, it should check if it
   has already been registered. If the backend hasn't been
   registered already, the subsystem should call
   smb_probe_module(char *subsystem, char *backend). This
   function tries to load the correct module from a certain path
   ($LIBDIR/subsystem/backend.so). If the first character in
   'backend' is a slash, smb_probe_module() tries to load the
   module from the absolute path specified in 'backend'.

   After smb_probe_module() has been executed, the subsystem
   should check again if the module has been registered.
     _________________________________________________________

14.3. Writing modules

   Each module has an initialisation function. For modules that
   are included with samba this name is 'subsystem_backend_init'.
   For external modules (that will never be built-in, but only
   available as a module) this name is always 'init_module'. (In
   the case of modules included with samba, the configure system
   will add a #define subsystem_backend_init() init_module()).
   The prototype for these functions is:

int init_module(void);

   This function should call one or more registration functions.
   The function should return non-zero on success and zero on
   failure.

   For example, pdb_ldap_init() contains:

int pdb_ldap_init(void)
{
    smb_register_passdb("ldapsam", pdb_init_ldapsam, PASSDB_INTERFACE_V
ERSION);
    smb_register_passdb("ldapsam_nua", pdb_init_ldapsam_nua, PASSDB_INT
ERFACE_VERSION);
        return TRUE;
}
     _________________________________________________________

14.3.1. Static/Shared selection in configure.in

   Some macros in configure.in generate the various defines and
   substs that are necessary for the system to work correct. All
   modules that should be built by default have to be added to
   the variable 'default_modules'. For example, if ldap is found,
   pdb_ldap is added to this variable.

   On the bottom of configure.in, SMB_MODULE() should be called
   for each module and SMB_SUBSYSTEM() for each subsystem.

   Syntax:

SMB_MODULE($MODULE_subsystem_backend, subsystem_backend, object files,
plugin name, subsystem name)
SMB_SUBSYSTEM(subsystem)

-- 
Jelmer Vernooij                                      <jelmer at samba.org>
Pending (unfinished) patches                         http://samba.org/~jelmer/diffs.php
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.samba.org/archive/samba-technical/attachments/20030320/f20e9f64/attachment.bin


More information about the samba-technical mailing list