From 135d7a10f83d336a27d5a1588f9ab5d90b07028b Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Thu, 3 Oct 2019 17:36:43 +0000 Subject: Changes to make Postgresql run on Haiku. Adapted from Mark Hellegers' 9.3.5 patch. diff --git a/configure.in b/configure.in index 6942f81..339db16 100644 --- a/configure.in +++ b/configure.in @@ -64,6 +64,7 @@ case $host_os in dragonfly*) template=netbsd ;; freebsd*) template=freebsd ;; hpux*) template=hpux ;; + haiku*) template=haiku ;; linux*|gnu*|k*bsd*-gnu) template=linux ;; mingw*) template=win32 ;; @@ -1138,21 +1139,21 @@ AC_SUBST(PTHREAD_LIBS) AC_CHECK_LIB(m, main) AC_SEARCH_LIBS(setproctitle, util) -AC_SEARCH_LIBS(dlopen, dl) -AC_SEARCH_LIBS(socket, [socket ws2_32]) +AC_SEARCH_LIBS(dlopen, [rt root]) +AC_SEARCH_LIBS(socket, [socket ws2_32 network]) AC_SEARCH_LIBS(shl_load, dld) AC_SEARCH_LIBS(getopt_long, [getopt gnugetopt]) AC_SEARCH_LIBS(crypt, crypt) -AC_SEARCH_LIBS(shm_open, rt) -AC_SEARCH_LIBS(shm_unlink, rt) -AC_SEARCH_LIBS(clock_gettime, [rt posix4]) +AC_SEARCH_LIBS(shm_open, [rt root]) +AC_SEARCH_LIBS(shm_unlink, [rt root]) +AC_SEARCH_LIBS(clock_gettime, [rt posix4 root]) # Solaris: AC_SEARCH_LIBS(fdatasync, [rt posix4]) # Required for thread_test.c on Solaris AC_SEARCH_LIBS(sched_yield, rt) # Required for thread_test.c on Solaris 2.5: # Other ports use it too (HP-UX) so test unconditionally -AC_SEARCH_LIBS(gethostbyname_r, nsl) +AC_SEARCH_LIBS(gethostbyname_r, [nsl network]) # Cygwin: AC_SEARCH_LIBS(shmget, cygipc) @@ -1996,7 +1997,10 @@ AC_DEFINE_UNQUOTED(MAXIMUM_ALIGNOF, $MAX_ALIGNOF, [Define as the maximum alignme # Some platforms predefine the types int8, int16, etc. Only check # a (hopefully) representative subset. AC_CHECK_TYPES([int8, uint8, int64, uint64], [], [], -[#include ]) +[#include +#ifdef __HAIKU__ +#include +#endif]) # Some compilers offer a 128-bit integer scalar type. PGAC_TYPE_128BIT_INT diff --git a/src/Makefile.global.in b/src/Makefile.global.in index b9d86ac..edd87b0 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -723,6 +723,20 @@ endif # Not really standard libc functions, used by the backend. TAS = @TAS@ +########################################################################## +# +# Packaging on Haiku puts everything in a postgresql directory +# Force the override into postgresql directory + +ifndef PGXS +ifeq ($(PORTNAME), haiku) +override datadir := $(datadir)/postgresql +override sysconfdir := $(sysconfdir)/postgresql +override pkglibdir := $(pkglibdir)/postgresql +override pkgincludedir := $(pkgincludedir)/postgresql +override docdir := $(docdir)/postgresql +endif +endif ########################################################################## # diff --git a/src/Makefile.shlib b/src/Makefile.shlib index 373d73c..a08175d 100644 --- a/src/Makefile.shlib +++ b/src/Makefile.shlib @@ -268,6 +268,12 @@ ifeq ($(PORTNAME), win32) haslibarule = yes endif +ifeq ($(PORTNAME), haiku) + ifdef SO_MAJOR_VERSION + shlib = lib$(NAME)$(DLSUFFIX) + endif + LINK.shared = $(CC) -shared +endif ## @@ -302,6 +308,7 @@ endif #haslibarule ifeq (,$(filter cygwin win32,$(PORTNAME))) +ifneq ($(PORTNAME), haiku) ifneq ($(PORTNAME), aix) # Normal case @@ -352,6 +359,14 @@ $(shlib): $(OBJS) | $(SHLIB_PREREQS) endif # PORTNAME == aix +else # PORTNAME == haiku + +# Haiku case +$(shlib): $(OBJS) + $(LINK.shared) $(LDFLAGS_SL) -o $@ $(OBJS) $(SHLIB_LINK) + +endif # PORTNAME == haiku + else # PORTNAME == cygwin || PORTNAME == win32 ifeq ($(PORTNAME), cygwin) diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index dd0a7d8..80816c4 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -1230,7 +1230,7 @@ reportDependentObjects(const ObjectAddresses *targetObjects, * *depRel is the already-open pg_depend relation. */ static void -deleteOneObject(const ObjectAddress *object, Relation *depRel, int flags) +deleteOneObject(const ObjectAddress *object, Relation *depRel, int32 flags) { ScanKeyData key[3]; int nkeys; diff --git a/src/backend/executor/nodeMergeAppend.c b/src/backend/executor/nodeMergeAppend.c index 7ba53ba..04b8ca4 100644 --- a/src/backend/executor/nodeMergeAppend.c +++ b/src/backend/executor/nodeMergeAppend.c @@ -52,7 +52,7 @@ typedef int32 SlotNumber; static TupleTableSlot *ExecMergeAppend(PlanState *pstate); -static int heap_compare_slots(Datum a, Datum b, void *arg); +static int32 heap_compare_slots(Datum a, Datum b, void *arg); /* ---------------------------------------------------------------- diff --git a/src/backend/main/main.c b/src/backend/main/main.c index 7b18f8c..c34549a 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -385,7 +385,7 @@ help(const char *progname) static void check_root(const char *progname) { -#ifndef WIN32 +#if !defined(WIN32) && !defined(__HAIKU__) if (geteuid() == 0) { write_stderr("\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -409,7 +409,10 @@ check_root(const char *progname) progname); exit(1); } -#else /* WIN32 */ +#elif defined(__HAIKU__) + { + } +#else /* WIN32 or HAIKU */ if (pgwin32_is_admin()) { write_stderr("Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -419,5 +422,5 @@ check_root(const char *progname) "more information on how to properly start the server.\n"); exit(1); } -#endif /* WIN32 */ +#endif /* WIN32 or HAIKU */ } diff --git a/src/backend/port/Makefile b/src/backend/port/Makefile index f4120be..0314987 100644 --- a/src/backend/port/Makefile +++ b/src/backend/port/Makefile @@ -27,6 +27,10 @@ ifeq ($(PORTNAME), win32) SUBDIRS += win32 endif +ifeq ($(PORTNAME), haiku) +SUBDIRS += haiku +endif + include $(top_srcdir)/src/backend/common.mk tas.o: tas.s diff --git a/src/backend/port/dynloader/haiku.c b/src/backend/port/dynloader/haiku.c new file mode 100644 index 0000000..db24966 --- /dev/null +++ b/src/backend/port/dynloader/haiku.c @@ -0,0 +1,6 @@ +/* src/backend/port/dynloader/haiku.c */ + +/* Dummy file used for nothing at this point + * + * see haiku.h + */ diff --git a/src/backend/port/dynloader/haiku.h b/src/backend/port/dynloader/haiku.h new file mode 100644 index 0000000..61ffb51 --- /dev/null +++ b/src/backend/port/dynloader/haiku.h @@ -0,0 +1,33 @@ +/*------------------------------------------------------------------------- + * + * haiku.h + * port-specific prototypes for Haiku + * + * + * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/backend/port/dynloader/haiku.h + * + *------------------------------------------------------------------------- + */ +#ifndef PORT_PROTOS_H +#define PORT_PROTOS_H + +#include +#include "utils/dynamic_loader.h" /* pgrminclude ignore */ + +/* + * Dynamic Loader on Haiku. + * + * this dynamic loader uses the system dynamic loading interface for shared + * libraries (ie. dlopen/dlsym/dlclose). The user must specify a shared + * library as the file to be dynamically loaded. + */ + +#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 */ diff --git a/src/backend/port/haiku/Makefile b/src/backend/port/haiku/Makefile new file mode 100644 index 0000000..f0664c0 --- /dev/null +++ b/src/backend/port/haiku/Makefile @@ -0,0 +1,14 @@ +#------------------------------------------------------------------------- +# +# Makefile-- +# Makefile for port/haiku +# +#------------------------------------------------------------------------- + +subdir = src/backend/port/haiku +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global + +OBJS = shm.o + +include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/port/haiku/shm.c b/src/backend/port/haiku/shm.c new file mode 100644 index 0000000..55a9dc7 --- /dev/null +++ b/src/backend/port/haiku/shm.c @@ -0,0 +1,144 @@ +/*------------------------------------------------------------------------- + * + * shm.c + * Haiku System V Shared Memory Emulation + * + * Copyright (c) 1999-2001, Cyril VELTER + * + *------------------------------------------------------------------------- + */ + +#include +#include "postgres.h" +#include +#include + +/* Emulating SYS shared memory with beos areas. WARNING : fork clone +areas in copy on write mode */ + +/* Detach from a shared mem area based on its address */ +int +shmdt(char *shmaddr) +{ + /* Find area id for this address */ + area_id s; + + s = area_for(shmaddr); + + /* Delete area */ + return delete_area(s); +} + +/* Attach to an existing area */ +int * +shmat(int memId, int m1, int m2) +{ + /* Get our team id */ + thread_info thinfo; + team_info teinfo; + area_info ainfo; + + get_thread_info(find_thread(NULL), &thinfo); + get_team_info(thinfo.team, &teinfo); + + /* Get area teamid */ + if (get_area_info(memId, &ainfo) != B_OK) + printf("AREA %d Invalide\n", memId); + + if (ainfo.team == teinfo.team) + { + /* + * the area is already in our address space, just return the address + */ + return (int *) ainfo.address; + } + else + { + /* + * the area is not in our address space, clone it before and return + * the address + */ + area_id narea; + + narea = clone_area(ainfo.name, &(ainfo.address), B_CLONE_ADDRESS, B_READ_AREA | B_WRITE_AREA, memId); + get_area_info(narea, &ainfo); + return (int *) ainfo.address; + } +} + +/* Control a shared mem area */ +int +shmctl(int shmid, int flag, struct shmid_ds * dummy) +{ + if (flag == IPC_RMID) + { + /* Delete the area */ + delete_area(shmid); + return 0; + } + if (flag == IPC_STAT) + { + /* Find any SYSV area with the shmid in its name */ + + area_info inf; + team_info infteam; + int32 cookteam = 0; + char name[50]; + + sprintf(name, "SYSV_IPC %d", shmid); + + dummy->shm_nattch = 0; + + while (get_next_team_info(&cookteam, &infteam) == B_OK) + { + int32 cook = 0; + + while (get_next_area_info(infteam.team, &cook, &inf) == B_OK) + { + if (strcmp(name, inf.name) == 0) + dummy->shm_nattch++; + } + } + + errno = 0; + return 0; + } + errno = EINVAL; + return -1; +} + +/* Get an area based on the IPC key */ +int +shmget(int memKey, int size, int flag) +{ + char nom[50]; + void *Address; + area_id parea; + area_id original; + area_id clone; + + /* Area name */ + sprintf(nom, "SYSV_IPC_SHM : %d", memKey); + + /* Find area */ + parea = find_area(nom); + + /* area exist, just return its id */ + if (parea != B_NAME_NOT_FOUND) + return parea; + + /* area does not exist and no creation is requested : error */ + if (flag == 0) + return -1; + + /* + * area does not exist and its creation is requested, create it (be sure + * to have a 4ko multiple size + */ + original = create_area(nom, &Address, B_ANY_ADDRESS, ((size / 4096) + 1) * 4096, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA); + + clone = clone_area(nom, &Address, B_CLONE_ADDRESS, B_READ_AREA | B_WRITE_AREA, original); + + return original; + +} diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index c28cc37..8ebc826 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -4585,7 +4585,7 @@ ShowUsage(const char *title) (long) user.tv_usec, (long) sys.tv_sec, (long) sys.tv_usec); -#if defined(HAVE_GETRUSAGE) +#if defined(HAVE_GETRUSAGE) && !defined(__HAIKU__) appendStringInfo(&str, "!\t%ld kB max resident size\n", #if defined(__darwin__) diff --git a/src/backend/tsearch/ts_parse.c b/src/backend/tsearch/ts_parse.c index 171ade2..41fa32d 100644 --- a/src/backend/tsearch/ts_parse.c +++ b/src/backend/tsearch/ts_parse.c @@ -355,7 +355,7 @@ LexizeExec(LexizeData *ld, ParsedLex **correspondLexem) * prs will be filled in. */ void -parsetext(Oid cfgId, ParsedText *prs, char *buf, int buflen) +parsetext(Oid cfgId, ParsedText *prs, char *buf, int32 buflen) { int type, lenlemm; @@ -530,7 +530,7 @@ addHLParsedLex(HeadlineParsedText *prs, TSQuery query, ParsedLex *lexs, TSLexeme } void -hlparsetext(Oid cfgId, HeadlineParsedText *prs, TSQuery query, char *buf, int buflen) +hlparsetext(Oid cfgId, HeadlineParsedText *prs, TSQuery query, char *buf, int32 buflen) { int type, lenlemm; diff --git a/src/backend/utils/adt/tsquery_cleanup.c b/src/backend/utils/adt/tsquery_cleanup.c index af07563..1a2f8bf 100644 --- a/src/backend/utils/adt/tsquery_cleanup.c +++ b/src/backend/utils/adt/tsquery_cleanup.c @@ -186,7 +186,7 @@ clean_NOT_intree(NODE *node) } QueryItem * -clean_NOT(QueryItem *ptr, int *len) +clean_NOT(QueryItem *ptr, int32 *len) { NODE *root = maketree(ptr); diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index acf6108..eb438ca 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -645,7 +645,7 @@ get_id(void) { const char *username; -#ifndef WIN32 +#if !defined(WIN32) && !defined(__HAIKU__) if (geteuid() == 0) /* 0 is root's uid */ { pg_log_error("cannot be run as root"); diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index dfb6c19..b792f7d 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -2302,7 +2302,7 @@ main(int argc, char **argv) /* * Disallow running as root, to forestall any possible security holes. */ -#ifndef WIN32 +#if !defined(WIN32) && !defined(__HAIKU__) if (geteuid() == 0) { write_stderr(_("%s: cannot be run as root\n" diff --git a/src/include/c.h b/src/include/c.h index 2a082af..586b10a 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -55,6 +55,11 @@ #include "pg_config_manual.h" /* must be after pg_config.h */ #include "pg_config_os.h" /* must be before any system header files */ +#if defined(__HAIKU__) +// Haiku defines int (int8, int64, etc) types in SupportDefs.h +#include +#endif + /* System header files that should be available everywhere in Postgres */ #include #include diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 743401c..1fe55a3 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -119,7 +119,7 @@ /* * Define this if your operating system supports link() */ -#if !defined(WIN32) && !defined(__CYGWIN__) +#if !defined(WIN32) && !defined(__CYGWIN__) && !defined(__HAIKU__) #define HAVE_WORKING_LINK 1 #endif diff --git a/src/include/port/haiku.h b/src/include/port/haiku.h new file mode 100644 index 0000000..772a3fe --- /dev/null +++ b/src/include/port/haiku.h @@ -0,0 +1,16 @@ +/* src/include/port/haiku.h */ + +/* Haiku doesn't have all the required getrusage fields */ +//#undef HAVE_GETRUSAGE + +/* Haiku doesn't implement shared memory as needed*/ +struct shmid_ds +{ + int dummy; + int shm_nattch; +}; + +int shmdt(char *shmaddr); +int *shmat(int memId, int m1, int m2); +int shmctl(int shmid, int flag, struct shmid_ds * dummy); +int shmget(int memKey, int size, int flag); diff --git a/src/include/storage/dsm_impl.h b/src/include/storage/dsm_impl.h index 1dc557b..184b166 100644 --- a/src/include/storage/dsm_impl.h +++ b/src/include/storage/dsm_impl.h @@ -31,10 +31,12 @@ #define USE_DSM_POSIX #define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_POSIX #endif +#ifndef __HAIKU__ #define USE_DSM_SYSV #ifndef DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE #define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_SYSV #endif +#endif #define USE_DSM_MMAP #endif diff --git a/src/makefiles/Makefile.haiku b/src/makefiles/Makefile.haiku new file mode 100644 index 0000000..249d6c3 --- /dev/null +++ b/src/makefiles/Makefile.haiku @@ -0,0 +1,7 @@ +AROPT = crs + +DLSUFFIX = .so + +# Rule for building a shared library from a single .o file +%.so: %.o + $(CC) $(CFLAGS) $(LDFLAGS) $(LDFLAGS_SL) -shared -o $@ $< diff --git a/src/template/haiku b/src/template/haiku new file mode 100644 index 0000000..e69de29 -- 2.45.2 From 935cf953e151add708ad32a2f3074cc721ed65c7 Mon Sep 17 00:00:00 2001 From: begasus Date: Mon, 26 Dec 2022 17:35:12 +0100 Subject: adjust autoconf required version diff --git a/configure.in b/configure.in index 339db16..f9339f5 100644 --- a/configure.in +++ b/configure.in @@ -19,7 +19,7 @@ m4_pattern_forbid(^PGAC_)dnl to catch undefined macros AC_INIT([PostgreSQL], [12.0], [pgsql-bugs@lists.postgresql.org]) -m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.69], [], [m4_fatal([Autoconf version 2.69 is required. +m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.71], [], [m4_fatal([Autoconf version 2.69 is required. Untested combinations of 'autoconf' and PostgreSQL versions are not recommended. You can remove the check from 'configure.in' but it is then your responsibility whether the result works or not.])]) -- 2.45.2 From 047de666b5dd5353f46ff5bb5d097f5cac7fbf92 Mon Sep 17 00:00:00 2001 From: Begasus Date: Fri, 9 Feb 2024 16:23:14 +0100 Subject: Fix build with newer ldap (from upstream) diff --git a/configure.in b/configure.in index f9339f5..af3fc1d 100644 --- a/configure.in +++ b/configure.in @@ -1236,17 +1236,20 @@ fi if test "$with_ldap" = yes ; then _LIBS="$LIBS" if test "$PORTNAME" != "win32"; then - AC_CHECK_LIB(ldap, ldap_bind, [], - [AC_MSG_ERROR([library 'ldap' is required for LDAP])], - [$EXTRA_LDAP_LIBS]) - LDAP_LIBS_BE="-lldap $EXTRA_LDAP_LIBS" if test "$enable_thread_safety" = yes; then # on some platforms ldap_r fails to link without PTHREAD_LIBS - AC_CHECK_LIB(ldap_r, ldap_simple_bind, [], - [AC_MSG_ERROR([library 'ldap_r' is required for LDAP])], + # OpenLDAP 2.5 merged ldap_r with ldap + LIBS="" + AC_SEARCH_LIBS(ldap_simple_bind, [ldap_r ldap], [], + [AC_MSG_ERROR([not found in any LDAP library])], [$PTHREAD_CFLAGS $PTHREAD_LIBS $EXTRA_LDAP_LIBS]) - LDAP_LIBS_FE="-lldap_r $EXTRA_LDAP_LIBS" + LDAP_LIBS_BE="-lldap $EXTRA_LDAP_LIBS" + LDAP_LIBS_FE="$LIBS $EXTRA_LDAP_LIBS" else + AC_CHECK_LIB(ldap, ldap_bind, [], + [AC_MSG_ERROR([library 'ldap' is required for LDAP])], + [$EXTRA_LDAP_LIBS]) + LDAP_LIBS_BE="-lldap $EXTRA_LDAP_LIBS" LDAP_LIBS_FE="-lldap $EXTRA_LDAP_LIBS" fi AC_CHECK_FUNCS([ldap_initialize]) -- 2.45.2 From 46227773c186d562b9e478ff7de21227990e39e5 Mon Sep 17 00:00:00 2001 From: Schrijvers Luc Date: Fri, 30 Aug 2024 17:54:01 +0200 Subject: Fix 32bit build diff --git a/src/include/c.h b/src/include/c.h index 586b10a..7a1aef3 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -345,6 +345,9 @@ typedef char *Pointer; * used for numerical computations and the * frontend/backend protocol. */ +#ifdef __HAIKU__ +#include +#else #ifndef HAVE_INT8 typedef signed char int8; /* == 8 bits */ typedef signed short int16; /* == 16 bits */ @@ -362,7 +365,7 @@ typedef unsigned char uint8; /* == 8 bits */ typedef unsigned short uint16; /* == 16 bits */ typedef unsigned int uint32; /* == 32 bits */ #endif /* not HAVE_UINT8 */ - +#endif /* * bitsN * Unit of bitwise operation, AT LEAST N BITS IN SIZE. -- 2.45.2