mirror of https://github.com/postgres/postgres
Nowadays, all platforms except Windows and older HP-UX have standard dlopen() support. So having a separate implementation per platform under src/backend/port/dynloader/ is a bit excessive. Instead, treat dlopen() like other library functions that happen to be missing sometimes and put a replacement implementation under src/port/. Discussion: https://www.postgresql.org/message-id/flat/e11a49cb-570a-60b7-707d-7084c8de0e61%402ndquadrant.com#54e735ae37476a121abb4e33c2549b03pull/34/head
parent
ac27c74def
commit
842cb9fa62
@ -1,4 +1,3 @@ |
||||
/dynloader.c |
||||
/pg_sema.c |
||||
/pg_shmem.c |
||||
/tas.s |
||||
|
@ -1,7 +0,0 @@ |
||||
/*
|
||||
* src/backend/port/dynloader/aix.c |
||||
* |
||||
* Dummy file used for nothing at this point |
||||
* |
||||
* see aix.h |
||||
*/ |
@ -1,39 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* aix.h |
||||
* prototypes for AIX-specific routines |
||||
* |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/backend/port/dynloader/aix.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
|
||||
#ifndef PORT_PROTOS_H |
||||
#define PORT_PROTOS_H |
||||
|
||||
#include <dlfcn.h> |
||||
#include "utils/dynamic_loader.h" /* pgrminclude ignore */ |
||||
|
||||
/*
|
||||
* In some older systems, the RTLD_NOW flag isn't defined and the mode |
||||
* argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted |
||||
* if available, but it doesn't exist everywhere. |
||||
* If it doesn't exist, set it to 0 so it has no effect. |
||||
*/ |
||||
#ifndef RTLD_NOW |
||||
#define RTLD_NOW 1 |
||||
#endif |
||||
#ifndef RTLD_GLOBAL |
||||
#define RTLD_GLOBAL 0 |
||||
#endif |
||||
|
||||
#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) |
||||
#define pg_dlsym(h, f) ((PGFunction) dlsym(h, f)) |
||||
#define pg_dlclose(h) dlclose(h) |
||||
#define pg_dlerror() dlerror() |
||||
|
||||
#endif /* PORT_PROTOS_H */ |
@ -1,3 +0,0 @@ |
||||
/* src/backend/port/dynloader/cygwin.c */ |
||||
|
||||
/* Dummy file used for nothing at this point; see cygwin.h */ |
@ -1,36 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* Dynamic loader declarations for Cygwin |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/backend/port/dynloader/cygwin.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef PORT_PROTOS_H |
||||
#define PORT_PROTOS_H |
||||
|
||||
#include <dlfcn.h> |
||||
#include "utils/dynamic_loader.h" /* pgrminclude ignore */ |
||||
|
||||
/*
|
||||
* In some older systems, the RTLD_NOW flag isn't defined and the mode |
||||
* argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted |
||||
* if available, but it doesn't exist everywhere. |
||||
* If it doesn't exist, set it to 0 so it has no effect. |
||||
*/ |
||||
#ifndef RTLD_NOW |
||||
#define RTLD_NOW 1 |
||||
#endif |
||||
#ifndef RTLD_GLOBAL |
||||
#define RTLD_GLOBAL 0 |
||||
#endif |
||||
|
||||
#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) |
||||
#define pg_dlsym dlsym |
||||
#define pg_dlclose dlclose |
||||
#define pg_dlerror dlerror |
||||
|
||||
#endif /* PORT_PROTOS_H */ |
@ -1,35 +0,0 @@ |
||||
/*
|
||||
* Dynamic loading support for macOS (Darwin) |
||||
* |
||||
* src/backend/port/dynloader/darwin.c |
||||
*/ |
||||
#include "postgres.h" |
||||
|
||||
#include <dlfcn.h> |
||||
|
||||
#include "dynloader.h" |
||||
|
||||
|
||||
void * |
||||
pg_dlopen(const char *filename) |
||||
{ |
||||
return dlopen(filename, RTLD_NOW | RTLD_GLOBAL); |
||||
} |
||||
|
||||
void |
||||
pg_dlclose(void *handle) |
||||
{ |
||||
dlclose(handle); |
||||
} |
||||
|
||||
PGFunction |
||||
pg_dlsym(void *handle, const char *funcname) |
||||
{ |
||||
return dlsym(handle, funcname); |
||||
} |
||||
|
||||
char * |
||||
pg_dlerror(void) |
||||
{ |
||||
return dlerror(); |
||||
} |
@ -1,8 +0,0 @@ |
||||
/* src/backend/port/dynloader/darwin.h */ |
||||
|
||||
#include "fmgr.h" |
||||
|
||||
void *pg_dlopen(const char *filename); |
||||
PGFunction pg_dlsym(void *handle, const char *funcname); |
||||
void pg_dlclose(void *handle); |
||||
char *pg_dlerror(void); |
@ -1,7 +0,0 @@ |
||||
/*
|
||||
* src/backend/port/dynloader/freebsd.c |
||||
* |
||||
* Dummy file used for nothing at this point |
||||
* |
||||
* see freebsd.h |
||||
*/ |
@ -1,38 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* freebsd.h |
||||
* port-specific prototypes for FreeBSD |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/backend/port/dynloader/freebsd.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef PORT_PROTOS_H |
||||
#define PORT_PROTOS_H |
||||
|
||||
#include <dlfcn.h> |
||||
|
||||
#include "utils/dynamic_loader.h" /* pgrminclude ignore */ |
||||
|
||||
/*
|
||||
* In some older systems, the RTLD_NOW flag isn't defined and the mode |
||||
* argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted |
||||
* if available, but it doesn't exist everywhere. |
||||
* If it doesn't exist, set it to 0 so it has no effect. |
||||
*/ |
||||
#ifndef RTLD_NOW |
||||
#define RTLD_NOW 1 |
||||
#endif |
||||
#ifndef RTLD_GLOBAL |
||||
#define RTLD_GLOBAL 0 |
||||
#endif |
||||
|
||||
#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) |
||||
#define pg_dlsym dlsym |
||||
#define pg_dlclose dlclose |
||||
#define pg_dlerror dlerror |
||||
|
||||
#endif /* PORT_PROTOS_H */ |
@ -1,68 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* dynloader.c |
||||
* dynamic loader for HP-UX using the shared library mechanism |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* |
||||
* IDENTIFICATION |
||||
* src/backend/port/dynloader/hpux.c |
||||
* |
||||
* NOTES |
||||
* all functions are defined here -- it's impossible to trace the |
||||
* shl_* routines from the bundled HP-UX debugger. |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#include "postgres.h" |
||||
|
||||
/* System includes */ |
||||
#include <a.out.h> |
||||
#include <dl.h> |
||||
|
||||
#include "dynloader.h" |
||||
#include "utils/dynamic_loader.h" |
||||
|
||||
void * |
||||
pg_dlopen(const char *filename) |
||||
{ |
||||
/*
|
||||
* Use BIND_IMMEDIATE so that undefined symbols cause a failure return |
||||
* from shl_load(), rather than an abort() later on when we attempt to |
||||
* call the library! |
||||
*/ |
||||
shl_t handle = shl_load(filename, |
||||
BIND_IMMEDIATE | BIND_VERBOSE | DYNAMIC_PATH, |
||||
0L); |
||||
|
||||
return (void *) handle; |
||||
} |
||||
|
||||
PGFunction |
||||
pg_dlsym(void *handle, const char *funcname) |
||||
{ |
||||
PGFunction f; |
||||
|
||||
if (shl_findsym((shl_t *) & handle, funcname, TYPE_PROCEDURE, &f) == -1) |
||||
f = (PGFunction) NULL; |
||||
return f; |
||||
} |
||||
|
||||
void |
||||
pg_dlclose(void *handle) |
||||
{ |
||||
shl_unload((shl_t) handle); |
||||
} |
||||
|
||||
char * |
||||
pg_dlerror(void) |
||||
{ |
||||
static char errmsg[] = "shl_load failed"; |
||||
|
||||
if (errno) |
||||
return strerror(errno); |
||||
|
||||
return errmsg; |
||||
} |
@ -1,25 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* dynloader.h |
||||
* dynamic loader for HP-UX using the shared library mechanism |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* |
||||
* IDENTIFICATION |
||||
* src/backend/port/dynloader/hpux.h |
||||
* |
||||
* NOTES |
||||
* all functions are defined here -- it's impossible to trace the |
||||
* shl_* routines from the bundled HP-UX debugger. |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
/* System includes */ |
||||
#include "fmgr.h" |
||||
|
||||
extern void *pg_dlopen(const char *filename); |
||||
extern PGFunction pg_dlsym(void *handle, const char *funcname); |
||||
extern void pg_dlclose(void *handle); |
||||
extern char *pg_dlerror(void); |
@ -1,7 +0,0 @@ |
||||
/*
|
||||
* src/backend/port/dynloader/linux.c |
||||
* |
||||
* Dummy file used for nothing at this point |
||||
* |
||||
* see linux.h |
||||
*/ |
@ -1,38 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* linux.h |
||||
* Port-specific prototypes for Linux |
||||
* |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/backend/port/dynloader/linux.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef PORT_PROTOS_H |
||||
#define PORT_PROTOS_H |
||||
|
||||
#include "utils/dynamic_loader.h" /* pgrminclude ignore */ |
||||
#include <dlfcn.h> |
||||
|
||||
/*
|
||||
* In some older systems, the RTLD_NOW flag isn't defined and the mode |
||||
* argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted |
||||
* if available, but it doesn't exist everywhere. |
||||
* If it doesn't exist, set it to 0 so it has no effect. |
||||
*/ |
||||
#ifndef RTLD_NOW |
||||
#define RTLD_NOW 1 |
||||
#endif |
||||
#ifndef RTLD_GLOBAL |
||||
#define RTLD_GLOBAL 0 |
||||
#endif |
||||
|
||||
#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) |
||||
#define pg_dlsym dlsym |
||||
#define pg_dlclose dlclose |
||||
#define pg_dlerror dlerror |
||||
|
||||
#endif /* PORT_PROTOS_H */ |
@ -1,7 +0,0 @@ |
||||
/*
|
||||
* src/backend/port/dynloader/netbsd.c |
||||
* |
||||
* Dummy file used for nothing at this point |
||||
* |
||||
* see netbsd.h |
||||
*/ |
@ -1,38 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* netbsd.h |
||||
* port-specific prototypes for NetBSD |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/backend/port/dynloader/netbsd.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef PORT_PROTOS_H |
||||
#define PORT_PROTOS_H |
||||
|
||||
#include <dlfcn.h> |
||||
|
||||
#include "utils/dynamic_loader.h" /* pgrminclude ignore */ |
||||
|
||||
/*
|
||||
* In some older systems, the RTLD_NOW flag isn't defined and the mode |
||||
* argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted |
||||
* if available, but it doesn't exist everywhere. |
||||
* If it doesn't exist, set it to 0 so it has no effect. |
||||
*/ |
||||
#ifndef RTLD_NOW |
||||
#define RTLD_NOW 1 |
||||
#endif |
||||
#ifndef RTLD_GLOBAL |
||||
#define RTLD_GLOBAL 0 |
||||
#endif |
||||
|
||||
#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) |
||||
#define pg_dlsym dlsym |
||||
#define pg_dlclose dlclose |
||||
#define pg_dlerror dlerror |
||||
|
||||
#endif /* PORT_PROTOS_H */ |
@ -1,7 +0,0 @@ |
||||
/*
|
||||
* src/backend/port/dynloader/openbsd.c |
||||
* |
||||
* Dummy file used for nothing at this point |
||||
* |
||||
* see openbsd.h |
||||
*/ |
@ -1,38 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* openbsd.h |
||||
* port-specific prototypes for OpenBSD |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/backend/port/dynloader/openbsd.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef PORT_PROTOS_H |
||||
#define PORT_PROTOS_H |
||||
|
||||
#include <dlfcn.h> |
||||
|
||||
#include "utils/dynamic_loader.h" /* pgrminclude ignore */ |
||||
|
||||
/*
|
||||
* In some older systems, the RTLD_NOW flag isn't defined and the mode |
||||
* argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted |
||||
* if available, but it doesn't exist everywhere. |
||||
* If it doesn't exist, set it to 0 so it has no effect. |
||||
*/ |
||||
#ifndef RTLD_NOW |
||||
#define RTLD_NOW 1 |
||||
#endif |
||||
#ifndef RTLD_GLOBAL |
||||
#define RTLD_GLOBAL 0 |
||||
#endif |
||||
|
||||
#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) |
||||
#define pg_dlsym dlsym |
||||
#define pg_dlclose dlclose |
||||
#define pg_dlerror dlerror |
||||
|
||||
#endif /* PORT_PROTOS_H */ |
@ -1,7 +0,0 @@ |
||||
/*
|
||||
* src/backend/port/dynloader/solaris.c |
||||
* |
||||
* Dummy file used for nothing at this point |
||||
* |
||||
* see solaris.h |
||||
*/ |
@ -1,38 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* solaris.h |
||||
* port-specific prototypes for Solaris |
||||
* |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/backend/port/dynloader/solaris.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef PORT_PROTOS_H |
||||
#define PORT_PROTOS_H |
||||
|
||||
#include <dlfcn.h> |
||||
#include "utils/dynamic_loader.h" /* pgrminclude ignore */ |
||||
|
||||
/*
|
||||
* In some older systems, the RTLD_NOW flag isn't defined and the mode |
||||
* argument to dlopen must always be 1. The RTLD_GLOBAL flag is wanted |
||||
* if available, but it doesn't exist everywhere. |
||||
* If it doesn't exist, set it to 0 so it has no effect. |
||||
*/ |
||||
#ifndef RTLD_NOW |
||||
#define RTLD_NOW 1 |
||||
#endif |
||||
#ifndef RTLD_GLOBAL |
||||
#define RTLD_GLOBAL 0 |
||||
#endif |
||||
|
||||
#define pg_dlopen(f) dlopen((f), RTLD_NOW | RTLD_GLOBAL) |
||||
#define pg_dlsym dlsym |
||||
#define pg_dlclose dlclose |
||||
#define pg_dlerror dlerror |
||||
|
||||
#endif /* PORT_PROTOS_H */ |
@ -1,19 +0,0 @@ |
||||
/*
|
||||
* src/backend/port/dynloader/win32.h |
||||
*/ |
||||
#ifndef PORT_PROTOS_H |
||||
#define PORT_PROTOS_H |
||||
|
||||
#include "utils/dynamic_loader.h" /* pgrminclude ignore */ |
||||
|
||||
#define pg_dlopen(f) dlopen((f), 1) |
||||
#define pg_dlsym dlsym |
||||
#define pg_dlclose dlclose |
||||
#define pg_dlerror dlerror |
||||
|
||||
char *dlerror(void); |
||||
int dlclose(void *handle); |
||||
void *dlsym(void *handle, const char *symbol); |
||||
void *dlopen(const char *path, int mode); |
||||
|
||||
#endif /* PORT_PROTOS_H */ |
@ -1,25 +0,0 @@ |
||||
/*-------------------------------------------------------------------------
|
||||
* |
||||
* dynamic_loader.h |
||||
* |
||||
* |
||||
* |
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group |
||||
* Portions Copyright (c) 1994, Regents of the University of California |
||||
* |
||||
* src/include/utils/dynamic_loader.h |
||||
* |
||||
*------------------------------------------------------------------------- |
||||
*/ |
||||
#ifndef DYNAMIC_LOADER_H |
||||
#define DYNAMIC_LOADER_H |
||||
|
||||
#include "fmgr.h" |
||||
|
||||
|
||||
extern void *pg_dlopen(const char *filename); |
||||
extern PGFunction pg_dlsym(void *handle, const char *funcname); |
||||
extern void pg_dlclose(void *handle); |
||||
extern char *pg_dlerror(void); |
||||
|
||||
#endif /* DYNAMIC_LOADER_H */ |
Loading…
Reference in new issue