X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-perl/blobdiff_plain/660b443cc58d4dd4e92730104429fb64d78c7075..bfdf19cbde6d9f5cdb740d258fcc439a4a412ab0:/keystuff.c diff --git a/keystuff.c b/keystuff.c index 377afaf..73e850f 100644 --- a/keystuff.c +++ b/keystuff.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: keystuff.c,v 1.1 2004/04/02 18:04:01 mdw Exp $ + * $Id$ * * Useful key-management functions * @@ -26,25 +26,37 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: keystuff.c,v $ - * Revision 1.1 2004/04/02 18:04:01 mdw - * Initial checkin. - * - */ - /*----- Header files ------------------------------------------------------*/ -/*----- Data structures ---------------------------------------------------*/ - -/*----- Static variables --------------------------------------------------*/ +#include "catacomb-perl.h" /*----- Main code ---------------------------------------------------------*/ -void warn_keyreporter(const char *file, int line, char *err, void *p) +void keyreport(const char *file, int line, const char *err, void *p) { - warn("%s:%i: keyfile error: %s", file, line, msg); + 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) @@ -52,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 -------------------------------------------------*/