Add nextstep port, courtesy of Ovidiu Predescu.
This commit is contained in:
parent
ef228cb170
commit
2de3d96f69
31
src/backend/port/nextstep/Makefile
Normal file
31
src/backend/port/nextstep/Makefile
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#-------------------------------------------------------------------------
|
||||||
|
#
|
||||||
|
# Makefile--
|
||||||
|
# Makefile for port/next (NeXTStep 3.3 specific stuff)
|
||||||
|
#
|
||||||
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SRCDIR = ../../..
|
||||||
|
include ../../../Makefile.global
|
||||||
|
|
||||||
|
INCLUDE_OPT = -I../.. \
|
||||||
|
-I../../../include
|
||||||
|
|
||||||
|
CFLAGS+=$(INCLUDE_OPT)
|
||||||
|
|
||||||
|
OBJS = dynloader.o port.o
|
||||||
|
|
||||||
|
all: SUBSYS.o
|
||||||
|
|
||||||
|
SUBSYS.o: $(OBJS)
|
||||||
|
$(LD) -r -o SUBSYS.o $(OBJS)
|
||||||
|
|
||||||
|
depend dep:
|
||||||
|
$(CC) -MM $(INCLUDE_OPT) *.c >depend
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f SUBSYS.o $(OBJS)
|
||||||
|
|
||||||
|
ifeq (depend,$(wildcard depend))
|
||||||
|
include depend
|
||||||
|
endif
|
72
src/backend/port/nextstep/dynloader.c
Normal file
72
src/backend/port/nextstep/dynloader.c
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#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;
|
||||||
|
}
|
6
src/backend/port/nextstep/machine.h
Normal file
6
src/backend/port/nextstep/machine.h
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#ifndef MACHINE_H
|
||||||
|
#define MACHINE_H
|
||||||
|
|
||||||
|
#define BLCKSZ 8192
|
||||||
|
|
||||||
|
#endif
|
27
src/backend/port/nextstep/port-protos.h
Normal file
27
src/backend/port/nextstep/port-protos.h
Normal file
@ -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 */
|
58
src/backend/port/nextstep/port.c
Normal file
58
src/backend/port/nextstep/port.c
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#ifndef _POSIX_SOURCE
|
||||||
|
# include <libc.h>
|
||||||
|
#else
|
||||||
|
# include <unistd.h>
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/signal.h>
|
||||||
|
|
||||||
|
|
||||||
|
void putenv(char* name)
|
||||||
|
{
|
||||||
|
extern char** environ;
|
||||||
|
static int was_mallocated = 0;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
/* Compute the size of environ array including the final NULL */
|
||||||
|
for (size = 1; environ[size++];)
|
||||||
|
/* nothing */;
|
||||||
|
|
||||||
|
if (!was_mallocated) {
|
||||||
|
char** tmp = environ;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
was_mallocated = 1;
|
||||||
|
environ = malloc (size * sizeof(char*));
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
environ[i] = tmp[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
environ = realloc (environ, (size + 1) * sizeof (char*));
|
||||||
|
environ[size - 1] = strcpy (malloc (strlen (name) + 1), name);
|
||||||
|
environ[size] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* strdup (const char* string)
|
||||||
|
{
|
||||||
|
return strcpy (malloc (strlen (string) + 1), string);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef _POSIX_SOURCE
|
||||||
|
int sigaddset(int *set, int signo)
|
||||||
|
{
|
||||||
|
*set |= sigmask(signo);
|
||||||
|
return *set;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sigemptyset(int *set)
|
||||||
|
{
|
||||||
|
return (*set = 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *getcwd(char *buf, size_t size)
|
||||||
|
{
|
||||||
|
return getwd (buf);
|
||||||
|
}
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user