X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/catacomb-python/blobdiff_plain/5fbb60b8e0693d856f5197f3531c0c101de98234..d1c45f5c79fda35ff9f8fd7d90f345dba3de4eb8:/key.c?ds=sidebyside diff --git a/key.c b/key.c index 19a5792..2af0019 100644 --- a/key.c +++ b/key.c @@ -1,6 +1,4 @@ /* -*-c-*- - * - * $Id$ * * Key files and data * @@ -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 @@ -1371,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: