diff options
author | Graham Leggett <minfrin@apache.org> | 2011-10-23 22:07:04 +0000 |
---|---|---|
committer | Graham Leggett <minfrin@apache.org> | 2011-10-23 22:07:04 +0000 |
commit | c5234b6222f28298be164ce4dabe3afb126399d3 (patch) | |
tree | d811258ca437338eb6eddc1dfe9d9ad2ae9faebe /crypto/apr_crypto_openssl.c | |
parent | 1b54d4eeedfc9de7db765d5123f7959d03d9fc0b (diff) | |
download | apr-c5234b6222f28298be164ce4dabe3afb126399d3.tar.gz |
apr_crypto: Teach the apr_crypto_nss driver to support the "noinit" option
for where NSS is initialised elsewhere.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1187984 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'crypto/apr_crypto_openssl.c')
-rw-r--r-- | crypto/apr_crypto_openssl.c | 79 |
1 files changed, 38 insertions, 41 deletions
diff --git a/crypto/apr_crypto_openssl.c b/crypto/apr_crypto_openssl.c index 631551627..2c2178bb4 100644 --- a/crypto/apr_crypto_openssl.c +++ b/crypto/apr_crypto_openssl.c @@ -191,21 +191,50 @@ static apr_status_t crypto_make(apr_crypto_t **ff, apr_crypto_config_t *config = NULL; apr_crypto_t *f = apr_pcalloc(pool, sizeof(apr_crypto_t)); + const char *engine; + struct { const char *field; - char *value; + const char *value; + int set; } fields[] = { - { "engine", NULL }, - { NULL, NULL } + { "engine", NULL, 0 }, + { NULL, NULL, 0 } }; - int i; const char *ptr; - const char *key; size_t klen; - const char *value; - size_t vlen; - static const char * const delims = " \r\n\t;|,"; - const char *engine; + char **elts = NULL; + char *elt; + int i = 0, j; + apr_status_t status; + + if (APR_SUCCESS != (status = apr_tokenize_to_argv(params, &elts, pool))) { + return status; + } + while ((elt = elts[i])) { + ptr = strchr(elt, '='); + if (ptr) { + for (klen = ptr - elt; klen && apr_isspace(elt[klen - 1]); --klen); + ptr++; + } + else { + for (klen = strlen(elt); klen && apr_isspace(elt[klen - 1]); --klen); + } + elt[klen] = 0; + + for (j = 0; fields[j].field != NULL; ++j) { + if (!strcasecmp(fields[j].field, elt)) { + fields[j].set = 1; + if (ptr) { + fields[j].value = ptr; + } + break; + } + } + + i++; + } + engine = fields[0].value; if (!f) { return APR_ENOMEM; @@ -247,38 +276,6 @@ static apr_status_t crypto_make(apr_crypto_t **ff, apr_pool_cleanup_register(pool, f, crypto_cleanup_helper, apr_pool_cleanup_null); - /* snitch parsing from the MySQL driver */ - for (ptr = strchr(params, '='); ptr; ptr = strchr(ptr, '=')) { - /* don't dereference memory that may not belong to us */ - if (ptr == params) { - ++ptr; - continue; - } - for (key = ptr - 1; apr_isspace(*key); --key); - klen = 0; - while (apr_isalpha(*key)) { - if (key == params) { - /* Don't parse off the front of the params */ - --key; - ++klen; - break; - } - --key; - ++klen; - } - ++key; - for (value = ptr + 1; apr_isspace(*value); ++value); - vlen = strcspn(value, delims); - for (i = 0; fields[i].field != NULL; ++i) { - if (!strncasecmp(fields[i].field, key, klen)) { - fields[i].value = apr_pstrndup(pool, value, vlen); - break; - } - } - ptr = value + vlen; - } - engine = fields[0].value; - if (engine) { config->engine = ENGINE_by_id(engine); if (!config->engine) { |