64#define SAME_INODE(A,B) ((A).st_ino == (B).inode && (A).st_dev == (B).device)
66#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)));
265 file_scanner->
magic = magic_data_ptr;
274 (
errmsg(
"incompatible library \"%s\": missing magic block",
276 errhint(
"Extension libraries are required to use the PG_MODULE_MAGIC macro.")));
294 return file_scanner->
handle;
312 char library_version[32];
314 if (module_magic_data->
version >= 1000)
315 snprintf(library_version,
sizeof(library_version),
"%d",
316 module_magic_data->
version / 100);
318 snprintf(library_version,
sizeof(library_version),
"%d.%d",
319 module_magic_data->
version / 100,
320 module_magic_data->
version % 100);
322 (
errmsg(
"incompatible library \"%s\": version mismatch",
324 errdetail(
"Server is version %d, library is version %s.",
336 (
errmsg(
"incompatible library \"%s\": ABI mismatch",
338 errdetail(
"Server has ABI \"%s\", library has \"%s\".",
357 _(
"Server has %s = %d, library has %d."),
367 _(
"Server has %s = %d, library has %d."),
377 _(
"Server has %s = %d, library has %d."),
387 _(
"Server has %s = %s, library has %s."),
389 module_magic_data->
float8byval ?
"true" :
"false");
392 if (details.
len == 0)
394 _(
"Magic block has unexpected length or padding difference."));
397 (
errmsg(
"incompatible library \"%s\": magic block mismatch",
431 const char **library_path,
432 const char **module_name,
433 const char **module_version)
464 if (strncmp(
name,
"$libdir/", 8) == 0)
516 if (strncmp(
name,
"$libdir/plugins/", 16) != 0 ||
519 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
520 errmsg(
"access to library \"%s\" is not allowed",
541 sep_ptr =
str + strlen(
str);
543 if (strlen(macro) != sep_ptr -
str ||
544 strncmp(
str, macro, strlen(macro)) != 0)
546 (
errcode(ERRCODE_INVALID_NAME),
547 errmsg(
"invalid macro name in path: %s",
567find_in_path(
const char *basename,
const char *path,
const char *path_param,
568 const char *macro,
const char *macro_val)
576 Assert(path_param != NULL);
586 baselen = strlen(basename);
598 (
errcode(ERRCODE_INVALID_NAME),
599 errmsg(
"zero-length component in parameter \"%s\"", path_param)));
617 (
errcode(ERRCODE_INVALID_NAME),
618 errmsg(
"component in parameter \"%s\" is not an absolute path", path_param)));
620 full =
palloc(strlen(mangled) + 1 + baselen + 1);
621 sprintf(full,
"%s/%s", mangled, basename);
624 elog(
DEBUG3,
"%s: trying \"%s\"", __func__, full);
659 static HTAB *rendezvousHash = NULL;
665 if (rendezvousHash == NULL)
671 rendezvousHash =
hash_create(
"Rendezvous variable hash",
701 file_scanner != NULL;
702 file_scanner = file_scanner->
next)
717 file_scanner != NULL;
718 file_scanner = file_scanner->
next)
725 start_address +=
len;
727 start_address[0] =
'\0';
736 while (*start_address !=
'\0')
739 start_address += strlen(start_address) + 1;
#define FLEXIBLE_ARRAY_MEMBER
#define MemSet(start, val, len)
static char * expand_dynamic_library_name(const char *name)
static const Pg_abi_values magic_data
static DynamicFileList * file_tail
void RestoreLibraryState(char *start_address)
char * find_in_path(const char *basename, const char *path, const char *path_param, const char *macro, const char *macro_val)
char * Dynamic_library_path
static void * internal_load_library(const char *libname)
void SerializeLibraryState(Size maxsize, char *start_address)
DynamicFileList * get_next_loaded_module(DynamicFileList *dfptr)
void load_file(const char *filename, bool restricted)
static pg_noreturn void incompatible_module_error(const char *libname, const Pg_abi_values *module_magic_data)
void ** find_rendezvous_variable(const char *varName)
Size EstimateLibraryStateSpace(void)
void * lookup_external_function(void *filehandle, const char *funcname)
static DynamicFileList * file_list
DynamicFileList * get_first_loaded_module(void)
void * load_external_function(const char *filename, const char *funcname, bool signalNotFound, void **filehandle)
void get_loaded_module_details(DynamicFileList *dfptr, const char **library_path, const char **module_name, const char **module_version)
static void check_restricted_library_name(const char *name)
char * substitute_path_macro(const char *str, const char *macro, const char *value)
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_ABI_DATA
char pkglib_path[MAXPGPATH]
Assert(PointerIsAligned(start, uint64))
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)
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendStringInfoString(StringInfo str, const char *s)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
const Pg_magic_struct * magic
char filename[FLEXIBLE_ARRAY_MEMBER]
void * dlopen(const char *file, int mode)
void * dlsym(void *handle, const char *symbol)
int dlclose(void *handle)