mirror of
https://github.com/postgres/postgres.git
synced 2025-11-29 23:43:17 +03:00
re-integrate nextstep dynloader functionality
From: Jacek Lasecki <jacek@sound.eti.pg.gda.pl>
This commit is contained in:
81
src/backend/port/dynloader/nextstep.c
Normal file
81
src/backend/port/dynloader/nextstep.c
Normal file
@@ -0,0 +1,81 @@
|
||||
#include <mach-o/rld.h>
|
||||
#include <streams/streams.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user