Update for new keydata interface.
[catacomb-perl] / key.xs
diff --git a/key.xs b/key.xs
index d14ad70..db58921 100644 (file)
--- a/key.xs
+++ b/key.xs
@@ -65,11 +65,21 @@ del(k)
        OUTPUT:
        RETVAL
 
-Key_DataImpl *
-_data(k)
+Key_Data *
+data(k)
        Key *k
        CODE:
-       RETVAL = &k->k->k;
+       RETVAL = k->k->k;
+       key_incref(RETVAL);
+       OUTPUT:
+       RETVAL
+
+KeyErr
+setdata(k, kd)
+       Key *k
+       Key_Data *kd
+       CODE:
+       RETVAL = key_setkeydata(&k->kf->kf, k->k, kd);
        OUTPUT:
        RETVAL
 
@@ -296,366 +306,345 @@ m(kf)
        OUTPUT:
        RETVAL
 
-MODULE = Catacomb PACKAGE = Catacomb::Key::DataImpl PREFIX = key_
-
-Key_DataImpl *
-new(me)
-       SV *me
-       CODE:
-       RETVAL = CREATE(key_data);
-       RETVAL->e = 0;
-       RETVAL->u.k.k = 0;
-       RETVAL->u.k.sz = 0;
-       OUTPUT:
-       RETVAL
+MODULE = Catacomb PACKAGE = Catacomb::Key::Data PREFIX = key_
 
 SV *
-free(kd)
-       Key_DataImpl *kd
+DESTROY(kd)
+       Key_Data *kd
        CODE:
-       key_destroy(kd);
-       DESTROY(kd);
+       key_drop(kd);
        XSRETURN_YES;
 
-SV *
-clear(kd)
-       Key_DataImpl *kd
+U32
+flags(kd)
+       Key_Data *kd
        CODE:
-       key_destroy(kd);
-       kd->e = 0;
-       kd->u.k.k = 0;
-       kd->u.k.sz = 0;
-       XSRETURN_YES;
+       RETVAL = kd->e;
+       OUTPUT: 
+       RETVAL
 
-SV *
-setbinary(kd, sv)
-       Key_DataImpl *kd
-       SV *sv
+void
+readflags(me, p)
+       SV *me
+       char *p
        PREINIT:
-       char *p;
-       STRLEN len;
-       CODE:
-       p = SvPV(sv, len);
-       key_destroy(kd);
-       key_binary(kd, p, len);
-       XSRETURN_YES;
+       unsigned f, m;
+       PPCODE:
+       if (key_readflags(p, &p, &f, &m) || *p)
+         croak("bad flags string");
+       XPUSHs(sv_2mortal(newSVuv(m)));
+       XPUSHs(sv_2mortal(newSVuv(f)));
 
 SV *
-setencrypted(kd, sv)
-       Key_DataImpl *kd
-       SV *sv
+getflags(me, f)
+       SV *me
+       U32 f
        PREINIT:
-       char *p;
-       STRLEN len;
+       dstr d = DSTR_INIT;
        CODE:
-       p = SvPV(sv, len);
-       key_destroy(kd);
-       key_encrypted(kd, p, len);
-       XSRETURN_YES;
+       key_writeflags(f, &d);
+       RETVAL = newSVpvn(d.buf, d.len);
+       dstr_destroy(&d);
+       OUTPUT:
+       RETVAL
 
 SV *
-setmp(kd, x)
-       Key_DataImpl *kd
-       mp *x
+setflags(kd, f)
+       Key_Data *kd
+       U32 f
        CODE:
-       key_destroy(kd);
-       key_mp(kd, x);
+       kd->e = (kd->e & KF_ENCMASK) | (f & ~KF_ENCMASK);
        XSRETURN_YES;
 
-SV *
-setstring(kd, p)
-       Key_DataImpl *kd
+void
+read(me, p)
+       SV *me
        char *p
-       CODE:
-       key_destroy(kd);
-       key_string(kd, p);
-       XSRETURN_YES;
+       PREINIT:
+       key_data *kd;
+       char *pp;
+       PPCODE:
+       if ((kd = key_read(p, &pp)) != 0) {
+         XPUSHs(RET(kd, keydata_type(kd)));
+         if (GIMME_V == G_ARRAY)
+           XPUSHs(sv_2mortal(newSVpvn(pp, strlen(pp))));
+       }
 
 SV *
