X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=privcache.c;h=ba5ddc903a0ee4e5fdb4be83d18236bb45048938;hb=7b3937db4102e6b2adc0fc861965d0f9d4da2d8b;hp=1f46eb00d033c323e84e971618acd3a4b741b810;hpb=60725608deb1940a9c60ee7da6ceec981f639088;p=secnet.git diff --git a/privcache.c b/privcache.c index 1f46eb0..ba5ddc9 100644 --- a/privcache.c +++ b/privcache.c @@ -37,11 +37,13 @@ struct privcache { struct hash_if *defhash; }; -static struct sigprivkey_if *uncached_load_file( +static bool_t uncached_load_file( const struct sigscheme_info *scheme, const char *path, struct buffer_if *databuf, struct hash_if *defhash, + struct sigprivkey_if **sigpriv_r, + closure_t **closure_r, struct log_if *log); static struct sigprivkey_if *uncached_get(struct privcache *st, @@ -61,19 +63,26 @@ static struct sigprivkey_if *uncached_get(struct privcache *st, path); return 0; - found: - return uncached_load_file(scheme, + found:; + struct sigprivkey_if *sigpriv; + closure_t *cl; + bool_t ok=uncached_load_file(scheme, path, &st->databuf, st->defhash, + &sigpriv, + &cl, log); + return ok ? sigpriv : 0; } -static struct sigprivkey_if *uncached_load_file( +static bool_t uncached_load_file( const struct sigscheme_info *scheme, const char *path, struct buffer_if *databuf, struct hash_if *defhash, + struct sigprivkey_if **sigpriv_r, + closure_t **closure_r, struct log_if *log) { bool_t ok=False; @@ -110,7 +119,7 @@ static struct sigprivkey_if *uncached_load_file( databuf->start=databuf->base; databuf->size=got; struct cloc loc = { .file=path, .line=0 }; - ok=scheme->loadpriv(scheme, databuf, &sigpriv, log, loc); + ok=scheme->loadpriv(scheme, databuf, &sigpriv, closure_r, log, loc); if (!ok) goto error_out; /* loadpriv will have logged */ if (sigpriv->sethash) { @@ -122,10 +131,11 @@ static struct sigprivkey_if *uncached_load_file( } sigpriv->sethash(sigpriv->st,defhash); } + *sigpriv_r=sigpriv; out: if (f) fclose(f); - return ok ? sigpriv : 0; + return ok; error_out: if (sigpriv) sigpriv->dispose(sigpriv->st);