From 1b2d57dc83dadd2e2bb783337075d5172f6296c4 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Tue, 7 Aug 2001 16:56:17 +0000 Subject: [PATCH] A small patch to keep postgres working on the latest BeOS. Cyril VELTER --- src/backend/port/beos/support.c | 46 ++++++++++++++++++++++++++++++- src/backend/port/dynloader/beos.c | 21 ++------------ src/include/port/beos.h | 6 +++- 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/backend/port/beos/support.c b/src/backend/port/beos/support.c index bc5264e549..936c151e86 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 dd28c5c5f8..0a0f5fbef8 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.8 2001/08/07 16:56:17 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 654249545c..cedc5d6f12 100644 --- a/src/include/port/beos.h +++ b/src/include/port/beos.h @@ -1,5 +1,6 @@ #include -#include "kernel/image.h" +#include +#include #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); -- 2.40.0