if (PyObject_SetAttrString(me, "err", x)) goto end;
Py_DECREF(x); x = 0;
- x = PyString_FromString(key_strerror(err)); if (!x) goto end;
+ x = TEXT_FROMSTR(key_strerror(err)); if (!x) goto end;
if (PyObject_SetAttrString(me, "errstring", x)) goto end;
Py_DECREF(x); x = 0;
if (err >= 0 && err < N(tab)) errtag = tab[err];
else errtag = "<unknown>";
if ((x = PyObject_GetAttrString(me, "errstring")) == 0 ||
- (errstr = PyString_AsString(x)) == 0)
+ (errstr = TEXT_STR(x)) == 0)
goto done;
- rc = PyString_FromFormat("%s (%ld): %s", errtag, -err, errstr);
+ rc = TEXT_FORMAT("%s (%ld): %s", errtag, -err, errstr);
done:
Py_XDECREF(x);
int err;
int rc = 0;
- if ((fs = PyString_AsString(x)) != 0) {
+ if ((fs = TEXT_STR(x)) != 0) {
if ((err = key_readflags(fs, &end, &f->f, &f->m)) != 0)
KEYERR(err);
if (*end)
return (1);
else {
PyErr_Clear();
- if ((fs = PyString_AsString(x)) != 0) {
+ if ((fs = TEXT_STR(x)) != 0) {
if ((err = key_readflags(fs, &end, f, 0)) != 0)
KEYERR(err);
if (*end)
if (!PyArg_ParseTuple(arg, "O&:key_writeflags", convuint, &f)) return (0);
key_writeflags(f, &d);
- rc = PyString_FromStringAndSize(d.buf, d.len);
+ rc = TEXT_FROMSTRLEN(d.buf, d.len);
dstr_destroy(&d);
return (rc);
}
convfilter, &f))
return (0);
key_write(KEYDATA_KD(me), &d, &f);
- rc = PyString_FromStringAndSize(d.buf, d.len);
+ rc = TEXT_FROMSTRLEN(d.buf, d.len);
dstr_destroy(&d);
return (rc);
}
static PyObject *kdmeth_lock(PyObject *me, PyObject *arg)
{
- char *p;
- Py_ssize_t n;
+ struct bin pp;
PyObject *rc = 0;
key_data *kd;
- if (!PyArg_ParseTuple(arg, "s#:lock", &p, &n))
+ if (!PyArg_ParseTuple(arg, "O&:lock", convbin, &pp))
goto end;
- key_lock(&kd, KEYDATA_KD(me), p, n);
+ key_lock(&kd, KEYDATA_KD(me), pp.p, pp.sz);
rc = keydata_pywrap(kd);
end:
return (rc);
static PyObject *kdmeth_decode(PyObject *me, PyObject *arg)
{
- const char *p;
- Py_ssize_t n;
+ struct bin in;
key_data *kd;
PyObject *rc = 0;
- if (!PyArg_ParseTuple(arg, "s#:decode", &p, &n)) goto end;
- if ((kd = key_decode(p, n)) == 0) KEYERR(KERR_MALFORMED);
- rc = keydata_pywrap(kd);
+ if (!PyArg_ParseTuple(arg, "O&:decode", convbin, &in)) goto end;
+ if ((kd = key_decode(in.p, in.sz)) == 0) KEYERR(KERR_MALFORMED);
+ rc = keydata_pywrap(kd);
end:
return (rc);
}
};
static const PyTypeObject keydata_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"KeyData", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyObject *keydatabin_pynew(PyTypeObject *ty,
PyObject *arg, PyObject *kw)
{
- char *p;
- Py_ssize_t n;
+ struct bin in;
unsigned f = 0;
keydata_pyobj *me = 0;
static const char *const kwlist[] = { "key", "flags", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#|O&:new", KWLIST,
- &p, &n, convflags, &f))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&:new", KWLIST,
+ convbin, &in, convflags, &f))
goto end;
me = (keydata_pyobj *)ty->tp_alloc(ty, 0);
- me->kd = key_newbinary(f & ~KF_ENCMASK, p, n);
+ me->kd = key_newbinary(f & ~KF_ENCMASK, in.p, in.sz);
end:
return ((PyObject *)me);
}
};
static const PyTypeObject keydatabin_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"KeyDataBinary", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static PyObject *keydataenc_pynew(PyTypeObject *ty,
PyObject *arg, PyObject *kw)
{
- char *p;
- Py_ssize_t n;
+ struct bin in;
unsigned f = 0;
keydata_pyobj *me = 0;
static const char *const kwlist[] = { "key", "flags", 0 };
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#|O&:new", KWLIST,
- &p, &n, convflags, &f))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&:new", KWLIST,
+ convbin, &in, convflags, &f))
goto end;
me = (keydata_pyobj *)ty->tp_alloc(ty, 0);
- me->kd = key_newencrypted(f & ~KF_ENCMASK, p, n);
+ me->kd = key_newencrypted(f & ~KF_ENCMASK, in.p, in.sz);
end:
return ((PyObject *)me);
}
static PyObject *kdemeth_lock(PyObject *me, PyObject *arg)
{
- char *hunoz;
- Py_ssize_t hukairz;
- if (!PyArg_ParseTuple(arg, "s#:lock", &hunoz, &hukairz)) goto end;
+ struct bin hunoz;
+ if (!PyArg_ParseTuple(arg, "O&:lock", convbin, &hunoz)) goto end;
KEYERR(KERR_WRONGTYPE);
end:
return (0);
static PyObject *kdemeth_unlock(PyObject *me, PyObject *arg)
{
- char *p;
- Py_ssize_t n;
+ struct bin pp;
int err;
PyObject *rc = 0;
key_data *kd;
- if (!PyArg_ParseTuple(arg, "s#:unlock", &p, &n))
+ if (!PyArg_ParseTuple(arg, "O&:unlock", convbin, &pp))
goto end;
- if ((err = key_unlock(&kd, KEYDATA_KD(me), p, n)) != 0)
+ if ((err = key_unlock(&kd, KEYDATA_KD(me), pp.p, pp.sz)) != 0)
KEYERR(err);
rc = keydata_pywrap(kd);
end:
};
static const PyTypeObject keydataenc_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"KeyDataEncrypted", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
};
static const PyTypeObject keydatamp_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"KeyDataMP", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
}
static PyObject *kdsget_str(PyObject *me, void *hunoz)
- { return (PyString_FromString(KEYDATA_KD(me)->u.p)); }
+ { return (TEXT_FROMSTR(KEYDATA_KD(me)->u.p)); }
static const PyGetSetDef keydatastr_pygetset[] = {
#define GETSETNAME(op, name) kds##op##_##name
};
static const PyTypeObject keydatastr_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"KeyDataString", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
};
static const PyTypeObject keydataec_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"KeyDataECPt", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
key_struct *ks;
assert((kd->e&KF_ENCMASK) == KENC_STRUCT);
- if ((tag = PyString_AsString(k)) == 0) return (0);
+ if ((tag = TEXT_STR(k)) == 0) return (0);
if (f) { key_split(&kd); KEYDATA_KD(me) = kd; }
ks = sym_find(&kd->u.s, tag, -1, f ? sizeof(key_struct) : 0, f);
if (ks && f && !*f) ks->k = 0;
{ return (sym_next(i)); }
static PyObject *keydatastruct_gmentrykey(PyObject *me, void *e)
- { key_struct *ks = e; return (PyString_FromString(SYM_NAME(ks))); }
+ { key_struct *ks = e; return (TEXT_FROMSTR(SYM_NAME(ks))); }
static PyObject *keydatastruct_gmentryvalue(PyObject *me, void *e)
{
keydatastruct_gmdelentry
};
+static int populate_struct(key_data *kd, PyObject *map)
+{
+ PyObject *it = 0, *name = 0, *val = 0;
+ const char *p;
+ int rc = -1;
+
+ if (!PyMapping_Check(map)) TYERR("subkeys must be an iterable mapping");
+ if ((it = PyObject_GetIter(map)) == 0) goto end;
+ while ((name = PyIter_Next(it)) != 0) {
+ if ((p = TEXT_STR(name)) == 0 ||
+ (val = PyObject_GetItem(map, name)) == 0)
+ goto end;
+ if (!KEYDATA_PYCHECK(val))
+ TYERR("subkey objects must be instances of KeyData");
+ if (key_structfind(kd, p)) VALERR("duplicate tag");
+ key_structset(kd, p, KEYDATA_KD(val));
+ Py_DECREF(name); name = 0;
+ Py_DECREF(val); val = 0;
+ }
+ if (PyErr_Occurred()) goto end;
+ rc = 0;
+end:
+ Py_XDECREF(it); Py_XDECREF(name); Py_XDECREF(val);
+ return (rc);
+}
+
static PyObject *keydatastruct_pynew(PyTypeObject *ty,
PyObject *arg, PyObject *kw)
{
PyObject *sub = 0;
- PyObject *it = 0, *name = 0, *val = 0;
- char *p;
keydata_pyobj *me = 0;
key_data *kd = 0;
- static const char *const kwlist[] = { "subkeys", 0 };
- Py_XINCREF(arg); Py_XINCREF(kw);
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O:new", KWLIST, &sub))
- goto end;
+ if (!PyArg_ParseTuple(arg, "|O:new", &sub)) goto end;
kd = key_newstruct();
- if (sub) {
- if (!PyMapping_Check(sub))
- TYERR("subkeys must be an iterable mapping");
- if ((it = PyObject_GetIter(sub)) == 0)
- goto end;
- while ((name = PyIter_Next(it)) != 0) {
- if ((p = PyString_AsString(name)) == 0 ||
- (val = PyObject_GetItem(sub, name)) == 0)
- goto end;
- if (!KEYDATA_PYCHECK(val))
- TYERR("subkey objects must be subclasses of KeyData");
- key_structset(kd, p, KEYDATA_KD(val));
- Py_DECREF(name); name = 0;
- Py_DECREF(val); val = 0;
- }
- if (PyErr_Occurred())
- goto end;
- Py_DECREF(it); it = 0;
- }
+ if (sub && populate_struct(kd, sub)) goto end;
+ if (kw && populate_struct(kd, kw)) goto end;
me = (keydata_pyobj *)ty->tp_alloc(ty, 0);
me->gmops = &keydatastruct_gmops;
- me->kd = kd;
+ me->kd = kd; kd = 0;
end:
- if (kd && !me) key_drop(kd);
- Py_XDECREF(name); Py_XDECREF(val); Py_XDECREF(it);
- Py_XDECREF(arg); Py_XDECREF(kw);
+ if (kd) key_drop(kd);
return ((PyObject *)me);
}
};
static const PyTypeObject keydatastruct_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"KeyDataStructured", /* @tp_name@ */
sizeof(keydata_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
static void *keyattrs_gmlookup(PyObject *me, PyObject *k, unsigned *f)
{
- char *name = PyString_AsString(k);
+ char *name = TEXT_STR(k);
key_attr *a = 0;
if (!name) goto end;
{ return (sym_next(i)); }
static PyObject *keyattrs_gmentrykey(PyObject *me, void *e)
- { return (PyString_FromString(SYM_NAME(e))); }
+ { return (TEXT_FROMSTR(SYM_NAME(e))); }
static PyObject *keyattrs_gmentryvalue(PyObject *me, void *e)
- { return (PyString_FromString(((key_attr *)e)->p)); }
+ { return (TEXT_FROMSTR(((key_attr *)e)->p)); }
static int keyattrs_gmsetentry(PyObject *me, void *e, PyObject *val)
{
Py_ssize_t n;
int rc = -1;
- if (!PyString_Check(val)) TYERR("expected string");
- p = PyString_AS_STRING(val); n = PyString_GET_SIZE(val);
+ if (!TEXT_CHECK(val)) TYERR("expected string");
+ TEXT_PTRLEN(val, p, n);
if (n > 255) VALERR("attribute too long");
if (memchr(p, 0, n)) VALERR("attribute must not contain nul");
if (a->p) xfree(a->p);
};
static const PyTypeObject keyattrs_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"KeyAttributes", /* @tp_name@ */
sizeof(keyattrs_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
FREEOBJ(me);
}
+static Py_hash_t key_pyhash(PyObject *me)
+ { return ((Py_hash_t)KEY_K(me)); }
+
+static PyObject *key_pyrichcompare(PyObject *me, PyObject *you, int op)
+{
+ if (!KEY_PYCHECK(you)) RETURN_NOTIMPL;
+ switch (op) {
+ case Py_EQ: return (getbool(KEY_K(me) == KEY_K(you)));
+ case Py_NE: return (getbool(KEY_K(me) == KEY_K(you)));
+ default: TYERR("ordering makes no sense");
+ }
+end:
+ return (0);
+}
+
static PyObject *kmeth_delete(PyObject *me)
{
int err;
return (0);
}
-static PyObject *kmeth_extract(PyObject *me, PyObject *arg, PyObject *kw)
+static PyObject *kmeth_extractline(PyObject *me, PyObject *arg, PyObject *kw)
{
key_filter f = { 0, 0 };
- PyObject *file;
- PyObject *nameobj;
- char *name;
- FILE *fp;
- static const char *const kwlist[] = { "file", "filter", 0 };
-
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!|O&:extract", KWLIST,
- &PyFile_Type, &file,
- convfilter, &f) ||
- (fp = PyFile_AsFile(file)) == 0 ||
- (nameobj = PyFile_Name(file)) == 0 ||
- (name = PyString_AsString(nameobj)) == 0)
+ dstr d = DSTR_INIT;
+ PyObject *rc = 0;
+ static const char *const kwlist[] = { "filter", 0 };
+
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "|O&:extract", KWLIST,
+ convfilter, &f))
goto end;
- if (key_extract(KEY_KF(me), KEY_K(me), fp, &f))
- OSERR(name);
- RETURN_ME;
+ key_extractline(KEY_KF(me), KEY_K(me), &d, &f);
+ rc = TEXT_FROMSTRLEN(d.buf, d.len);
end:
- return (0);
+ dstr_destroy(&d);
+ return (rc);
}
static PyObject *kmeth_fingerprint(PyObject *me,
static PyObject *kget_file(PyObject *me, void *hunoz)
{ RETURN_OBJ(KEY_KFOBJ(me)); }
static PyObject *kget_type(PyObject *me, void *hunoz)
- { return (PyString_FromString(KEY_K(me)->type)); }
+ { return (TEXT_FROMSTR(KEY_K(me)->type)); }
static PyObject *kget_exptime(PyObject *me, void *hunoz)
{ return (getulong(KEY_K(me)->exp)); }
static PyObject *kget_deltime(PyObject *me, void *hunoz)
PyObject *rc;
key_fulltag(KEY_K(me), &d);
- rc = PyString_FromStringAndSize(d.buf, d.len);
+ rc = TEXT_FROMSTRLEN(d.buf, d.len);
dstr_destroy(&d);
return (rc);
}
static PyObject *kget_tag(PyObject *me, void *hunoz)
{
if (!KEY_K(me)->tag) RETURN_NONE;
- return (PyString_FromString(KEY_K(me)->tag));
+ return (TEXT_FROMSTR(KEY_K(me)->tag));
}
static int kset_tag(PyObject *me, PyObject *x, void *hunoz)
{
char *tag;
if (!x || x == Py_None) tag = 0;
- else if ((tag = PyString_AsString(x)) == 0) goto end;
+ else if ((tag = TEXT_STR(x)) == 0) goto end;
if ((err = key_settag(KEY_KF(me), KEY_K(me), tag)) != 0) KEYERR(err);
return (0);
end:
static PyObject *kget_comment(PyObject *me, void *hunoz)
{
if (!KEY_K(me)->c) RETURN_NONE;
- return (PyString_FromString(KEY_K(me)->c));
+ return (TEXT_FROMSTR(KEY_K(me)->c));
}
static int kset_comment(PyObject *me, PyObject *x, void *hunoz)
{
char *c;
if (!x || x == Py_None) c = 0;
- else if ((c = PyString_AsString(x)) == 0) goto end;
+ else if ((c = TEXT_STR(x)) == 0) goto end;
if ((err = key_setcomment(KEY_KF(me), KEY_K(me), c)) != 0) KEYERR(err);
return (0);
end:
NAMETH(delete, "KEY.delete()")
NAMETH(expire, "KEY.expire()")
METH (used, "KEY.used(TIME)")
- KWMETH(extract, "KEY.extract(FILE, [filter = <any>])")
+ KWMETH(extractline, "KEY.extractline([filter = <any>])")
KWMETH(fingerprint, "KEY.fingerprint(HASH, [filter = '-secret'])")
#undef METHNAME
{ 0 }
};
static const PyTypeObject key_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"Key", /* @tp_name@ */
sizeof(key_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */
0, /* @tp_as_number@ */
0, /* @tp_as_sequence@ */
0, /* @tp_as_mapping@ */
- 0, /* @tp_hash@ */
+ key_pyhash, /* @tp_hash@ */
0, /* @tp_call@ */
0, /* @tp_str@ */
0, /* @tp_getattro@ */
0, /* @tp_traverse@ */
0, /* @tp_clear@ */
- 0, /* @tp_richcompare@ */
+ key_pyrichcompare, /* @tp_richcompare@ */
0, /* @tp_weaklistoffset@ */
0, /* @tp_iter@ */
0, /* @tp_iternext@ */
k = key_byid(KEYFILE_KF(me), id);
else {
PyErr_Clear();
- if ((tag = PyString_AsString(tagobj)) == 0)
+ if ((tag = TEXT_STR(tagobj)) == 0)
goto end;
k = key_bytag(KEYFILE_KF(me), tag);
}
if (ri->stop)
return;
- if (!ri->func)
+ if (ri->func == Py_None)
key_moan(file, line, msg, 0);
else if ((res = PyObject_CallFunction(ri->func, "sis",
file, line, msg)) == 0)
static PyObject *keyfile_pynew(PyTypeObject *ty,
PyObject *arg, PyObject *kw)
{
- struct reportinfo ri = { 0, 0 };
+ struct reportinfo ri = { Py_None, 0 };
char *file = 0;
unsigned how = KOPEN_READ;
keyfile_pyobj *rc = 0;
static const char *const kwlist[] = { "file", "how", "report", 0 };
- Py_XINCREF(arg); Py_XINCREF(kw);
if (!PyArg_ParseTupleAndKeywords(arg, kw, "s|iO:new", KWLIST,
&file, &how, &ri.func))
goto end;
- if (ri.func && !PyCallable_Check(ri.func))
+ if (ri.func != Py_None && !PyCallable_Check(ri.func))
TYERR("reporter function not callable");
if ((rc = (keyfile_pyobj *)ty->tp_alloc(ty, 0)) == 0)
goto end;
rc = 0;
}
done:
- Py_XDECREF(arg); Py_XDECREF(kw);
return ((PyObject *)rc);
}
return (0);
}
-static PyObject *kfmeth_merge(PyObject *me, PyObject *arg, PyObject *kw)
+static PyObject *kfmeth_mergeline(PyObject *me, PyObject *arg, PyObject *kw)
{
- struct reportinfo ri = { 0, 0 };
- char *name;
- PyObject *x = 0;
- FILE *fp = 0;
- int rc;
- static const char *const kwlist[] = { "file", "report", 0 };
+ struct reportinfo ri = { Py_None, 0 };
+ const char *file, *line;
+ int lno, rc;
+ static const char *const kwlist[] = { "name", "lno", "line", "report", 0 };
- Py_XINCREF(arg); Py_XINCREF(kw);
- if (!PyArg_ParseTupleAndKeywords(arg, kw, "O!|O:merge", KWLIST,
- &PyFile_Type, &x, &ri.func))
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "sis|O:merge", KWLIST,
+ &file, &lno, &line, &ri.func))
goto end;
- if (ri.func && !PyCallable_Check(ri.func))
+ if (ri.func != Py_None && !PyCallable_Check(ri.func))
TYERR("reporter function not callable");
- if ((fp = PyFile_AsFile(x)) == 0)
- goto end;
- x = PyFile_Name(x);
- if ((name = PyString_AsString(x)) == 0)
- goto end;
- rc = key_merge(KEYFILE_KF(me), name, fp, pythonreporter, &ri);
+ rc = key_mergeline(KEYFILE_KF(me), file, lno, line, pythonreporter, &ri);
if (ri.stop)
goto end;
if (rc != 0)
KEYERR(rc);
- Py_XDECREF(arg); Py_XDECREF(kw);
RETURN_ME;
end:
- Py_XDECREF(arg); Py_XDECREF(kw);
return (0);
}
}
static PyObject *kfget_name(PyObject *me, void *hunoz)
- { return (PyString_FromString(KEYFILE_KF(me)->name)); }
+ { return (TEXT_FROMSTR(KEYFILE_KF(me)->name)); }
static PyObject *kfget_modifiedp(PyObject *me, void *hunoz)
{ return (getbool(KEYFILE_KF(me)->f & KF_MODIFIED)); }
static PyObject *kfget_writep(PyObject *me, void *hunoz)
static const PyMethodDef keyfile_pymethods[] = {
#define METHNAME(func) kfmeth_##func
NAMETH(save, "KF.save()")
- KWMETH(merge, "KF.merge(FILE, [report = <built-in-reporter>])")
+ KWMETH(mergeline, "KF.mergeline(NAME, LNO, LINE, "
+ "[report = <built-in-reporter>])")
KWMETH(newkey, "KF.newkey(ID, TYPE, [exptime = KEXP_FOREVER]) "
"-> KEY")
METH (byid, "KF.byid(KEYID) -> KEY|None")
};
static const PyTypeObject keyfile_pytype_skel = {
- PyObject_HEAD_INIT(0) 0, /* Header */
+ PyVarObject_HEAD_INIT(0, 0) /* Header */
"KeyFile", /* @tp_name@ */
sizeof(keyfile_pyobj), /* @tp_basicsize@ */
0, /* @tp_itemsize@ */