Add code to provide useful dynamic-linking error messages on OS X.
authorTom Lane
Sun, 13 Apr 2003 01:19:06 +0000 (01:19 +0000)
committerTom Lane
Sun, 13 Apr 2003 01:19:06 +0000 (01:19 +0000)
src/backend/port/dynloader/darwin.c

index 5d1aa757ce08a44f0d6d168d04452b99406cd67d..8810308a14710162d9d3fbf3ba3688953507b58b 100644 (file)
@@ -3,31 +3,35 @@
  * available with a PostgreSQL-compatible license. Kudos Wilfredo
  * Sánchez .
  *
- * $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 
+
 #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;
 }