aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2001-08-07 18:36:52 +0000
committerBruce Momjian <bruce@momjian.us>2001-08-07 18:36:52 +0000
commit7d03946ffba1334c783c04fd16cf7726b32e5bee (patch)
tree5f7c30dd8a30a43312489c8c2f5dfdf93ed9b735 /src
parent7df68bdd50ef7de29852c0bd1519e42e83753679 (diff)
downloadpostgresql-7d03946ffba1334c783c04fd16cf7726b32e5bee.tar.gz
postgresql-7d03946ffba1334c783c04fd16cf7726b32e5bee.zip
Commit BEOS patch to 7.1.X.
Diffstat (limited to 'src')
-rw-r--r--src/backend/port/beos/support.c46
-rw-r--r--src/backend/port/dynloader/beos.c21
-rw-r--r--src/include/port/beos.h6
3 files changed, 53 insertions, 20 deletions
diff --git a/src/backend/port/beos/support.c b/src/backend/port/beos/support.c
index bc5264e5490..936c151e864 100644
--- a/src/backend/port/beos/support.c
+++ b/src/backend/port/beos/support.c
@@ -115,6 +115,22 @@ beos_dl_open(char *filename)
}
}
+void
+beos_dl_sym(image_id im,char* symname,void** fptr)
+{
+ /* Send command '3' (get symbol) to the support server */
+ write_port(beos_dl_port_in, 3, symname, strlen(symname) + 1);
+ write_port(beos_dl_port_in, im, NULL,0);
+
+ /* Read sym address */
+ read_port(beos_dl_port_out, (int32*)(fptr), NULL, 0);
+
+ if (fptr==NULL)
+ {
+ elog(NOTICE, "loading symbol '%s' failed ", symname);
+ }
+}
+
status_t
beos_dl_close(image_id im)
{
@@ -164,12 +180,13 @@ beos_startup(int argc, char **argv)
* server
*/
read_port(port_in, &opcode, datas, 4000);
-
+
switch (opcode)
{
image_id addon;
image_info info_im;
area_info info_ar;
+ void * fpt;
/* Load Add-On */
case 1:
@@ -208,6 +225,33 @@ beos_startup(int argc, char **argv)
write_port(port_out, unload_add_on(*((int *) (datas))), NULL, 0);
break;
/* Cleanup and exit */
+ case 3:
+
+ /* read image Id on the input port */
+ read_port(port_in, &addon,NULL,0);
+
+ /* Loading symbol */
+ fpt=NULL;
+
+
+ if (get_image_symbol(addon, datas, B_SYMBOL_TYPE_TEXT, &fpt) == B_OK);
+ {
+
+ /*
+ * Sometime the loader return B_OK for an inexistant function
+ * with an invalid address !!! Check that the return address
+ * is in the image range
+ */
+
+ get_image_info(addon, &info_im);
+ if ((fpt < info_im.text) ||(fpt >= (info_im.text +info_im.text_size)))
+ fpt=NULL;
+ }
+
+ /* Send back fptr of data segment */
+ write_port(port_out, (int32)(fpt),NULL,0);
+ break;
+
default:
/* Free system resources */
delete_port(port_in);
diff --git a/src/backend/port/dynloader/beos.c b/src/backend/port/dynloader/beos.c
index dd28c5c5f81..3afb13a2862 100644
--- a/src/backend/port/dynloader/beos.c
+++ b/src/backend/port/dynloader/beos.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/port/dynloader/Attic/beos.c,v 1.7 2001/03/22 03:59:42 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/port/dynloader/Attic/beos.c,v 1.7.2.1 2001/08/07 18:36:52 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -49,23 +49,8 @@ pg_dlsym(void *handle, char *funcname)
/* Checking that "Handle" is valid */
if ((handle) && ((*(int *) (handle)) >= 0))
{
- /* Loading symbol */
- if (get_image_symbol(*((int *) (handle)), funcname, B_SYMBOL_TYPE_TEXT, (void **) &fpt) == B_OK);
- {
-
- /*
- * Sometime the loader return B_OK for an inexistant function
- * with an invalid address !!! Check that the return address
- * is in the image range
- */
- image_info info;
-
- get_image_info(*((int *) (handle)), &info);
- if ((fpt < info.text) ||(fpt >= (info.text +info.text_size)))
- return NULL;
- return fpt;
- }
- elog(NOTICE, "loading symbol '%s' failed ", funcname);
+ beos_dl_sym(*((int *) (handle)),funcname,(void **) &fpt);
+ return fpt;
}
elog(NOTICE, "add-on not loaded correctly");
return NULL;
diff --git a/src/include/port/beos.h b/src/include/port/beos.h
index 654249545cd..cedc5d6f12f 100644
--- a/src/include/port/beos.h
+++ b/src/include/port/beos.h
@@ -1,5 +1,6 @@
#include <kernel/OS.h>
-#include "kernel/image.h"
+#include <kernel/image.h>
+#include <sys/ioctl.h>
#define HAS_TEST_AND_SET
@@ -69,6 +70,9 @@ void beos_startup(int argc, char **argv);
/* Load a shared library */
image_id beos_dl_open(char *filename);
+/* Find symbol */
+void beos_dl_sym(image_id im,char* symname,void** fptr);
+
/* UnLoad a shared library */
status_t beos_dl_close(image_id im);