YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/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 */