Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #if defined(LIBC_SCCS) && !defined(lint)
00034 static char sccsid[] = "@(#)dl.c 5.4 (Berkeley) 2/23/91";
00035 #endif
00036
00037 #include "postgres.h"
00038
00039 #include <nlist.h>
00040 #include <link.h>
00041 #include <dlfcn.h>
00042
00043 #include "dynloader.h"
00044
00045 static char error_message[BUFSIZ];
00046
00047 char *
00048 BSD44_derived_dlerror(void)
00049 {
00050 static char ret[BUFSIZ];
00051
00052 strcpy(ret, error_message);
00053 error_message[0] = 0;
00054 return (ret[0] == 0) ? NULL : ret;
00055 }
00056
00057 void *
00058 BSD44_derived_dlopen(const char *file, int num)
00059 {
00060 #if !defined(HAVE_DLOPEN)
00061 snprintf(error_message, sizeof(error_message),
00062 "dlopen (%s) not supported", file);
00063 return NULL;
00064 #else
00065 void *vp;
00066
00067 if ((vp = dlopen((char *) file, num)) == NULL)
00068 snprintf(error_message, sizeof(error_message),
00069 "dlopen (%s) failed: %s", file, dlerror());
00070 return vp;
00071 #endif
00072 }
00073
00074 void *
00075 BSD44_derived_dlsym(void *handle, const char *name)
00076 {
00077 #if !defined(HAVE_DLOPEN)
00078 snprintf(error_message, sizeof(error_message),
00079 "dlsym (%s) failed", name);
00080 return NULL;
00081 #else
00082 void *vp;
00083
00084 #ifndef __ELF__
00085 char buf[BUFSIZ];
00086
00087 if (*name != '_')
00088 {
00089 snprintf(buf, sizeof(buf), "_%s", name);
00090 name = buf;
00091 }
00092 #endif
00093 if ((vp = dlsym(handle, (char *) name)) == NULL)
00094 snprintf(error_message, sizeof(error_message),
00095 "dlsym (%s) failed", name);
00096 return vp;
00097 #endif
00098 }
00099
00100 void
00101 BSD44_derived_dlclose(void *handle)
00102 {
00103 #if defined(HAVE_DLOPEN)
00104 dlclose(handle);
00105 #endif
00106 }