Extract Subversion ignore data.
[catacomb-perl] / keystuff.c
index 377afaf..73e850f 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: keystuff.c,v 1.1 2004/04/02 18:04:01 mdw Exp $
+ * $Id$
  *
  * Useful key-management functions
  *
  * 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 -------------------------------------------------*/