aboutsummaryrefslogtreecommitdiff
path: root/src/backend/port/dynloader/darwin.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-04-13 01:19:06 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-04-13 01:19:06 +0000
commitff5456feaefb2fa8c723b729cd4ba6794130f026 (patch)
treeaaf551dd2b0b283f1c0f73ec8658ac30b2674567 /src/backend/port/dynloader/darwin.c
parente138630251c338981bbd2dd15f0da5f22a206c70 (diff)
downloadpostgresql-ff5456feaefb2fa8c723b729cd4ba6794130f026.tar.gz
postgresql-ff5456feaefb2fa8c723b729cd4ba6794130f026.zip
Add code to provide useful dynamic-linking error messages on OS X.
Diffstat (limited to 'src/backend/port/dynloader/darwin.c')
-rw-r--r--src/backend/port/dynloader/darwin.c53
1 files 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;
}