-setec(kd, p)
-       Key_DataImpl *kd
-       ec *p
-       CODE:
-       key_destroy(kd);
-       key_ec(kd, p);
-       XSRETURN_YES;
-
-U32
-flags(kd)
-       Key_DataImpl *kd
+write(kd, kf = 0)
+       Key_Data *kd
+       Key_Filter *kf
+       PREINIT:
+       dstr d = DSTR_INIT;
        CODE:
-       RETVAL = kd->e;
-       OUTPUT: 
+       if (key_write(kd, &d, kf))
+         RETVAL = newSVpvn(d.buf, d.len);
+       else
+         RETVAL = &PL_sv_undef;
+       dstr_destroy(&d);
+       OUTPUT:
        RETVAL
 
-SV *
-setflags(kd, f)
-       Key_DataImpl *kd
-       U32 f
-       CODE:
-       if (f & KF_ENCMASK)
-         croak("can't change encoding flags");
-       kd->e = (kd->e & KF_ENCMASK) | (f & ~KF_ENCMASK);
-       XSRETURN_YES;
-
-SV *
-getbinary(kd)
-       Key_DataImpl *kd
+Key_Data *
+decode(me, sv)
+       SV *me
+       SV *sv
+       PREINIT:
+       char *p;
+       STRLEN len;
        CODE:
-       if ((kd->e & KF_ENCMASK) != KENC_BINARY)
-         croak("key is not binary");
-       RETVAL = newSVpvn(kd->u.k.k, kd->u.k.sz);
+       p = SvPV(sv, len);
+       RETVAL = key_decode(p, len);
        OUTPUT:
        RETVAL
 
 SV *
-getencrypted(kd)
-       Key_DataImpl *kd
+encode(kd, kf = 0)
+       Key_Data *kd
+       Key_Filter *kf
+       PREINIT:
+       dstr d = DSTR_INIT;
        CODE:
-       if ((kd->e & KF_ENCMASK) != KENC_ENCRYPT)
-         croak("key is not encrypted");
-       RETVAL = newSVpvn(kd->u.k.k, kd->u.k.sz);
+       if (key_encode(kd, &d, kf))
+         RETVAL = newSVpvn(d.buf, d.len);
+       else
+         RETVAL = &PL_sv_undef;
+       dstr_destroy(&d);
        OUTPUT:
        RETVAL
 
-mp *
-getmp(kd)
-       Key_DataImpl *kd
+Key_Data *
+lock(kd, key)
+       Key_Data *kd
+       SV *key
+       PREINIT:
+       STRLEN len;
+       char *p;
        CODE:
-       if ((kd->e & KF_ENCMASK) != KENC_MP)
-         croak("key is not bignum");
-       RETVAL = MP_COPY(kd->u.m);
+       p = SvPV(key, len);
+       key_lock(&RETVAL, kd, p, len);
        OUTPUT:
        RETVAL
 
-ec *
-getec(kd)
-       Key_DataImpl *kd
+Key_Data *
+plock(kd, tag)
+       Key_Data *kd
+       char *tag
+       PREINIT:
+       int rc;
        CODE:
-       if ((kd->e & KF_ENCMASK) != KENC_EC)
-         croak("key is not a curve point");
-       RETVAL = CREATE(ec);
-       EC_CREATE(RETVAL);
-       EC_COPY(RETVAL, &kd->u.e);
+       if ((rc = key_plock(&RETVAL, kd, tag)) != 0) {
+         keyerr(rc);
+         RETVAL = 0;
+       }
        OUTPUT:
        RETVAL
 
-char *
-getstring(kd)
-       Key_DataImpl *kd
+bool
+key_match(kd, kf)
+       Key_Data *kd
+       Key_Filter *kf
+
+MODULE = Catacomb PACKAGE = Catacomb::Key::Data::Binary PREFIX = key_
+
+Key_Data *
+new(me, sv, f = 0)
+       SV *me
+       SV *sv
+       unsigned f
+       PREINIT:
+       char *p;
+       STRLEN len;
        CODE:
-       if ((kd->e & KF_ENCMASK) != KENC_STRING)
-         croak("key is not string");
-       RETVAL = kd->u.p;
+       p = SvPV(sv, len);
+       RETVAL = key_newbinary(f, p, len);
        OUTPUT:
        RETVAL
 
 SV *
