diff options
author | Bruce Momjian <bruce@momjian.us> | 2001-08-07 16:56:17 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2001-08-07 16:56:17 +0000 |
commit | 1b2d57dc83dadd2e2bb783337075d5172f6296c4 (patch) | |
tree | e19e6488b97f0bf9045198008586a87100f770da /src/backend/port/beos/support.c | |
parent | d8783c512e3c90c705ce61a225df39f962db9ab3 (diff) | |
download | postgresql-1b2d57dc83dadd2e2bb783337075d5172f6296c4.tar.gz postgresql-1b2d57dc83dadd2e2bb783337075d5172f6296c4.zip |
A small patch to keep postgres working on the latest BeOS.
Cyril VELTER
Diffstat (limited to 'src/backend/port/beos/support.c')
-rw-r--r-- | src/backend/port/beos/support.c | 46 |
1 files changed, 45 insertions, 1 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); |