APR_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name, const apr_dbd_driver_t **driver) { #if APR_HAVE_MODULAR_DSO char modname[32]; char symname[34]; apr_dso_handle_sym_t symbol; #endif apr_status_t rv; #if APR_HAVE_MODULAR_DSO rv = apu_dso_mutex_lock(); if (rv) { return rv; } #endif *driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING); if (*driver) { #if APR_HAVE_MODULAR_DSO apu_dso_mutex_unlock(); #endif return APR_SUCCESS; } #if APR_HAVE_MODULAR_DSO /* The driver DSO must have exactly the same lifetime as the * drivers hash table; ignore the passed-in pool */ pool = apr_hash_pool_get(drivers); #if defined(NETWARE) apr_snprintf(modname, sizeof(modname), "dbd%s.nlm", name); #elif defined(WIN32) apr_snprintf(modname, sizeof(modname), "apr_dbd_%s-" APR_STRINGIFY(APR_MAJOR_VERSION) ".dll", name); #else apr_snprintf(modname, sizeof(modname), "apr_dbd_%s-" APR_STRINGIFY(APR_MAJOR_VERSION) ".so", name); #endif apr_snprintf(symname, sizeof(symname), "apr_dbd_%s_driver", name); rv = apu_dso_load(NULL, &symbol, modname, symname, pool); if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */ *driver = symbol; name = apr_pstrdup(pool, name); apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver); rv = APR_SUCCESS; if ((*driver)->init) { (*driver)->init(pool); } } apu_dso_mutex_unlock(); #else /* not builtin and !APR_HAS_DSO => not implemented */ rv = APR_ENOTIMPL; #endif return rv; }
apr_status_t apu_dso_load(apr_dso_handle_t **dlhandleptr, apr_dso_handle_sym_t *dsoptr, const char *module, const char *modsym, apr_pool_t *pool) { apr_dso_handle_t *dlhandle = NULL; char *pathlist; char path[APR_PATH_MAX + 1]; apr_array_header_t *paths; apr_pool_t *global; apr_status_t rv = APR_EDSOOPEN; char *eos = NULL; int i; *dsoptr = apr_hash_get(dsos, module, APR_HASH_KEY_STRING); if (*dsoptr) { return APR_EINIT; } /* The driver DSO must have exactly the same lifetime as the * drivers hash table; ignore the passed-in pool */ global = apr_hash_pool_get(dsos); /* Retrieve our path search list or prepare for a single search */ if ((apr_env_get(&pathlist, APR_DSOPATH, pool) != APR_SUCCESS) || (apr_filepath_list_split(&paths, pathlist, pool) != APR_SUCCESS)) paths = apr_array_make(pool, 1, sizeof(char*)); #if defined(APR_DSO_LIBDIR) /* Always search our prefix path, but on some platforms such as * win32 this may be left undefined */ (*((char **)apr_array_push(paths))) = APR_DSO_LIBDIR; #endif for (i = 0; i < paths->nelts; ++i) { #if defined(WIN32) /* Use win32 dso search semantics and attempt to * load the relative lib on the first pass. */ if (!eos) { eos = path; --i; } else #endif { eos = apr_cpystrn(path, ((char**)paths->elts)[i], sizeof(path)); if ((eos > path) && (eos - path < sizeof(path) - 1)) *(eos++) = '/'; } apr_cpystrn(eos, module, sizeof(path) - (eos - path)); rv = apr_dso_load(&dlhandle, path, global); if (dlhandleptr) { *dlhandleptr = dlhandle; } if (rv == APR_SUCCESS) { /* APR_EDSOOPEN */ break; } #if defined(APR_DSO_LIBDIR) else if (i < paths->nelts - 1) { #else else { /* No APR_DSO_LIBDIR to skip */ #endif /* try with apr-APR_MAJOR_VERSION appended */ eos = apr_cpystrn(eos, "apr-" APR_STRINGIFY(APR_MAJOR_VERSION) "/", sizeof(path) - (eos - path)); apr_cpystrn(eos, module, sizeof(path) - (eos - path)); rv = apr_dso_load(&dlhandle, path, global); if (dlhandleptr) { *dlhandleptr = dlhandle; } if (rv == APR_SUCCESS) { /* APR_EDSOOPEN */ break; } } } if (rv != APR_SUCCESS) /* APR_ESYMNOTFOUND */ return rv; rv = apr_dso_sym(dsoptr, dlhandle, modsym); if (rv != APR_SUCCESS) { /* APR_ESYMNOTFOUND */ apr_dso_unload(dlhandle); } else { module = apr_pstrdup(global, module); apr_hash_set(dsos, module, APR_HASH_KEY_STRING, *dsoptr); } return rv; }
"[mode: daemon]")}, #endif #if APR_HAS_THREADS {"min-threads", SVNSERVE_OPT_MIN_THREADS, 1, N_("Minimum number of server threads, even if idle.\n" " " "Capped to max-threads; minimum value is 0.\n" " " "Default is 1." ONLY_AVAILABLE_WITH_THEADS)}, {"max-threads", SVNSERVE_OPT_MAX_THREADS, 1, N_("Maximum number of server threads, even if there\n" " " "are more connections. Minimum value is 1.\n" " " "Default is " APR_STRINGIFY(THREADPOOL_MAX_SIZE) "." ONLY_AVAILABLE_WITH_THEADS)}, #endif {"max-request-size", SVNSERVE_OPT_MAX_REQUEST, 1, N_("Maximum acceptable size of a client request in MB.\n" " " "This implicitly limits the length of paths and\n" " " "property values that can be sent to the server.\n" " " "Also the peak memory usage for protocol handling\n" " " "per server thread or sub-process.\n" " " "0 disables the size check; default is " APR_STRINGIFY(MAX_REQUEST_SIZE) ".")},