/Users/deen/code/yugabyte-db/build/debugcov-clang-dynamic-arm64-ninja/postgres_build/src/backend/port/dynloader.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Dynamic loading support for macOS (Darwin) |
3 | | * |
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. |
6 | | * |
7 | | * src/backend/port/dynloader/darwin.c |
8 | | */ |
9 | | #include "postgres.h" |
10 | | |
11 | | #ifdef HAVE_DLOPEN |
12 | | #include <dlfcn.h> |
13 | | #else |
14 | | #include <mach-o/dyld.h> |
15 | | #endif |
16 | | |
17 | | #include "dynloader.h" |
18 | | |
19 | | |
20 | | #ifdef HAVE_DLOPEN |
21 | | |
22 | | void * |
23 | | pg_dlopen(const char *filename) |
24 | 3.75k | { |
25 | 3.75k | return dlopen(filename, RTLD_NOW | RTLD_GLOBAL); |
26 | 3.75k | } |
27 | | |
28 | | void |
29 | | pg_dlclose(void *handle) |
30 | 0 | { |
31 | 0 | dlclose(handle); |
32 | 0 | } |
33 | | |
34 | | PGFunction |
35 | | pg_dlsym(void *handle, const char *funcname) |
36 | 10.5k | { |
37 | | /* Do not prepend an underscore: see dlopen(3) */ |
38 | 10.5k | return dlsym(handle, funcname); |
39 | 10.5k | } |
40 | | |
41 | | char * |
42 | | pg_dlerror(void) |
43 | 0 | { |
44 | 0 | return dlerror(); |
45 | 0 | } |
46 | | #else /* !HAVE_DLOPEN */ |
47 | | |
48 | | /* |
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>. |
52 | | */ |
53 | | |
54 | | static NSObjectFileImageReturnCode cofiff_result = NSObjectFileImageFailure; |
55 | | |
56 | | void * |
57 | | pg_dlopen(const char *filename) |
58 | | { |
59 | | NSObjectFileImage image; |
60 | | |
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); |
67 | | } |
68 | | |
69 | | void |
70 | | pg_dlclose(void *handle) |
71 | | { |
72 | | NSUnLinkModule(handle, NSUNLINKMODULE_OPTION_NONE); |
73 | | } |
74 | | |
75 | | PGFunction |
76 | | pg_dlsym(void *handle, const char *funcname) |
77 | | { |
78 | | NSSymbol symbol; |
79 | | char *symname = (char *) malloc(strlen(funcname) + 2); |
80 | | |
81 | | if (!symname) |
82 | | return NULL; |
83 | | |
84 | | sprintf(symname, "_%s", funcname); |
85 | | if (NSIsSymbolNameDefined(symname)) |
86 | | { |
87 | | symbol = NSLookupAndBindSymbol(symname); |
88 | | |
89 | | free(symname); |
90 | | return (PGFunction) NSAddressOfSymbol(symbol); |
91 | | } |
92 | | else |
93 | | { |
94 | | free(symname); |
95 | | return NULL; |
96 | | } |
97 | | } |
98 | | |
99 | | char * |
100 | | pg_dlerror(void) |
101 | | { |
102 | | NSLinkEditErrors c; |
103 | | int errorNumber; |
104 | | const char *fileName; |
105 | | const char *errorString = NULL; |
106 | | |
107 | | switch (cofiff_result) |
108 | | { |
109 | | case NSObjectFileImageSuccess: |
110 | | /* must have failed in NSLinkModule */ |
111 | | NSLinkEditError(&c, &errorNumber, &fileName, &errorString); |
112 | | if (errorString == NULL || *errorString == '\0') |
113 | | errorString = "unknown link-edit failure"; |
114 | | break; |
115 | | case NSObjectFileImageFailure: |
116 | | errorString = "failed to open object file"; |
117 | | break; |
118 | | case NSObjectFileImageInappropriateFile: |
119 | | errorString = "inappropriate object file"; |
120 | | break; |
121 | | case NSObjectFileImageArch: |
122 | | errorString = "object file is for wrong architecture"; |
123 | | break; |
124 | | case NSObjectFileImageFormat: |
125 | | errorString = "object file has wrong format"; |
126 | | break; |
127 | | case NSObjectFileImageAccess: |
128 | | errorString = "insufficient permissions for object file"; |
129 | | break; |
130 | | default: |
131 | | errorString = "unknown failure to open object file"; |
132 | | break; |
133 | | } |
134 | | |
135 | | return (char *) errorString; |
136 | | } |
137 | | |
138 | | #endif /* HAVE_DLOPEN */ |