From dd70e439dfc79af38cc1d488ffe3174b55315f91 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" Date: Tue, 25 Aug 1998 14:07:13 +0000 Subject: re-integrate nextstep dynloader functionality From: Jacek Lasecki --- src/backend/port/dynloader/nextstep.c | 81 +++++++++++++++++++++++++++++++++ src/backend/port/dynloader/nextstep.h | 27 +++++++++++ src/backend/port/nextstep/dynloader.c | 81 --------------------------------- src/backend/port/nextstep/port-protos.h | 27 ----------- 4 files changed, 108 insertions(+), 108 deletions(-) create mode 100644 src/backend/port/dynloader/nextstep.c create mode 100644 src/backend/port/dynloader/nextstep.h delete mode 100644 src/backend/port/nextstep/dynloader.c delete mode 100644 src/backend/port/nextstep/port-protos.h diff --git a/src/backend/port/dynloader/nextstep.c b/src/backend/port/dynloader/nextstep.c new file mode 100644 index 00000000000..66cbba9e8ca --- /dev/null +++ b/src/backend/port/dynloader/nextstep.c @@ -0,0 +1,81 @@ +#include +#include +#include + +static char *lastError = NULL; + +static NXStream * +OpenError() +{ + return NXOpenMemory(NULL, 0, NX_WRITEONLY); +} + +static void +CloseError(NXStream * s) +{ + if (s) + NXCloseMemory(s, NX_FREEBUFFER); +} + +static void +TransferError(NXStream * s) +{ + char *buffer; + int len, + maxlen; + + if (lastError) + free(lastError); + NXGetMemoryBuffer(s, &buffer, &len, &maxlen); + lastError = malloc(len + 1); + strcpy(lastError, buffer); +} + +void * +next_dlopen(char *name) +{ + int rld_success; + NXStream *errorStream; + char *result = NULL; + char **p; + + errorStream = OpenError(); + p = calloc(2, sizeof(void *)); + p[0] = name; + rld_success = rld_load(errorStream, NULL, p, NULL); + free(p); + + if (!rld_success) + { + TransferError(errorStream); + result = (char *) 1; + } + CloseError(errorStream); + return result; +} + +int +next_dlclose(void *handle) +{ + return 0; +} + +void * +next_dlsym(void *handle, char *symbol) +{ + NXStream *errorStream = OpenError(); + char symbuf[1024]; + unsigned long symref = 0; + + sprintf(symbuf, "_%s", symbol); + if (!rld_lookup(errorStream, symbuf, &symref)) + TransferError(errorStream); + CloseError(errorStream); + return (void *) symref; +} + +char * +next_dlerror(void) +{ + return lastError; +} diff --git a/src/backend/port/dynloader/nextstep.h b/src/backend/port/dynloader/nextstep.h new file mode 100644 index 00000000000..dfd72a83a69 --- /dev/null +++ b/src/backend/port/dynloader/nextstep.h @@ -0,0 +1,27 @@ +/*------------------------------------------------------------------------- + * + * port-protos.h-- + * port-specific prototypes for NeXT + * + +------------------------------------------------------------------------- + */ +#ifndef PORT_PROTOS_H +#define PORT_PROTOS_H + +#include "fmgr.h" /* for func_ptr */ +#include "utils/dynamic_loader.h" + +void *next_dlopen(char *name); +int next_dlclose(void *handle); +void *next_dlsym(void *handle, char *symbol); +char *next_dlerror(void); + +#define pg_dlopen(f) next_dlopen +#define pg_dlsym next_dlsym +#define pg_dlclose next_dlclose +#define pg_dlerror next_dlerror + +/* port.c */ + +#endif /* PORT_PROTOS_H */ diff --git a/src/backend/port/nextstep/dynloader.c b/src/backend/port/nextstep/dynloader.c deleted file mode 100644 index 66cbba9e8ca..00000000000 --- a/src/backend/port/nextstep/dynloader.c +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include -#include - -static char *lastError = NULL; - -static NXStream * -OpenError() -{ - return NXOpenMemory(NULL, 0, NX_WRITEONLY); -} - -static void -CloseError(NXStream * s) -{ - if (s) - NXCloseMemory(s, NX_FREEBUFFER); -} - -static void -TransferError(NXStream * s) -{ - char *buffer; - int len, - maxlen; - - if (lastError) - free(lastError); - NXGetMemoryBuffer(s, &buffer, &len, &maxlen); - lastError = malloc(len + 1); - strcpy(lastError, buffer); -} - -void * -next_dlopen(char *name) -{ - int rld_success; - NXStream *errorStream; - char *result = NULL; - char **p; - - errorStream = OpenError(); - p = calloc(2, sizeof(void *)); - p[0] = name; - rld_success = rld_load(errorStream, NULL, p, NULL); - free(p); - - if (!rld_success) - { - TransferError(errorStream); - result = (char *) 1; - } - CloseError(errorStream); - return result; -} - -int -next_dlclose(void *handle) -{ - return 0; -} - -void * -next_dlsym(void *handle, char *symbol) -{ - NXStream *errorStream = OpenError(); - char symbuf[1024]; - unsigned long symref = 0; - - sprintf(symbuf, "_%s", symbol); - if (!rld_lookup(errorStream, symbuf, &symref)) - TransferError(errorStream); - CloseError(errorStream); - return (void *) symref; -} - -char * -next_dlerror(void) -{ - return lastError; -} diff --git a/src/backend/port/nextstep/port-protos.h b/src/backend/port/nextstep/port-protos.h deleted file mode 100644 index 9dfb20a99e4..00000000000 --- a/src/backend/port/nextstep/port-protos.h +++ /dev/null @@ -1,27 +0,0 @@ -/*------------------------------------------------------------------------- - * - * port-protos.h-- - * port-specific prototypes for NeXT - * - -------------------------------------------------------------------------- - */ -#ifndef PORT_PROTOS_H -#define PORT_PROTOS_H - -#include "fmgr.h" /* for func_ptr */ -#include "utils/dynamic_loader.h" - -void *next_dlopen(char *name); -int next_dlclose(void *handle); -void *next_dlsym(void *handle, char *symbol); -char *next_dlerror(void); - -#define pg_dlopen(f) next_dlopen -#define pg_dlsym next_dlsym -#define pg_dlclose next_dlclose -#define pg_dlerror next_dlerror - -/* port.c */ - -#endif /* PORT_PROTOS_H */ -- cgit v1.2.3