Support dlopen(NULL, ...) on HPUX.
[jelmer/samba4-debian.git] / source / lib / replace / dlfcn.c
index 6df57cd60cb6484f59d8a17b110058d8ee729097..3b109d7e404695fedc102f91dfb23ab40e56ed9d 100644 (file)
@@ -3,48 +3,73 @@
    Samba system utilities
    Copyright (C) Andrew Tridgell 1992-1998
    Copyright (C) Jeremy Allison 1998-2002
+
+     ** NOTE! The following LGPL license applies to the replace
+     ** library. This does NOT imply that all of Samba is released
+     ** under the LGPL
    
-   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,
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 3 of the License, or (at your option) any later version.
+
+   This library 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.
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */
 
-#include "includes.h"
+#include "replace.h"
+#ifdef HAVE_DL_H
+#include <dl.h>
+#endif
 
 #ifndef HAVE_DLOPEN
-void *dlopen(const char *name, int flags)
+#ifdef DLOPEN_TAKES_UNSIGNED_FLAGS
+void *rep_dlopen(const char *name, unsigned int flags)
+#else
+void *rep_dlopen(const char *name, int flags)
+#endif
 {
+#ifdef HAVE_SHL_LOAD
+       if (name == NULL)
+               return PROG_HANDLE;
+       return (void *)shl_load(name, flags, 0);
+#else
        return NULL;
+#endif
 }
 #endif
 
 #ifndef HAVE_DLSYM
-void *dlsym(void *handle, const char *symbol)
+void *rep_dlsym(void *handle, const char *symbol)
 {
+#ifdef HAVE_SHL_FINDSYM
+       void *sym_addr;
+       if (!shl_findsym((shl_t *)&handle, symbol, TYPE_UNDEFINED, &sym_addr))
+               return sym_addr;
+#endif
     return NULL;
 }
 #endif
 
 #ifndef HAVE_DLERROR
-const char *dlerror(void)
+char *rep_dlerror(void)
 {
        return "dynamic loading of objects not supported on this platform";
 }
 #endif
 
 #ifndef HAVE_DLCLOSE
-int dlclose(void *handle)
+int rep_dlclose(void *handle)
 {
+#ifdef HAVE_SHL_CLOSE
+       return shl_unload((shl_t)handle);
+#else
        return 0;
+#endif
 }
 #endif