From dev-return-15260-apmail-apr-dev-archive=apr.apache.org@apr.apache.org Sat Jan 07 14:10:25 2006 Return-Path: Delivered-To: apmail-apr-dev-archive@www.apache.org Received: (qmail 37316 invoked from network); 7 Jan 2006 14:10:25 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 7 Jan 2006 14:10:25 -0000 Received: (qmail 93279 invoked by uid 500); 7 Jan 2006 14:10:23 -0000 Delivered-To: apmail-apr-dev-archive@apr.apache.org Received: (qmail 93224 invoked by uid 500); 7 Jan 2006 14:10:21 -0000 Mailing-List: contact dev-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Id: Delivered-To: mailing list dev@apr.apache.org Received: (qmail 93206 invoked by uid 99); 7 Jan 2006 14:10:20 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 07 Jan 2006 06:10:20 -0800 X-ASF-Spam-Status: No, hits=0.0 required=10.0 tests= X-Spam-Check-By: apache.org Received-SPF: neutral (asf.osuosl.org: local policy) Received: from [68.142.198.211] (HELO smtp112.sbc.mail.mud.yahoo.com) (68.142.198.211) by apache.org (qpsmtpd/0.29) with SMTP; Sat, 07 Jan 2006 06:10:19 -0800 Received: (qmail 41530 invoked from network); 7 Jan 2006 14:09:57 -0000 Received: from unknown (HELO amethyst.wikifamilies.info) (j.h.ballard@sbcglobal.net@71.137.145.207 with plain) by smtp112.sbc.mail.mud.yahoo.com with SMTP; 7 Jan 2006 14:09:57 -0000 Received: from sapphire.wikifamilies.info ([192.168.0.20]) by amethyst.wikifamilies.info with esmtp (Exim 4.52) id 1EvF4w-0005j7-UU for dev@apr.apache.org; Sat, 07 Jan 2006 06:29:59 -0800 Message-ID: <43BFCBB7.9000003@wikifamilies.info> Date: Sat, 07 Jan 2006 06:09:59 -0800 From: Jonathan User-Agent: Mozilla Thunderbird 1.0.7 (Windows/20050923) X-Accept-Language: en-us, en MIME-Version: 1.0 To: dev@apr.apache.org Subject: [PATCH] apr/dso/unix/* - split interfaces Content-Type: multipart/mixed; boundary="------------080208070809020300030809" X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N This is a multi-part message in MIME format. --------------080208070809020300030809 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Taken from a suggestion from Joe Orton, here are the interfaces split into seperate files: dso_dlfcn.h, dso_shl.h, dso_dyld.h. My previous posted patch 'apr.366515.bjh.patch.txt' is trashed until further implementation to support more OSs. Thank you, Jonathan --------------080208070809020300030809 Content-Type: text/plain; name="apr.366726.bjh.patch.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="apr.366726.bjh.patch.txt" Index: dso/unix/dso_dlfcn.h =================================================================== --- dso/unix/dso_dlfcn.h (revision 0) +++ dso/unix/dso_dlfcn.h (revision 0) @@ -0,0 +1,89 @@ +/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as + * applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + + if (dso->handle == NULL) + return APR_SUCCESS; + + if (dlclose(dso->handle) != 0) + return APR_EINIT; + dso->handle = NULL; + + return APR_SUCCESS; +} + +static apr_status_t dso_load(apr_dso_handle_t *res_handle, + const char *path) +{ +#if defined(OSF1) || defined(SEQUENT) || defined(SNI) ||\ + (defined(__FreeBSD_version) && (__FreeBSD_version >= 220000)) ||\ + defined(__DragonFly__) + res_handle->handle = dlopen((char *)path, RTLD_NOW | RTLD_GLOBAL); + +#else + int flags = RTLD_NOW | RTLD_GLOBAL; +#if defined(_AIX) + if (strchr(path + 1, '(') && path[strlen(path) - 1] == ')') + { + /* This special archive.a(dso.so) syntax is required for + * the way libtool likes to build shared libraries on AIX. + * dlopen() support for such a library requires that the + * RTLD_MEMBER flag be enabled. + */ + flags |= RTLD_MEMBER; + } +#endif /* _AIX */ + res_handle->handle = dlopen(path, flags); +#endif + + if(res_handle->handle == NULL) { + res_handle->errormsg = dlerror(); + return APR_EDSOOPEN; + } + + apr_pool_cleanup_register(res_handle->pool, res_handle, dso_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +static apr_status_t dso_sym(apr_dso_handle_sym_t *ressym, + apr_dso_handle_t *handle, + const char *symname) +{ +#if defined(DLSYM_NEEDS_UNDERSCORE) + void *retval; + char *symbol = (char*)malloc(sizeof(char)*(strlen(symname)+2)); + sprintf(symbol, "_%s", symname); + retval = dlsym(handle->handle, symbol); + free(symbol); +#elif defined(SEQUENT) || defined(SNI) + void *retval = dlsym(handle->handle, (char *)symname); +#else + void *retval = dlsym(handle->handle, symname); +#endif /* DLSYM_NEEDS_UNDERSCORE */ + + if (retval == NULL) { + handle->errormsg = dlerror(); + return APR_ESYMNOTFOUND; + } + + *ressym = retval; + + return APR_SUCCESS; +} Index: dso/unix/dso_shl.h =================================================================== --- dso/unix/dso_shl.h (revision 0) +++ dso/unix/dso_shl.h (revision 0) @@ -0,0 +1,60 @@ +/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as + * applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + + if (dso->handle == NULL) + return APR_SUCCESS; + + shl_unload((shl_t)dso->handle); + dso->handle = NULL; + + return APR_SUCCESS; +} + +static apr_status_t dso_load(apr_dso_handle_t *res_handle, + const char *path) +{ + res_hanlde->handle = shl_load(path, BIND_IMMEDIATE, 0L); + + if(res_handle->handle == NULL) { + res_handle->errormsg = strerror(errno); + return APR_EDSOOPEN; + } + + apr_pool_cleanup_register(res_handle->pool, res_handle, dso_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +static apr_status_t dso_sym(apr_dso_handle_sym_t *ressym, + apr_dso_handle_t *handle, + const char *symname) +{ + void *symaddr = NULL; + int status; + + errno = 0; + status = shl_findsym((shl_t *)&handle->handle, symname, TYPE_PROCEDURE, &symaddr); + if (status == -1 && errno == 0) /* try TYPE_DATA instead */ + status = shl_findsym((shl_t *)&handle->handle, symname, TYPE_DATA, &symaddr); + if (status == -1) + return APR_ESYMNOTFOUND; + *ressym = symaddr; + return APR_SUCCESS; +} Index: dso/unix/dso.c =================================================================== --- dso/unix/dso.c (revision 366726) +++ dso/unix/dso.c (working copy) @@ -20,10 +20,6 @@ #if APR_HAS_DSO -#if !defined(DSO_USE_DLFCN) && !defined(DSO_USE_SHL) && !defined(DSO_USE_DYLD) -#error No DSO implementation specified. -#endif - #ifdef HAVE_STDDEF_H #include #endif @@ -34,8 +30,14 @@ #include /* for strerror() on HP-UX */ #endif -#if defined(DSO_USE_DYLD) -#define DYLD_LIBRARY_HANDLE (void *)-1 +#if defined(DSO_USE_DLFCN) +#include "dso_dlfcn.h" +#elif defined(DSO_USE_SHL) +#include "dso_shl.h" +#elif defined(DSO_USE_DYLD) +#include "dso_dyld.h" +#else +#error No DSO implementation specified. #endif APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso, @@ -55,114 +57,14 @@ return APR_SUCCESS; } -static apr_status_t dso_cleanup(void *thedso) -{ - apr_dso_handle_t *dso = thedso; - - if (dso->handle == NULL) - return APR_SUCCESS; - -#if defined(DSO_USE_SHL) - shl_unload((shl_t)dso->handle); -#elif defined(DSO_USE_DYLD) - if (dso->handle != DYLD_LIBRARY_HANDLE) { - NSUnLinkModule(dso->handle, FALSE); - } -#elif defined(DSO_USE_DLFCN) - if (dlclose(dso->handle) != 0) - return APR_EINIT; -#endif - dso->handle = NULL; - - return APR_SUCCESS; -} - APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle, const char *path, apr_pool_t *pool) { -#if defined(DSO_USE_SHL) - shl_t os_handle = shl_load(path, BIND_IMMEDIATE, 0L); - -#elif defined(DSO_USE_DYLD) - NSObjectFileImage image; - NSModule os_handle = NULL; - NSObjectFileImageReturnCode dsoerr; - const char* err_msg = NULL; - dsoerr = NSCreateObjectFileImageFromFile(path, &image); - - if (dsoerr == NSObjectFileImageSuccess) { -#if defined(NSLINKMODULE_OPTION_RETURN_ON_ERROR) && defined(NSLINKMODULE_OPTION_NONE) - os_handle = NSLinkModule(image, path, - NSLINKMODULE_OPTION_RETURN_ON_ERROR | - NSLINKMODULE_OPTION_NONE); - /* If something went wrong, get the errors... */ - if (!os_handle) { - NSLinkEditErrors errors; - int errorNumber; - const char *fileName; - NSLinkEditError(&errors, &errorNumber, &fileName, &err_msg); - } -#else - os_handle = NSLinkModule(image, path, FALSE); -#endif - NSDestroyObjectFileImage(image); - } - else if ((dsoerr == NSObjectFileImageFormat || - dsoerr == NSObjectFileImageInappropriateFile) && - NSAddLibrary(path) == TRUE) { - os_handle = (NSModule)DYLD_LIBRARY_HANDLE; - } - else { - err_msg = "cannot create object file image or add library"; - } - -#elif defined(DSO_USE_DLFCN) -#if defined(OSF1) || defined(SEQUENT) || defined(SNI) ||\ - (defined(__FreeBSD_version) && (__FreeBSD_version >= 220000)) ||\ - defined(__DragonFly__) - void *os_handle = dlopen((char *)path, RTLD_NOW | RTLD_GLOBAL); - -#else - int flags = RTLD_NOW | RTLD_GLOBAL; - void *os_handle; -#ifdef _AIX - if (strchr(path + 1, '(') && path[strlen(path) - 1] == ')') - { - /* This special archive.a(dso.so) syntax is required for - * the way libtool likes to build shared libraries on AIX. - * dlopen() support for such a library requires that the - * RTLD_MEMBER flag be enabled. - */ - flags |= RTLD_MEMBER; - } -#endif - os_handle = dlopen(path, flags); -#endif -#endif /* DSO_USE_x */ - *res_handle = apr_pcalloc(pool, sizeof(**res_handle)); + (*res_handle)->pool = pool ; - if(os_handle == NULL) { -#if defined(DSO_USE_SHL) - (*res_handle)->errormsg = strerror(errno); - return APR_EDSOOPEN; -#elif defined(DSO_USE_DYLD) - (*res_handle)->errormsg = (err_msg) ? err_msg : "link failed"; - return APR_EDSOOPEN; -#elif defined(DSO_USE_DLFCN) - (*res_handle)->errormsg = dlerror(); - return APR_EDSOOPEN; -#endif - } - - (*res_handle)->handle = (void*)os_handle; - (*res_handle)->pool = pool; - (*res_handle)->errormsg = NULL; - - apr_pool_cleanup_register(pool, *res_handle, dso_cleanup, apr_pool_cleanup_null); - - return APR_SUCCESS; -} + return dso_load(*res_handle, path); +} APR_DECLARE(apr_status_t) apr_dso_unload(apr_dso_handle_t *handle) { @@ -173,69 +75,7 @@ apr_dso_handle_t *handle, const char *symname) { -#if defined(DSO_USE_SHL) - void *symaddr = NULL; - int status; - - errno = 0; - status = shl_findsym((shl_t *)&handle->handle, symname, TYPE_PROCEDURE, &symaddr); - if (status == -1 && errno == 0) /* try TYPE_DATA instead */ - status = shl_findsym((shl_t *)&handle->handle, symname, TYPE_DATA, &symaddr); - if (status == -1) - return APR_ESYMNOTFOUND; - *ressym = symaddr; - return APR_SUCCESS; - -#elif defined(DSO_USE_DYLD) - void *retval = NULL; - NSSymbol symbol; - char *symname2 = (char*)malloc(sizeof(char)*(strlen(symname)+2)); - sprintf(symname2, "_%s", symname); -#ifdef NSLINKMODULE_OPTION_PRIVATE - if (handle->handle == DYLD_LIBRARY_HANDLE) { - symbol = NSLookupAndBindSymbol(symname2); - } - else { - symbol = NSLookupSymbolInModule((NSModule)handle->handle, symname2); - } -#else - symbol = NSLookupAndBindSymbol(symname2); -#endif - free(symname2); - if (symbol == NULL) { - handle->errormsg = "undefined symbol"; - return APR_ESYMNOTFOUND; - } - retval = NSAddressOfSymbol(symbol); - if (retval == NULL) { - handle->errormsg = "cannot resolve symbol"; - return APR_ESYMNOTFOUND; - } - *ressym = retval; - return APR_SUCCESS; -#elif defined(DSO_USE_DLFCN) - -#if defined(DLSYM_NEEDS_UNDERSCORE) - void *retval; - char *symbol = (char*)malloc(sizeof(char)*(strlen(symname)+2)); - sprintf(symbol, "_%s", symname); - retval = dlsym(handle->handle, symbol); - free(symbol); -#elif defined(SEQUENT) || defined(SNI) - void *retval = dlsym(handle->handle, (char *)symname); -#else - void *retval = dlsym(handle->handle, symname); -#endif /* DLSYM_NEEDS_UNDERSCORE */ - - if (retval == NULL) { - handle->errormsg = dlerror(); - return APR_ESYMNOTFOUND; - } - - *ressym = retval; - - return APR_SUCCESS; -#endif /* DSO_USE_x */ + return dso_sym(ressym, handle, symname); } APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buffer, Index: dso/unix/dso_dyld.h =================================================================== --- dso/unix/dso_dyld.h (revision 0) +++ dso/unix/dso_dyld.h (revision 0) @@ -0,0 +1,118 @@ +/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as + * applicable. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define DYLD_LIBRARY_HANDLE (void *)-1 + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + + if (dso->handle == NULL) + return APR_SUCCESS; + + if (dso->handle != DYLD_LIBRARY_HANDLE) { + NSUnLinkModule(dso->handle, FALSE); + } + dso->handle = NULL; + + return APR_SUCCESS; +} + +static const char * dyld_errmsg(void) +{ +#if defined(NSLINKMODULE_OPTION_RETURN_ON_ERROR) + NSLinkEditErrors errors; + int errorNumber; + const char *fileName; + const char *errmsg; + NSLinkEditError(&errors, &errorNumber, &fileName, &errmsg); + return errmsg; +#else + return "error"; +#endif +} + +static apr_status_t dso_load(apr_dso_handle_t *res_handle, + const char *path) +{ + NSObjectFileImage image; + NSModule os_handle = NULL; + NSObjectFileImageReturnCode dsoerr; + + dsoerr = NSCreateObjectFileImageFromFile(path, &image); + if (dsoerr == NSObjectFileImageSuccess) { + res_handle->handle = NSLinkModule(image, path, +#if defined(NSLINKMODULE_OPTION_RETURN_ON_ERROR) + NSLINKMODULE_OPTION_RETURN_ON_ERROR | +#endif +#if defined(NSLINKMODULE_OPTION_NONE) + NSLINKMODULE_OPTION_NONE); +#else + FALSE); +#endif + if (!res_handle->handle) { + res_handle->errormsg = dyld_errmsg(); + NSDestroyObjectFileImage(image); + return APR_EDSOOPEN; + } + NSDestroyObjectFileImage(image); + } + else if ((dsoerr == NSObjectFileImageFormat || + dsoerr == NSObjectFileImageInappropriateFile) && + NSAddLibrary(path) == TRUE) { + res_handle->handle = (NSModule)DYLD_LIBRARY_HANDLE; + } + else { + res_handle->errormsg = "cannot create object file image"; + return APR_EDSOOPEN; + } + + apr_pool_cleanup_register(res_handle->pool, res_handle, dso_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +static apr_status_t dso_sym(apr_dso_handle_sym_t *ressym, + apr_dso_handle_t *handle, + const char *symname) +{ + void *retval = NULL; + NSSymbol symbol; + char *symname2 = (char*)malloc(sizeof(char)*(strlen(symname)+2)); + sprintf(symname2, "_%s", symname); +#ifdef NSLINKMODULE_OPTION_PRIVATE + if (handle->handle == DYLD_LIBRARY_HANDLE) { + symbol = NSLookupAndBindSymbol(symname2); + } + else { + symbol = NSLookupSymbolInModule((NSModule)handle->handle, symname2); + } +#else + symbol = NSLookupAndBindSymbol(symname2); +#endif + free(symname2); + if (symbol == NULL) { + handle->errormsg = "undefined symbol"; + return APR_ESYMNOTFOUND; + } + retval = NSAddressOfSymbol(symbol); + if (retval == NULL) { + handle->errormsg = "cannot resolve symbol"; + return APR_ESYMNOTFOUND; + } + *ressym = retval; + return APR_SUCCESS; +} --------------080208070809020300030809--