Force a checkpoint in CREATE DATABASE before starting to copy the files,
[PostgreSQL.git] / src / backend / port / dynloader / darwin.c
blob2952b64fab5d245080a58817d0d515423014a85f
1 /*
2 * Dynamic loading support for Darwin
4 * If dlopen() is available (Darwin 10.3 and later), we just use it.
5 * Otherwise we emulate it with the older, now deprecated, NSLinkModule API.
7 * $PostgreSQL$
8 */
9 #include "postgres.h"
11 #ifdef HAVE_DLOPEN
12 #include <dlfcn.h>
13 #else
14 #include <mach-o/dyld.h>
15 #endif
17 #include "dynloader.h"
20 #ifdef HAVE_DLOPEN
22 void *
23 pg_dlopen(char *filename)
25 return dlopen(filename, RTLD_NOW | RTLD_GLOBAL);
28 void
29 pg_dlclose(void *handle)
31 dlclose(handle);
34 PGFunction
35 pg_dlsym(void *handle, char *funcname)
37 /* Do not prepend an underscore: see dlopen(3) */
38 return dlsym(handle, funcname);
41 char *
42 pg_dlerror(void)
44 return dlerror();
46 #else /* !HAVE_DLOPEN */
49 * These routines were taken from the Apache source, but were made
50 * available with a PostgreSQL-compatible license. Kudos Wilfredo
51 * Sánchez <wsanchez@apple.com>.
54 static NSObjectFileImageReturnCode cofiff_result = NSObjectFileImageFailure;
56 void *
57 pg_dlopen(char *filename)
59 NSObjectFileImage image;
61 cofiff_result = NSCreateObjectFileImageFromFile(filename, &image);
62 if (cofiff_result != NSObjectFileImageSuccess)
63 return NULL;
64 return NSLinkModule(image, filename,
65 NSLINKMODULE_OPTION_BINDNOW |
66 NSLINKMODULE_OPTION_RETURN_ON_ERROR);
69 void
70 pg_dlclose(void *handle)
72 NSUnLinkModule(handle, FALSE);
75 PGFunction
76 pg_dlsym(void *handle, char *funcname)
78 NSSymbol symbol;
79 char *symname = (char *) malloc(strlen(funcname) + 2);
81 sprintf(symname, "_%s", funcname);
82 if (NSIsSymbolNameDefined(symname))
84 symbol = NSLookupAndBindSymbol(symname);
86 free(symname);
87 return (PGFunction) NSAddressOfSymbol(symbol);
89 else
91 free(symname);
92 return NULL;
96 char *
97 pg_dlerror(void)
99 NSLinkEditErrors c;
100 int errorNumber;
101 const char *fileName;
102 const char *errorString = NULL;
104 switch (cofiff_result)
106 case NSObjectFileImageSuccess:
107 /* must have failed in NSLinkModule */
108 NSLinkEditError(&c, &errorNumber, &fileName, &errorString);
109 if (errorString == NULL || *errorString == '\0')
110 errorString = "unknown link-edit failure";
111 break;
112 case NSObjectFileImageFailure:
113 errorString = "failed to open object file";
114 break;
115 case NSObjectFileImageInappropriateFile:
116 errorString = "inappropriate object file";
117 break;
118 case NSObjectFileImageArch:
119 errorString = "object file is for wrong architecture";
120 break;
121 case NSObjectFileImageFormat:
122 errorString = "object file has wrong format";
123 break;
124 case NSObjectFileImageAccess:
125 errorString = "insufficient permissions for object file";
126 break;
127 default:
128 errorString = "unknown failure to open object file";
129 break;
132 return (char *) errorString;
135 #endif /* HAVE_DLOPEN */