mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-11-27 07:21:09 +08:00
A small patch to keep postgres working on the latest BeOS.
Cyril VELTER
This commit is contained in:
parent
d8783c512e
commit
1b2d57dc83
@ -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)
|
||||
{
|
||||
@ -170,6 +186,7 @@ beos_startup(int argc, char **argv)
|
||||
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);
|
||||
|
@ -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,24 +49,9 @@ 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;
|
||||
beos_dl_sym(*((int *) (handle)),funcname,(void **) &fpt);
|
||||
return fpt;
|
||||
}
|
||||
elog(NOTICE, "loading symbol '%s' failed ", funcname);
|
||||
}
|
||||
elog(NOTICE, "add-on not loaded correctly");
|
||||
return NULL;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user