X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-perl/blobdiff_plain/a1a90aaf554eb974e39e34b513747eb666180776..bfdf19cbde6d9f5cdb740d258fcc439a4a412ab0:/keystuff.c diff --git a/keystuff.c b/keystuff.c index b8c9519..73e850f 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) @@ -42,11 +64,36 @@ SV *keyerr(int rc) SV *sv; if (!rc) return (&PL_sv_yes); - sv = perl_get_sv("Catacomb::Key::error", TRUE); + sv = perl_get_sv("Catacomb::keyerror", TRUE); sv_setiv(sv, rc); sv_setpv(sv, key_strerror(rc)); SvIOK_on(sv); return (&PL_sv_undef); } +const char *keydata_type(Key_Data *kd) +{ + const char *cls; + if (!kd) return (0); + switch (kd->e & KF_ENCMASK) { + case KENC_BINARY: cls = "Catacomb::Key::Data::Binary"; break; + case KENC_ENCRYPT: cls = "Catacomb::Key::Data::Encrypted"; break; + case KENC_EC: cls = "Catacomb::Key::Data::EC"; break; + case KENC_STRING: cls = "Catacomb::Key::Data::String"; break; + case KENC_STRUCT: cls = "Catacomb::Key::Data::Structured"; break; + case KENC_MP: cls = "Catacomb::Key::Data::MP"; break; + default: abort(); + } + return (cls); +} + +void keyfile_dec(Key_File *kf) +{ + kf->ref--; + if (!kf->ref) { + key_discard(&kf->kf); + DESTROY(kf); + } +} + /*----- That's all, folks -------------------------------------------------*/