-setstruct(kd)
-       Key_DataImpl *kd
+bin(kd)
+       Key_Data *kd
        CODE:
-       key_destroy(kd);
-       key_structure(kd);
-       XSRETURN_YES;
-
-Key_DataImpl *
-key_structfind(kd, tag)
-       Key_DataImpl *kd
-       char *tag
-       INIT:
-       if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
-         XSRETURN_UNDEF;
+       RETVAL = newSVpvn((char *)kd->u.k.k, kd->u.k.sz);
+       OUTPUT:
+       RETVAL
 
-Key_DataImpl *
-key_structcreate(kd, tag)
-       Key_DataImpl *kd
-       char *tag
-       INIT:
-       if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
-         croak("key is not structured");
+MODULE = Catacomb PACKAGE = Catacomb::Key::Data::Encrypted PREFIX = key_
 
-Key_StructIter *
-structiter(kd)
-       Key_DataImpl *kd
+Key_Data *
+new(me, sv, f = 0)
+       SV *me
+       SV *sv
+       unsigned f
+       PREINIT:
+       char *p;
+       STRLEN len;
        CODE:
-       if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
-         croak("key is not structured");
-       RETVAL = CREATE(Key_StructIter);
-       sym_mkiter(RETVAL, &kd->u.s);
+       p = SvPV(sv, len);
+       RETVAL = key_newencrypted(f, p, len);
        OUTPUT:
        RETVAL
 
 SV *
-structdel(kd, tag)
-       Key_DataImpl *kd
-       char *tag
-       PREINIT:
-       key_struct *ks;
+ct(kd)
+       Key_Data *kd
        CODE:
-       if ((kd->e & KF_ENCMASK) != KENC_STRUCT)
-         croak("key is not structured");
-       if ((ks = sym_find(&kd->u.s, tag, -1, 0, 0)) == 0)
-         XSRETURN_UNDEF;
-       key_destroy(&ks->k);
-       sym_remove(&kd->u.s, ks);
-       XSRETURN_YES;
-
-bool
-key_match(kd, kf)
-       Key_DataImpl *kd
-       Key_Filter *kf
-
-bool
-set(kd, kkd, kf = 0)
-       Key_DataImpl *kd
-       Key_DataImpl *kkd
-       Key_Filter *kf
-       CODE:
-       key_destroy(kd);
-       kd->e = 0;
-       kd->u.k.k = 0;
-       kd->u.k.sz = 0;
-       RETVAL = key_copy(kd, kkd, kf);
+       RETVAL = newSVpvn((char *)kd->u.k.k, kd->u.k.sz);
        OUTPUT:
        RETVAL
 
-Key_DataImpl *
+SV *
 lock(kd, key)
-       Key_DataImpl *kd
+       Key_Data *kd
        SV *key
-       PREINIT:
-       STRLEN len;
-       char *p;
        CODE:
-       if ((kd->e & KF_ENCMASK) == KENC_ENCRYPT)
-         croak("already encrypted");
-       RETVAL = CREATE(Key_DataImpl);
-       p = SvPV(key, len);
-       key_lock(RETVAL, kd, p, len);
-       OUTPUT:
-       RETVAL
+       croak("already encrypted");
+
+SV *
+plock(kd, tag)
+       Key_Data *kd
+       char *tag
+       CODE:
+       croak("already encrypted");
 
-Key_DataImpl *
+Key_Data *
 unlock(kd, key)
-       Key_DataImpl *kd
+       Key_Data *kd
        SV *key
        PREINIT:
        STRLEN len;
        char *p;
        int rc;
        CODE:
-       if ((kd->e & KF_ENCMASK) != KENC_ENCRYPT)
-         croak("not encrypted");
-       RETVAL = CREATE(Key_DataImpl);
        p = SvPV(key, len);
