Index: xc/lib/X11/XlcDL.c =================================================================== RCS file: /home/x-cvs/xc/lib/X11/XlcDL.c,v retrieving revision 1.3 retrieving revision 1.3.4.1 diff -u -r1.3 -r1.3.4.1 --- xc/lib/X11/XlcDL.c 2001/11/19 15:33:38 1.3 +++ xc/lib/X11/XlcDL.c 2002/01/23 19:17:00 1.3.4.1 @@ -41,7 +41,7 @@ Sun Microsystems, Inc. or its licensors is granted. */ -/* $XFree86: xc/lib/X11/XlcDL.c,v 1.3 2001/11/19 15:33:38 tsi Exp $ */ +/* $XFree86: xc/lib/X11/XlcDL.c,v 1.3.4.1 2002/01/23 19:17:00 dawes Exp $ */ #include #if defined(hpux) @@ -125,28 +125,37 @@ } static char * -strdup_and_prefix(char *symbol) +strdup_with_underscore(const char *symbol) { - size_t n; char *result; - n = strlen(symbol) + 1; -#ifndef __ELF__ - n++; /* add space for _ */ -#endif - if ((result = malloc(n)) == NULL) + if ((result = malloc(strlen(symbol) + 2)) == NULL) return NULL; -#ifndef __ELF__ result[0] = '_'; -#endif - memcpy(result -#ifndef __ELF__ - +1 -#endif - , symbol, n); + strcpy(result + 1, symbol); return result; } +#ifndef hpux +static void * +try_both_dlsym (void *handle, char *name) +{ + void *ret; + + ret = dlsym (handle, name); + if (!ret) + { + name = strdup_with_underscore (name); + if (name) + { + ret = dlsym (handle, name); + free (name); + } + } + return ret; +} +#endif + static void resolve_object(path, lc_name) char *path; @@ -202,13 +211,13 @@ xi18n_objects_list[lc_count].type = XIM_OBJECT; } xi18n_objects_list[lc_count].dl_name = strdup(args[1]); - xi18n_objects_list[lc_count].open = strdup_and_prefix(args[2]); + xi18n_objects_list[lc_count].open = strdup(args[2]); xi18n_objects_list[lc_count].dl_release = XI18N_DLREL; xi18n_objects_list[lc_count].locale_name = strdup(lc_name); xi18n_objects_list[lc_count].dl_module = (void*)NULL; if (n == 5) { - xi18n_objects_list[lc_count].im_register = strdup_and_prefix(args[3]); - xi18n_objects_list[lc_count].im_unregister = strdup_and_prefix(args[4]); + xi18n_objects_list[lc_count].im_register = strdup(args[3]); + xi18n_objects_list[lc_count].im_unregister = strdup(args[4]); } else { xi18n_objects_list[lc_count].im_register = NULL; xi18n_objects_list[lc_count].im_unregister = NULL; @@ -331,8 +340,8 @@ free(symbols); } #else - lc_loader = (XLCd(*)())dlsym(objects_list->dl_module, - objects_list->open); + lc_loader = (XLCd(*)())try_both_dlsym(objects_list->dl_module, + objects_list->open); #endif if (!lc_loader) continue; lcd = (*lc_loader)(lc_name); @@ -406,8 +415,8 @@ free(symbols); } #else - im_openIM = (XIM(*)())dlsym(objects_list->dl_module, - objects_list->open); + im_openIM = (XIM(*)())try_both_dlsym(objects_list->dl_module, + objects_list->open); if (!im_openIM) continue; #endif im = (*im_openIM)(lcd, display, rdb, res_name, res_class); @@ -481,8 +490,8 @@ free(symbols); } #else - im_registerIM = (Bool(*)())dlsym(objects_list->dl_module, - objects_list->im_register); + im_registerIM = (Bool(*)())try_both_dlsym(objects_list->dl_module, + objects_list->im_register); if (!im_registerIM) continue; #endif ret_flag = (*im_registerIM)(lcd, display, rdb, @@ -556,8 +565,8 @@ free(symbols); } #else - im_unregisterIM = (Bool(*)())dlsym(objects_list->dl_module, - objects_list->im_unregister); + im_unregisterIM = (Bool(*)())try_both_dlsym(objects_list->dl_module, + objects_list->im_unregister); if (!im_unregisterIM) continue; #endif @@ -651,8 +660,8 @@ free(symbols); } #else - om_openOM = (XOM(*)())dlsym(objects_list->dl_module, - objects_list->open); + om_openOM = (XOM(*)())try_both_dlsym(objects_list->dl_module, + objects_list->open); if (!om_openOM) continue; #endif om = (*om_openOM)(lcd, display, rdb, res_name, res_class);