X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-perl/blobdiff_plain/f9952aec1cf6c64a5681308eea817b6113a37433..fcd15e0b7a3d0f0ca2f30953573f8d1f6b8e8bd2:/keystuff.c diff --git a/keystuff.c b/keystuff.c index b8c9519..beb9a74 100644 --- a/keystuff.c +++ b/keystuff.c @@ -32,9 +32,31 @@ /*----- Main code ---------------------------------------------------------*/ -void warn_keyreporter(const char *file, int line, const char *err, void *p) +void keyreport(const char *file, int line, const char *err, void *p) { - warn("%s:%i: keyfile error: %s", file, line, err); + SV *sv = p; + dSP; + + if (!SvOK(sv)) + warn("%s:%i: keyfile error: %s", file, line, err); + else { + ENTER; SAVETMPS; + + PUSHMARK(SP); + XPUSHs(sv); + XPUSHs(sv_2mortal(newSVpv(file, 0))); + XPUSHs(sv_2mortal(newSViv(line))); + XPUSHs(sv_2mortal(newSVpv(err, 0))); + PUTBACK; + + call_method("report", G_DISCARD | G_EVAL | G_KEEPERR); + if (SvTRUE(ERRSV)) { + STRLEN len; + warn("reporter raised error (ignoring): %s", SvPV(ERRSV, len)); + } + + FREETMPS; LEAVE; + } } SV *keyerr(int rc) @@ -49,4 +71,15 @@ SV *keyerr(int rc) return (&PL_sv_undef); } +void keyfile_dec(Key_File *kf) +{ + kf->ref--; + if (!kf->ref) { + key_discard(&kf->kf); + DESTROY(kf); + } +} + + + /*----- That's all, folks -------------------------------------------------*/