2 Unix SMB/CIFS implementation.
5 Copyright (C) Jelmer Vernooij 2002-2003
6 Copyright (C) Stefan (metze) Metzmacher 2003
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 /* Load a dynamic module. Only log a level 0 error if we are not checking
28 for the existence of a module (probling). */
30 static NTSTATUS
do_smb_load_module(const char *module_name
, BOOL is_probe
)
33 init_module_function
*init
;
37 /* Always try to use LAZY symbol resolving; if the plugin has
38 * backwards compatibility, there might be symbols in the
39 * plugin referencing to old (removed) functions
41 handle
= sys_dlopen(module_name
, RTLD_LAZY
);
43 /* This call should reset any possible non-fatal errors that
44 occured since last call to dl* functions */
45 error
= sys_dlerror();
48 int level
= is_probe
? 3 : 0;
49 DEBUG(level
, ("Error loading module '%s': %s\n", module_name
, error
? error
: ""));
50 return NT_STATUS_UNSUCCESSFUL
;
53 init
= (init_module_function
*)sys_dlsym(handle
, "init_module");
55 /* we must check sys_dlerror() to determine if it worked, because
56 sys_dlsym() can validly return NULL */
57 error
= sys_dlerror();
59 DEBUG(0, ("Error trying to resolve symbol 'init_module' in %s: %s\n",
61 return NT_STATUS_UNSUCCESSFUL
;
64 DEBUG(2, ("Module '%s' loaded\n", module_name
));
67 if (!NT_STATUS_IS_OK(status
)) {
68 DEBUG(0, ("Module '%s' initialization failed: %s\n",
69 module_name
, get_friendly_nt_error_msg(status
)));
75 NTSTATUS
smb_load_module(const char *module_name
)
77 return do_smb_load_module(module_name
, False
);
80 /* Load all modules in list and return number of
81 * modules that has been successfully loaded */
82 int smb_load_modules(const char **modules
)
87 for(i
= 0; modules
[i
]; i
++){
88 if(NT_STATUS_IS_OK(smb_load_module(modules
[i
]))) {
93 DEBUG(2, ("%d modules successfully loaded\n", success
));
98 NTSTATUS
smb_probe_module(const char *subsystem
, const char *module
)
102 /* Check for absolute path */
104 /* if we make any 'samba multibyte string'
106 for loading string modules */
108 DEBUG(5, ("Probing module '%s'\n", module
));
110 if (module
[0] == '/')
111 return do_smb_load_module(module
, True
);
113 pstrcpy(full_path
, lib_path(subsystem
));
114 pstrcat(full_path
, "/");
115 pstrcat(full_path
, module
);
116 pstrcat(full_path
, ".");
117 pstrcat(full_path
, shlib_ext());
119 DEBUG(5, ("Probing module '%s': Trying to load from %s\n", module
, full_path
));
121 return do_smb_load_module(full_path
, True
);
124 #else /* HAVE_DLOPEN */
126 NTSTATUS
smb_load_module(const char *module_name
)
128 DEBUG(0,("This samba executable has not been built with plugin support\n"));
129 return NT_STATUS_NOT_SUPPORTED
;
132 int smb_load_modules(const char **modules
)
134 DEBUG(0,("This samba executable has not been built with plugin support\n"));
138 NTSTATUS
smb_probe_module(const char *subsystem
, const char *module
)
140 DEBUG(0,("This samba executable has not been built with plugin support, not probing\n"));
141 return NT_STATUS_NOT_SUPPORTED
;
144 #endif /* HAVE_DLOPEN */
146 void init_modules(void)
148 /* FIXME: This can cause undefined symbol errors :
149 * smb_register_vfs() isn't available in nmbd, for example */
150 if(lp_preload_modules())
151 smb_load_modules(lp_preload_modules());
155 /***************************************************************************
156 * This Function registers a idle event
158 * the registered funtions are run periodically
159 * and maybe shutdown idle connections (e.g. to an LDAP server)
160 ***************************************************************************/
161 static smb_event_id_t smb_idle_event_id
= 1;
163 struct smb_idle_list_ent
{
164 struct smb_idle_list_ent
*prev
,*next
;
166 smb_idle_event_fn
*fn
;
172 static struct smb_idle_list_ent
*smb_idle_event_list
= NULL
;
174 smb_event_id_t
smb_register_idle_event(smb_idle_event_fn
*fn
, void *data
, time_t interval
)
176 struct smb_idle_list_ent
*event
;
179 return SMB_EVENT_ID_INVALID
;
182 event
= SMB_MALLOC_P(struct smb_idle_list_ent
);
184 DEBUG(0,("malloc() failed!\n"));
185 return SMB_EVENT_ID_INVALID
;
189 event
->interval
= interval
;
191 event
->id
= smb_idle_event_id
++;
193 DLIST_ADD(smb_idle_event_list
,event
);
198 BOOL
smb_unregister_idle_event(smb_event_id_t id
)
200 struct smb_idle_list_ent
*event
= smb_idle_event_list
;
203 if (event
->id
== id
) {
204 DLIST_REMOVE(smb_idle_event_list
,event
);
214 void smb_run_idle_events(time_t now
)
216 struct smb_idle_list_ent
*event
= smb_idle_event_list
;
219 struct smb_idle_list_ent
*next
= event
->next
;
222 if (event
->interval
<= 0) {
223 interval
= SMB_IDLE_EVENT_DEFAULT_INTERVAL
;
224 } else if (event
->interval
>= SMB_IDLE_EVENT_MIN_INTERVAL
) {
225 interval
= event
->interval
;
227 interval
= SMB_IDLE_EVENT_MIN_INTERVAL
;
229 if (now
>(event
->lastrun
+interval
)) {
230 event
->lastrun
= now
;
231 event
->fn(&event
->data
,&event
->interval
,now
);