Index: src/backend/port/beos/support.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/port/beos/support.c,v retrieving revision 1.4 diff -c -r1.4 support.c *** src/backend/port/beos/support.c 2001/03/22 03:59:42 1.4 --- src/backend/port/beos/support.c 2001/08/05 21:12:27 *************** *** 115,120 **** --- 115,136 ---- } } + 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,175 **** * server */ read_port(port_in, &opcode, datas, 4000); ! switch (opcode) { image_id addon; image_info info_im; area_info info_ar; /* Load Add-On */ case 1: --- 180,192 ---- * 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,213 **** --- 225,257 ---- 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); Index: src/backend/port/dynloader/beos.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/port/dynloader/beos.c,v retrieving revision 1.7 diff -c -r1.7 beos.c *** src/backend/port/dynloader/beos.c 2001/03/22 03:59:42 1.7 --- src/backend/port/dynloader/beos.c 2001/08/05 21:12:28 *************** *** 49,71 **** /* 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); } elog(NOTICE, "add-on not loaded correctly"); return NULL; --- 49,56 ---- /* Checking that "Handle" is valid */ if ((handle) && ((*(int *) (handle)) >= 0)) { ! beos_dl_sym(*((int *) (handle)),funcname,(void **) &fpt); ! return fpt; } elog(NOTICE, "add-on not loaded correctly"); return NULL; Index: src/include/port/beos.h =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/port/beos.h,v retrieving revision 1.9 diff -c -r1.9 beos.h *** src/include/port/beos.h 2001/03/22 04:00:58 1.9 --- src/include/port/beos.h 2001/08/05 21:12:34 *************** *** 1,5 **** #include ! #include "kernel/image.h" #define HAS_TEST_AND_SET --- 1,6 ---- #include ! #include ! #include #define HAS_TEST_AND_SET *************** *** 68,73 **** --- 69,77 ---- /* 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);