/* Ensure that the RA library NAME is loaded. * * If FUNC is non-NULL, set *FUNC to the address of the svn_ra_NAME__init * function of the library. * * If COMPAT_FUNC is non-NULL, set *COMPAT_FUNC to the address of the * svn_ra_NAME_init compatibility init function of the library. * * ### todo: Any RA libraries implemented from this point forward * ### don't really need an svn_ra_NAME_init compatibility function. * ### Currently, load_ra_module() will error if no such function is * ### found, but it might be more friendly to simply set *COMPAT_FUNC * ### to null (assuming COMPAT_FUNC itself is non-null). */ static svn_error_t * load_ra_module(svn_ra__init_func_t *func, svn_ra_init_func_t *compat_func, const char *ra_name, apr_pool_t *pool) { if (func) *func = NULL; if (compat_func) *compat_func = NULL; #if defined(SVN_USE_DSO) && APR_HAS_DSO { apr_dso_handle_t *dso; apr_dso_handle_sym_t symbol; const char *libname; const char *funcname; const char *compat_funcname; apr_status_t status; libname = apr_psprintf(pool, "libsvn_ra_%s-%d.so.0", ra_name, SVN_VER_MAJOR); funcname = apr_psprintf(pool, "svn_ra_%s__init", ra_name); compat_funcname = apr_psprintf(pool, "svn_ra_%s_init", ra_name); /* find/load the specified library */ SVN_ERR(svn_dso_load(&dso, libname)); if (! dso) return SVN_NO_ERROR; /* find the initialization routines */ if (func) { status = apr_dso_sym(&symbol, dso, funcname); if (status) { return svn_error_wrap_apr(status, _("'%s' does not define '%s()'"), libname, funcname); } *func = (svn_ra__init_func_t) symbol; } if (compat_func) { status = apr_dso_sym(&symbol, dso, compat_funcname); if (status) { return svn_error_wrap_apr(status, _("'%s' does not define '%s()'"), libname, compat_funcname); } *compat_func = (svn_ra_init_func_t) symbol; } } #endif /* APR_HAS_DSO */ return SVN_NO_ERROR; }
static svn_error_t * load_module(fs_init_func_t *initfunc, const char *name, apr_pool_t *pool) { *initfunc = NULL; #if defined(SVN_USE_DSO) && APR_HAS_DSO { apr_dso_handle_t *dso; apr_dso_handle_sym_t symbol; const char *libname; const char *funcname; apr_status_t status; const char *p; /* Demand a simple alphanumeric name so that the generated DSO name is sensible. */ for (p = name; *p; ++p) if (!svn_ctype_isalnum(*p)) return svn_error_createf(SVN_ERR_FS_UNKNOWN_FS_TYPE, NULL, _("Invalid name for FS type '%s'"), name); libname = apr_psprintf(pool, "libsvn_fs_%s-%d.so.%d", name, SVN_VER_MAJOR, SVN_SOVERSION); funcname = apr_psprintf(pool, "svn_fs_%s__init", name); /* Find/load the specified library. If we get an error, assume the library doesn't exist. The library will be unloaded when pool is destroyed. */ SVN_ERR(svn_dso_load(&dso, libname)); if (! dso) return SVN_NO_ERROR; /* find the initialization routine */ status = apr_dso_sym(&symbol, dso, funcname); if (status) return svn_error_wrap_apr(status, _("'%s' does not define '%s()'"), libname, funcname); *initfunc = (fs_init_func_t) symbol; } #endif /* APR_HAS_DSO */ return SVN_NO_ERROR; }
static svn_error_t * load_module(fs_init_func_t *initfunc, const char *name, apr_pool_t *pool) { *initfunc = NULL; #if defined(SVN_USE_DSO) && APR_HAS_DSO { apr_dso_handle_t *dso; apr_dso_handle_sym_t symbol; const char *libname; const char *funcname; apr_status_t status; libname = apr_psprintf(pool, "libsvn_fs_%s-%d.so.0", name, SVN_VER_MAJOR); funcname = apr_psprintf(pool, "svn_fs_%s__init", name); /* Find/load the specified library. If we get an error, assume the library doesn't exist. The library will be unloaded when pool is destroyed. */ SVN_ERR(svn_dso_load(&dso, libname)); if (! dso) return SVN_NO_ERROR; /* find the initialization routine */ status = apr_dso_sym(&symbol, dso, funcname); if (status) return svn_error_wrap_apr(status, _("'%s' does not define '%s()'"), libname, funcname); *initfunc = (fs_init_func_t) symbol; } #endif /* APR_HAS_DSO */ return SVN_NO_ERROR; }