62#define SAME_INODE(A,B) ((A).st_ino == (B).inode && (A).st_dev == (B).device)
64#define SAME_INODE(A,B) false
96 bool signalNotFound,
void **filehandle)
110 *filehandle = lib_handle;
115 if (retval == NULL && signalNotFound)
117 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
118 errmsg(
"could not find function \"%s\" in file \"%s\"",
179 struct stat stat_buf;
186 file_scanner != NULL &&
187 strcmp(libname, file_scanner->
filename) != 0;
188 file_scanner = file_scanner->
next)
191 if (file_scanner == NULL)
196 if (
stat(libname, &stat_buf) == -1)
199 errmsg(
"could not access file \"%s\": %m",
203 file_scanner != NULL &&
205 file_scanner = file_scanner->
next)
209 if (file_scanner == NULL)
216 if (file_scanner == NULL)
218 (
errcode(ERRCODE_OUT_OF_MEMORY),
219 errmsg(
"out of memory")));
222 strcpy(file_scanner->
filename, libname);
227 file_scanner->
next = NULL;
230 if (file_scanner->
handle == NULL)
237 errmsg(
"could not load library \"%s\": %s",
238 libname, load_error)));
269 (
errmsg(
"incompatible library \"%s\": missing magic block",
271 errhint(
"Extension libraries are required to use the PG_MODULE_MAGIC macro.")));
289 return file_scanner->
handle;
307 char library_version[32];
309 if (module_magic_data->
version >= 1000)
310 snprintf(library_version,
sizeof(library_version),
"%d",
311 module_magic_data->
version / 100);
313 snprintf(library_version,
sizeof(library_version),
"%d.%d",
314 module_magic_data->
version / 100,
315 module_magic_data->
version % 100);
317 (
errmsg(
"incompatible library \"%s\": version mismatch",
319 errdetail(
"Server is version %d, library is version %s.",
331 (
errmsg(
"incompatible library \"%s\": ABI mismatch",
333 errdetail(
"Server has ABI \"%s\", library has \"%s\".",
352 _(
"Server has %s = %d, library has %d."),
362 _(
"Server has %s = %d, library has %d."),
372 _(
"Server has %s = %d, library has %d."),
382 _(
"Server has %s = %s, library has %s."),
384 module_magic_data->
float8byval ?
"true" :
"false");
387 if (details.
len == 0)
389 _(
"Magic block has unexpected length or padding difference."));
392 (
errmsg(
"incompatible library \"%s\": magic block mismatch",
465 if (strncmp(
name,
"$libdir/plugins/", 16) != 0 ||
468 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
469 errmsg(
"access to library \"%s\" is not allowed",
491 if (strlen(
"$libdir") != sep_ptr -
name ||
492 strncmp(
name,
"$libdir", strlen(
"$libdir")) != 0)
494 (
errcode(ERRCODE_INVALID_NAME),
495 errmsg(
"invalid macro name in dynamic library path: %s",
522 baselen = strlen(basename);
534 (
errcode(ERRCODE_INVALID_NAME),
535 errmsg(
"zero-length component in parameter \"dynamic_library_path\"")));
553 (
errcode(ERRCODE_INVALID_NAME),
554 errmsg(
"component in parameter \"dynamic_library_path\" is not an absolute path")));
556 full =
palloc(strlen(mangled) + 1 + baselen + 1);
557 sprintf(full,
"%s/%s", mangled, basename);
560 elog(
DEBUG3,
"find_in_dynamic_libpath: trying \"%s\"", full);
595 static HTAB *rendezvousHash = NULL;
601 if (rendezvousHash == NULL)
607 rendezvousHash =
hash_create(
"Rendezvous variable hash",
637 file_scanner != NULL;
638 file_scanner = file_scanner->
next)
653 file_scanner != NULL;
654 file_scanner = file_scanner->
next)
661 start_address +=
len;
663 start_address[0] =
'\0';
672 while (*start_address !=
'\0')
675 start_address += strlen(start_address) + 1;
#define Assert(condition)
#define pg_attribute_noreturn()
#define FLEXIBLE_ARRAY_MEMBER
#define MemSet(start, val, len)
static char * expand_dynamic_library_name(const char *name)
static DynamicFileList * file_tail
static char * find_in_dynamic_libpath(const char *basename)
void RestoreLibraryState(char *start_address)
char * Dynamic_library_path
static char * substitute_libpath_macro(const char *name)
static void incompatible_module_error(const char *libname, const Pg_magic_struct *module_magic_data) pg_attribute_noreturn()
static void * internal_load_library(const char *libname)
void SerializeLibraryState(Size maxsize, char *start_address)
void load_file(const char *filename, bool restricted)
void ** find_rendezvous_variable(const char *varName)
static const Pg_magic_struct magic_data
Size EstimateLibraryStateSpace(void)
void * lookup_external_function(void *filehandle, const char *funcname)
static DynamicFileList * file_list
void * load_external_function(const char *filename, const char *funcname, bool signalNotFound, void **filehandle)
struct df_files DynamicFileList
static void check_restricted_library_name(const char *name)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
int errdetail_internal(const char *fmt,...)
int errcode_for_file_access(void)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
bool pg_file_exists(const char *name)
#define PG_MAGIC_FUNCTION_NAME_STRING
const Pg_magic_struct *(* PGModuleMagicFunction)(void)
#define PG_MODULE_MAGIC_DATA
char pkglib_path[MAXPGPATH]
char * pstrdup(const char *in)
void pfree(void *pointer)
#define is_absolute_path(filename)
char * first_path_var_separator(const char *pathlist)
void canonicalize_path(char *path)
char * first_dir_separator(const char *filename)
size_t strlcpy(char *dst, const char *src, size_t siz)
char * psprintf(const char *fmt,...)
Size add_size(Size s1, Size s2)
static pg_noinline void Size size
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendStringInfoString(StringInfo str, const char *s)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
char filename[FLEXIBLE_ARRAY_MEMBER]
void * dlopen(const char *file, int mode)
void * dlsym(void *handle, const char *symbol)
int dlclose(void *handle)