-       if ((rc = key_unlock(RETVAL, kd, p, len)) != 0) {
-         DESTROY(RETVAL);
+       if ((rc = key_unlock(&RETVAL, kd, p, len)) != 0) {
          keyerr(rc);
          RETVAL = 0;
        }
        OUTPUT:
        RETVAL
 
-Key_DataImpl *
-plock(kd, tag)
-       Key_DataImpl *kd
+Key_Data *
+punlock(kd, tag)
+       Key_Data *kd
        char *tag
        PREINIT:
        int rc;
        CODE:
-       if ((kd->e & KF_ENCMASK) == KENC_ENCRYPT)
-         croak("already encrypted");
-       RETVAL = CREATE(Key_DataImpl);
-       if ((rc = key_plock(tag, kd, RETVAL)) != 0) {
-         DESTROY(RETVAL);
+       if ((rc = key_punlock(&RETVAL, kd, tag)) != 0) {
          keyerr(rc);
          RETVAL = 0;
        }
        OUTPUT:
        RETVAL
 
-Key_DataImpl *
-punlock(kd, tag)
-       Key_DataImpl *kd
-       char *tag
-       PREINIT:
-       int rc;
+MODULE = Catacomb PACKAGE = Catacomb::Key::Data::MP PREFIX = key_
+
+Key_Data *
+new(me, x, f = 0)
+       SV *me
+       mp *x
+       unsigned f
        CODE:
-       if ((kd->e & KF_ENCMASK) != KENC_ENCRYPT)
-         croak("not encrypted");
-       RETVAL = CREATE(Key_DataImpl);
-       if ((rc = key_punlock(tag, kd, RETVAL)) != 0) {
-         DESTROY(RETVAL);
-         keyerr(rc);
-         RETVAL = 0;
-       }
+       RETVAL = key_newmp(f, x);
        OUTPUT:
        RETVAL
 
-void
-read(me, p)
+mp *
+mp(kd)
+       Key_Data *kd
+       CODE:
+       RETVAL = MP_COPY(kd->u.m);
+       OUTPUT:
+       RETVAL
+
+MODULE = Catacomb PACKAGE = Catacomb::Key::Data::EC PREFIX = key_
+
+Key_Data *
+new(me, p, f = 0)
        SV *me
-       char *p
-       PREINIT:
-       key_data *kd;
-       char *pp;
-       PPCODE:
-       kd = CREATE(key_data);
-       if (key_read(p, kd, &pp))
-         DESTROY(kd);
-       else {
-         XPUSHs(RET(kd, "Catacomb::Key::DataImpl"));
-         if (GIMME_V == G_ARRAY)
-           XPUSHs(sv_2mortal(newSVpvn(pp, strlen(pp))));
-       }
+       ec *p
+       unsigned f
+       CODE:
+       RETVAL = key_newec(f, p);
+       OUTPUT:
+       RETVAL
 
-SV *
-write(kd, kf = 0)
-       Key_DataImpl *kd
-       Key_Filter *kf
-       PREINIT:
-       dstr d = DSTR_INIT;
+ec *
+ec(kd)
+       Key_Data *kd
        CODE:
-       if (key_write(kd, &d, kf))
-         RETVAL = newSVpvn(d.buf, d.len);
-       else
-         RETVAL = &PL_sv_undef;
-       dstr_destroy(&d);
+       RETVAL = CREATE(ec);
+       EC_CREATE(RETVAL);
+       EC_COPY(RETVAL, &kd->u.e);
        OUTPUT:
        RETVAL
 
-Key_DataImpl *
-decode(me, sv)
+MODULE = Catacomb PACKAGE = Catacomb::Key::Data::String PREFIX = key_
+
+Key_Data *
+new(me, p, f = 0)
        SV *me
-       SV *sv
-       PREINIT:
-       char *p;
-       STRLEN len;
+       char *p
+       unsigned f
        CODE:
-       p = SvPV(sv, len);
-       RETVAL = CREATE(key_data);
-       if (key_decode(p, len, RETVAL)) {
-         DESTROY(RETVAL);
-         RETVAL = 0;
-       }
+       RETVAL = key_newstring(f, p);
        OUTPUT:
        RETVAL
 
-SV *
-encode(kd, kf = 0)
-       Key_DataImpl *kd
-       Key_Filter *kf
-       PREINIT:
-       dstr d = DSTR_INIT;
+char *
+str(kd)
+       Key_Data *kd
        CODE:
-       if (key_encode(kd, &d, kf))
-         RETVAL = newSVpvn(d.buf, d.len);
-       else
-         RETVAL = &PL_sv_undef;
-       dstr_destroy(&d);
+       RETVAL = kd->u.p;
+       OUTPUT:
+       RETVAL
+
+MODULE = Catacomb PACKAGE = Catacomb::Key::Data::Structured PREFIX = key_
+
+Key_Data *
+new()
+       CODE:
+       RETVAL = key_newstruct();
+       OUTPUT:
+       RETVAL
+
+Key_StructIter *
+iterate(kd)
+       Key_Data *kd
+       CODE:
+       RETVAL = CREATE(Key_StructIter);
+       sym_mkiter(RETVAL, &kd->u.s);
+       OUTPUT:
+       RETVAL
+
+Key_Data *
+find(kd, tag)
+       Key_Data *kd
+       char *tag
+       CODE:
+       RETVAL = key_structfind(kd, tag);
+       if (RETVAL) key_incref(RETVAL);
        OUTPUT:
        RETVAL
 
+SV *
+del(kd, tag)
+       Key_Data *kd
+       char *tag
+       CODE:
+       key_structset(kd, tag, 0);
+       XSRETURN_YES;
+
+SV *
+set(kd, tag, kdnew = 0)
+       Key_Data *kd
+       char *tag
+       Key_Data *kdnew
+       CODE:
+       key_structset(kd, tag, kdnew);
+       XSRETURN_YES;
+       
 MODULE = Catacomb PACKAGE = Catacomb::Key::StructIter
 
 SV *
@@ -679,31 +668,6 @@ DESTROY(i)
 
 MODULE = Catacomb PACKAGE = Catacomb::Key::Data
 
-void
-readflags(me, p)
-       SV *me
-       char *p
-       PREINIT:
-       unsigned f, m;
-       PPCODE:
-       if (key_readflags(p, &p, &f, &m) || *p)
-         croak("bad flags string");
-       XPUSHs(sv_2mortal(newSVuv(m)));
-       XPUSHs(sv_2mortal(newSVuv(f)));
-
-SV *
-getflags(me, f)
-       SV *me
-       U32 f
-       PREINIT:
-       dstr d = DSTR_INIT;
-       CODE:
-       key_writeflags(f, &d);
-       RETVAL = newSVpvn(d.buf, d.len);
-       dstr_destroy(&d);
-       OUTPUT:
-       RETVAL
-
 MODULE = Catacomb PACKAGE = Catacomb::Key::File PREFIX = key_
 
 Key_File *
@@ -748,6 +712,41 @@ key_extract(kf, k, fp, kfilt = 0)
        C_ARGS:
        &kf->kf, k->k, fp, kfilt
 
+void
+qtag(kf, tag, kdnew = 0)
+       Key_File *kf
+       char *tag
+       Key_Data *kdnew
+       PREINIT:
+       dstr d = DSTR_INIT;
+       key_data **kd;
+       key_data *okd;
+       key *k;
+       Key *kk;
+       PPCODE:
+       if (key_qtag(&kf->kf, tag, &d, &k, &kd)) {
+         keyerr(KERR_NOTFOUND);
+         XSRETURN_UNDEF;
+       }
+       okd = *kd;
+       if (kdnew) {
+         if (!(kf->kf.f & KF_WRITE)) {
+           keyerr(KERR_READONLY);
+           XSRETURN_UNDEF;
+         }
+         kf->kf.f |= KF_MODIFIED;
+         *kd = kdnew;
+       }
+       key_incref(*kd);
+       kk = CREATE(Key);
+       kk->k = k;
+       kk->kf = kf;
+       kf->ref++;
+       XPUSHs(sv_2mortal(newSVpvn(d.buf, d.len)));
+       XPUSHs(RET(kk, "Catacomb::Key"));
+       XPUSHs(RET(okd, keydata_type(okd)));
+       dstr_destroy(&d);
+
 int
 key_save(kf)
        Key_File *kf
@@ -803,7 +802,7 @@ bytag(kf, tag)
        RETVAL
 
 Key *
-newkey(kf, id, type, exp)
+newkey(kf, id, type, exp = KEXP_FOREVER)
        Key_File *kf
        U32 id
        const char *type
@@ -812,7 +811,7 @@ newkey(kf, id, type, exp)
        int err;
        CODE:
        RETVAL = CREATE(Key);
-       if ((RETVAL->k = key_new(&kf->kf, id, type, exp, &err)) == 0) {
+       if ((err = key_new(&kf->kf, id, type, exp, &RETVAL->k)) == 0) {
          DESTROY(RETVAL);
          keyerr(err);
          RETVAL = 0;
@@ -822,7 +821,6 @@ newkey(kf, id, type, exp)
        }
        OUTPUT:
        RETVAL
-       
 
 Key_FileIter *
 iterate(kf)