From 0e6ed29a9862097a0bd959c3eb03ddc45682bba6 Mon Sep 17 00:00:00 2001
From: Rumko <rumko@rumko.net>
Date: Sun, 27 Feb 2011 20:56:11 +0100
Subject: [PATCH] DragonFly BSD support.

Based on FreeBSD port with minimal changes.
---
 configure                              |    1 +
 configure.in                           |    1 +
 src/Makefile.shlib                     |   11 ++++
 src/backend/port/dynloader/dragonfly.c |   92 ++++++++++++++++++++++++++++++++
 src/backend/port/dynloader/dragonfly.h |   59 ++++++++++++++++++++
 src/include/port/dragonfly.h           |    1 +
 src/makefiles/Makefile.dragonfly       |   29 ++++++++++
 7 files changed, 194 insertions(+), 0 deletions(-)
 create mode 100644 src/backend/port/dynloader/dragonfly.c
 create mode 100644 src/backend/port/dynloader/dragonfly.h
 create mode 100644 src/include/port/dragonfly.h
 create mode 100644 src/makefiles/Makefile.dragonfly
 create mode 100644 src/template/dragonfly

diff --git a/configure b/configure
index 0bddb5f..6d208ec 100755
--- a/configure
+++ b/configure
@@ -2196,6 +2196,7 @@ case $host_os in
   darwin*) template=darwin ;;
     dgux*) template=dgux ;;
  freebsd*) template=freebsd ;;
+dragonfly*) template=dragonfly ;;
     hpux*) template=hpux ;;
     irix*) template=irix ;;
  linux*|gnu*|k*bsd*-gnu)
diff --git a/configure.in b/configure.in
index 6aae504..3bc9120 100644
--- a/configure.in
+++ b/configure.in
@@ -60,6 +60,7 @@ case $host_os in
   darwin*) template=darwin ;;
     dgux*) template=dgux ;;
  freebsd*) template=freebsd ;;
+dragonfly*) template=dragonfly ;;
     hpux*) template=hpux ;;
     irix*) template=irix ;;
  linux*|gnu*|k*bsd*-gnu)
diff --git a/src/Makefile.shlib b/src/Makefile.shlib
index a5cf6c6..a78c98c 100644
--- a/src/Makefile.shlib
+++ b/src/Makefile.shlib
@@ -198,6 +198,17 @@ ifeq ($(PORTNAME), netbsd)
   endif
 endif
 
+ifeq ($(PORTNAME), dragonfly)
+  ifdef ELF_SYSTEM
+    LINK.shared 	= $(COMPILER) -shared
+    ifdef soname
+      LINK.shared	+= -Wl,-x,-soname,$(soname)
+    endif
+  else
+    LINK.shared 	= $(LD) -x -Bshareable -Bforcearchive
+  endif
+endif
+
 ifeq ($(PORTNAME), hpux)
   ifdef SO_MAJOR_VERSION
     shlib			= lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION)
