68
68
} apr_crypto_clear_t;
71
#define DRIVER_LOAD(name,driver,pool,params) \
71
#define DRIVER_LOAD(name,driver_name,pool,params,rv,result) \
73
extern const apr_crypto_driver_t driver; \
74
apr_hash_set(drivers,name,APR_HASH_KEY_STRING,&driver); \
76
driver.init(pool, params); \
73
extern const apr_crypto_driver_t driver_name; \
74
apr_hash_set(drivers,name,APR_HASH_KEY_STRING,&driver_name); \
75
if (driver_name.init) { \
76
rv = driver_name.init(pool, params, result); \
78
*driver = &driver_name; \
108
109
drivers = apr_hash_make(pool);
111
/* Load statically-linked drivers: */
113
DRIVER_LOAD("openssl", apr_crypto_openssl_driver, pool, params);
116
DRIVER_LOAD("nss", apr_crypto_nss_driver, pool, params);
119
DRIVER_LOAD("mscapi", apr_crypto_mscapi_driver, pool, params);
122
DRIVER_LOAD("mscng", apr_crypto_mscng_driver, pool, params);
124
#endif /* APU_DSO_BUILD */
126
111
apr_pool_cleanup_register(pool, NULL, apr_crypto_term,
127
112
apr_pool_cleanup_null);
198
186
apr_snprintf(symname, sizeof(symname), "apr_crypto_%s_driver", name);
199
187
rv = apu_dso_load(&dso, &symbol, modname, symname, pool);
200
if (rv != APR_SUCCESS) { /* APR_EDSOOPEN or APR_ESYMNOTFOUND? */
201
if (rv == APR_EINIT) { /* previously loaded?!? */
202
name = apr_pstrdup(pool, name);
203
apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
188
if (rv == APR_SUCCESS || rv == APR_EINIT) { /* previously loaded?!? */
190
name = apr_pstrdup(pool, name);
191
apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
193
if ((*driver)->init) {
194
rv = (*driver)->init(pool, params, result);
209
if ((*driver)->init) {
210
rv = (*driver)->init(pool, params, &rc);
212
name = apr_pstrdup(pool, name);
213
apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver);
215
unlock: apu_dso_mutex_unlock();
217
if (APR_SUCCESS != rv && result) {
197
apu_dso_mutex_unlock();
199
if (APR_SUCCESS != rv && result && !*result) {
218
200
char *buffer = apr_pcalloc(pool, ERROR_SIZE);
219
201
apu_err_t *err = apr_pcalloc(pool, sizeof(apu_err_t));
220
202
if (err && buffer) {
221
203
apr_dso_error(dso, buffer, ERROR_SIZE - 1);
222
204
err->msg = buffer;
223
205
err->reason = modname;
229
210
#else /* not builtin and !APR_HAS_DSO => not implemented */
230
211
rv = APR_ENOTIMPL;
213
/* Load statically-linked drivers: */
215
if (name[0] == 'o' && !strcmp(name, "openssl")) {
216
DRIVER_LOAD("openssl", apr_crypto_openssl_driver, pool, params, rv, result);
220
if (name[0] == 'n' && !strcmp(name, "nss")) {
221
DRIVER_LOAD("nss", apr_crypto_nss_driver, pool, params, rv, result);
225
if (name[0] == 'm' && !strcmp(name, "mscapi")) {
226
DRIVER_LOAD("mscapi", apr_crypto_mscapi_driver, pool, params, rv, result);
230
if (name[0] == 'm' && !strcmp(name, "mscng")) {
231
DRIVER_LOAD("mscng", apr_crypto_mscng_driver, pool, params, rv, result);