X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/b2687a0a4b3c5e45cad7c5815a6d3805bfc8d4f1..4a35c9a728df05a99eff3c335ee7ec2ddf201cff:/key.c diff --git a/key.c b/key.c index cd330c7..2af0019 100644 --- a/key.c +++ b/key.c @@ -1,7 +1,5 @@ /* -*-c-*- * - * $Id$ - * * Key files and data * * (c) 2005 Straylight/Edgeware @@ -106,7 +104,7 @@ static PyMethodDef keyexc_pymethods[] = { static void keyexc_raise(int err) { - PyObject *arg = Py_BuildValue("(i)", err); + PyObject *arg = Py_BuildValue("(is)", err, key_strerror(err)); if (arg) PyErr_SetObject(keyexc, arg); Py_XDECREF(arg); } @@ -270,7 +268,7 @@ static int convflags(PyObject *x, void *p) rc = 1; goto end; tyerr: - TYERR("expected flag string or flag/mask pair"); + TYERR("expected flag string or integer bitfield"); end: return (rc); } @@ -350,6 +348,21 @@ static PyObject *kdmeth_split(PyObject *me, PyObject *arg) RETURN_ME; } +static PyObject *kdmeth_copy(PyObject *me, PyObject *arg, PyObject *kw) +{ + key_filter f = { 0, 0 }; + static char *kwlist[] = { "filter", 0 }; + key_data *kd; + + if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:copy", kwlist, + convfilter, &f)) + return (0); + if ((kd = key_copydata(KEYDATA_KD(me), &f)) == 0) + RETURN_NONE; + else + return (keydata_pywrap(kd)); +} + static PyObject *kdmeth_write(PyObject *me, PyObject *arg, PyObject *kw) { key_filter f = { 0, 0 }; @@ -454,6 +467,7 @@ static PyMethodDef keydata_pymethods[] = { METH (split, "KD.split()") KWMETH(write, "KD.write(filter = ) -> STRING") KWMETH(encode, "KD.encode(filter = ) -> BYTES") + KWMETH(copy, "KD.encode(filter = ) -> KD") METH (plock, "KD.plock(TAG) -> ENCRYPTED-KD") METH (lock, "KD.lock(KEY) -> ENCRYPTED-KD") #undef METHNAME @@ -1097,6 +1111,7 @@ static int keydatastruct_pystore(PyObject *me, if ((tag = PyString_AsString(key)) == 0) goto end; + key_split(&KEYDATA_KD(me)); if (value) { if (!KEYDATA_PYCHECK(value)) TYERR("expected KeyData value"); @@ -1370,16 +1385,16 @@ static PyObject *key_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw) PyObject *kfobj; uint32 id; char *type; - long exptime = KEXP_FOREVER; + unsigned long exptime = KEXP_FOREVER; static char *kwlist[] = { "keyfile", "id", "type", "exptime", 0 }; key *k; int err; - if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!O&sl:new", kwlist, + if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!O&s|O&:new", kwlist, keyfile_pytype, &kfobj, convu32, &id, - &type, &exptime)) + &type, convulong, &exptime)) goto end; - if ((err = key_new(KEYFILE_KF(kfobj), id, type, exptime, &k)) == 0) + if ((err = key_new(KEYFILE_KF(kfobj), id, type, exptime, &k)) != 0) KEYERR(err); return (key_dowrap(ty, kfobj, k)); end: