Support dlopen(NULL, ...) on HPUX.
[kai/samba.git] / source / lib / replace / dlfcn.c
1 /* 
2    Unix SMB/CIFS implementation.
3    Samba system utilities
4    Copyright (C) Andrew Tridgell 1992-1998
5    Copyright (C) Jeremy Allison 1998-2002
6
7      ** NOTE! The following LGPL license applies to the replace
8      ** library. This does NOT imply that all of Samba is released
9      ** under the LGPL
10    
11    This library is free software; you can redistribute it and/or
12    modify it under the terms of the GNU Lesser General Public
13    License as published by the Free Software Foundation; either
14    version 3 of the License, or (at your option) any later version.
15
16    This library is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19    Lesser General Public License for more details.
20
21    You should have received a copy of the GNU Lesser General Public
22    License along with this library; if not, see <http://www.gnu.org/licenses/>.
23 */
24
25 #include "replace.h"
26 #ifdef HAVE_DL_H
27 #include <dl.h>
28 #endif
29
30 #ifndef HAVE_DLOPEN
31 #ifdef DLOPEN_TAKES_UNSIGNED_FLAGS
32 void *rep_dlopen(const char *name, unsigned int flags)
33 #else
34 void *rep_dlopen(const char *name, int flags)
35 #endif
36 {
37 #ifdef HAVE_SHL_LOAD
38         if (name == NULL)
39                 return PROG_HANDLE;
40         return (void *)shl_load(name, flags, 0);
41 #else
42         return NULL;
43 #endif
44 }
45 #endif
46
47 #ifndef HAVE_DLSYM
48 void *rep_dlsym(void *handle, const char *symbol)
49 {
50 #ifdef HAVE_SHL_FINDSYM
51         void *sym_addr;
52         if (!shl_findsym((shl_t *)&handle, symbol, TYPE_UNDEFINED, &sym_addr))
53                 return sym_addr;
54 #endif
55     return NULL;
56 }
57 #endif
58
59 #ifndef HAVE_DLERROR
60 char *rep_dlerror(void)
61 {
62         return "dynamic loading of objects not supported on this platform";
63 }
64 #endif
65
66 #ifndef HAVE_DLCLOSE
67 int rep_dlclose(void *handle)
68 {
69 #ifdef HAVE_SHL_CLOSE
70         return shl_unload((shl_t)handle);
71 #else
72         return 0;
73 #endif
74 }
75 #endif