Commit BEOS patch to 7.1.X.
authorBruce Momjian <[email protected]>
Tue, 7 Aug 2001 18:36:52 +0000 (18:36 +0000)
committerBruce Momjian <[email protected]>
Tue, 7 Aug 2001 18:36:52 +0000 (18:36 +0000)
src/backend/port/beos/support.c
src/backend/port/dynloader/beos.c
src/include/port/beos.h

index bc5264e5490e295b789c1a094779e38d2010cde6..936c151e864119b78f6da2fb04bd9db68593f9d5 100644 (file)
@@ -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);
index bce45e2317fec7ddf222b9997c57fae1e49a6d9e..ff7e4fc389ef48d2faada3b89627b0ba5cc8fad9 100644 (file)
@@ -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;
index 654249545cd53894f48531382d244ce44fbf3c20..cedc5d6f12fdb9c2526202aff5add7bcb34e357c 100644 (file)
@@ -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);