From ff5456feaefb2fa8c723b729cd4ba6794130f026 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sun, 13 Apr 2003 01:19:06 +0000
Subject: [PATCH] Add code to provide useful dynamic-linking error messages on
 OS X.

---
 src/backend/port/dynloader/darwin.c | 53 ++++++++++++++++++++++++-----
 1 file changed, 45 insertions(+), 8 deletions(-)

diff --git a/src/backend/port/dynloader/darwin.c b/src/backend/port/dynloader/darwin.c
index 5d1aa757ce0..8810308a147 100644
--- a/src/backend/port/dynloader/darwin.c
+++ b/src/backend/port/dynloader/darwin.c
@@ -3,31 +3,35 @@
  * available with a PostgreSQL-compatible license.	Kudos Wilfredo
  * Sánchez <wsanchez@apple.com>.
  *
- * $Header: /cvsroot/pgsql/src/backend/port/dynloader/darwin.c,v 1.6 2002/10/01 05:06:44 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/port/dynloader/darwin.c,v 1.7 2003/04/13 01:19:06 tgl Exp $
  */
-
 #include "postgres.h"
+
 #include <mach-o/dyld.h>
+
 #include "dynloader.h"
 
+
+static NSObjectFileImageReturnCode cofiff_result = NSObjectFileImageFailure;
+
+
 void *
 pg_dlopen(char *filename)
 {
 	NSObjectFileImage image;
 
-	if (NSCreateObjectFileImageFromFile(filename, &image) !=
-		NSObjectFileImageSuccess)
+	cofiff_result = NSCreateObjectFileImageFromFile(filename, &image);
+	if (cofiff_result != NSObjectFileImageSuccess)
 		return NULL;
 	return NSLinkModule(image, filename,
-			    NSLINKMODULE_OPTION_BINDNOW |
-			    NSLINKMODULE_OPTION_RETURN_ON_ERROR);
+						NSLINKMODULE_OPTION_BINDNOW |
+						NSLINKMODULE_OPTION_RETURN_ON_ERROR);
 }
 
 void
 pg_dlclose(void *handle)
 {
 	NSUnLinkModule(handle, FALSE);
-	return;
 }
 
 PGFunction
@@ -53,5 +57,38 @@ pg_dlsym(void *handle, char *funcname)
 char *
 pg_dlerror(void)
 {
-	return "no error message available";
+	NSLinkEditErrors c;
+	int errorNumber;
+	const char *fileName;
+	const char *errorString = NULL;
+
+	switch (cofiff_result)
+	{
+		case NSObjectFileImageSuccess:
+			/* must have failed in NSLinkModule */
+			NSLinkEditError(&c, &errorNumber, &fileName, &errorString);
+			if (errorString == NULL || *errorString == '\0')
+				errorString = "unknown link-edit failure";
+			break;
+		case NSObjectFileImageFailure:
+			errorString = "failed to open object file";
+			break;
+		case NSObjectFileImageInappropriateFile:
+			errorString = "inappropriate object file";
+			break;
+		case NSObjectFileImageArch:
+			errorString = "object file is for wrong architecture";
+			break;
+		case NSObjectFileImageFormat:
+			errorString = "object file has wrong format";
+			break;
+		case NSObjectFileImageAccess:
+			errorString = "insufficient permissions for object file";
+			break;
+		default:
+			errorString = "unknown failure to open object file";
+			break;
+	}
+
+	return (char *) errorString;
 }
-- 
GitLab