diff --git a/src/backend/port/dynloader/dragonfly.c b/src/backend/port/dynloader/dragonfly.c
new file mode 100644
index 0000000..a752301
--- /dev/null
+++ b/src/backend/port/dynloader/dragonfly.c
@@ -0,0 +1,92 @@
+/* src/backend/port/dynloader/dragonfly.c */
+
+/*
+ * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *	  notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *	  notice, this list of conditions and the following disclaimer in the
+ *	  documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *	  may be used to endorse or promote products derived from this software
+ *	  without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.	IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)dl.c	5.4 (Berkeley) 2/23/91";
+#endif   /* LIBC_SCCS and not lint */
+
+#include "postgres.h"
+
+#include <nlist.h>
+#include <link.h>
+#include <dlfcn.h>
+
+#include "dynloader.h"
+
+static char error_message[BUFSIZ];
+
+char *
+BSD44_derived_dlerror(void)
+{
+	static char ret[BUFSIZ];
+
+	strcpy(ret, error_message);
+	error_message[0] = 0;
+	return (ret[0] == 0) ? NULL : ret;
+}
+
+void *
+BSD44_derived_dlopen(const char *file, int num)
+{
+	void	   *vp;
+
+	if ((vp = dlopen((char *) file, num)) == NULL)
+		snprintf(error_message, sizeof(error_message),
+				 "dlopen (%s) failed: %s", file, dlerror());
+	return vp;
+}
+
+void *
+BSD44_derived_dlsym(void *handle, const char *name)
+{
+	void	   *vp;
+
+#ifndef __ELF__
+	char		buf[BUFSIZ];
+
+	if (*name != '_')
+	{
+		snprintf(buf, sizeof(buf), "_%s", name);
+		name = buf;
+	}
+#endif
+	if ((vp = dlsym(handle, (char *) name)) == NULL)
+		snprintf(error_message, sizeof(error_message),
+				 "dlsym (%s) failed", name);
+	return vp;
+}
+
+void
+BSD44_derived_dlclose(void *handle)
+{
+	dlclose(handle);
+}
diff --git a/src/backend/port/dynloader/dragonfly.h b/src/backend/port/dynloader/dragonfly.h
new file mode 100644
index 0000000..443aed9
--- /dev/null
+++ b/src/backend/port/dynloader/dragonfly.h
@@ -0,0 +1,59 @@
+/*-------------------------------------------------------------------------
+ *
+ * dragonfly.h
+ *	  port-specific prototypes for DragonFly BSD
+ *
+ * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/backend/port/dynloader/dragonfly.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef PORT_PROTOS_H
+#define PORT_PROTOS_H
+
+#include <sys/types.h>
+#include <nlist.h>
+#include <link.h>
+#include <dlfcn.h>
+
+#include "utils/dynamic_loader.h"
+
+/*
+ * Dynamic Loader on NetBSD 1.0.
+ *
+ * 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.
+ *
+ * agc - I know this is all a bit crufty, but it does work, is fairly
+ * portable, and works (the stipulation that the d.l. function must
+ * begin with an underscore is fairly tricky, and some versions of
+ * NetBSD (like 1.0, and 1.0A pre June 1995) have no dlerror.)
+ */
+
+/*
+ * 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)    BSD44_derived_dlopen((f), RTLD_NOW | RTLD_GLOBAL)
+#define		   pg_dlsym		   BSD44_derived_dlsym
+#define		   pg_dlclose	   BSD44_derived_dlclose
+#define		   pg_dlerror	   BSD44_derived_dlerror
+
+char	   *BSD44_derived_dlerror(void);
+void	   *BSD44_derived_dlopen(const char *filename, int num);
+void	   *BSD44_derived_dlsym(void *handle, const char *name);
+void		BSD44_derived_dlclose(void *handle);
+
+#endif   /* PORT_PROTOS_H */
diff --git a/src/include/port/dragonfly.h b/src/include/port/dragonfly.h
new file mode 100644
index 0000000..3ebe8b4
--- /dev/null
+++ b/src/include/port/dragonfly.h
@@ -0,0 +1 @@
+/* src/include/port/dragonfly.h */
diff --git a/src/makefiles/Makefile.dragonfly b/src/makefiles/Makefile.dragonfly
new file mode 100644
index 0000000..839864c
--- /dev/null
+++ b/src/makefiles/Makefile.dragonfly
@@ -0,0 +1,29 @@
+AROPT = cr
+
+ifdef ELF_SYSTEM
+export_dynamic = -Wl,-export-dynamic
+rpath = -Wl,-R'$(rpathdir)'
+endif
+
+DLSUFFIX = .so
+
+CFLAGS_SL = -fPIC -DPIC
+
+ifeq ($(findstring i386,$(host_cpu)), i386)
+allow_nonpic_in_shlib = yes
+endif
+
+
+# Rule for building a shared library from a single .o file
+%.so: %.o
+ifdef ELF_SYSTEM
+	$(CC) $(CFLAGS) $(LDFLAGS) $(LDFLAGS_SL) -shared -o $@ $<
+else
+	$(LD) $(LDREL) $(LDOUT) $<.obj -x $<
+	@echo building shared object $@
+	@rm -f $@.pic
+	@${AR} cq $@.pic $<.obj
+	${RANLIB} $@.pic
+	@rm -f $@
+	$(LD) -x -Bshareable -Bforcearchive -o $@ $@.pic
+endif
diff --git a/src/template/dragonfly b/src/template/dragonfly
new file mode 100644
index 0000000..e69de29
-- 
1.7.3.5

