1 #include "rpmsystem-py.h"
3 #include <rpm/rpmtypes.h>
4 #include <rpm/rpmpgp.h>
8 #include "rpmstrpool-py.h"
10 struct rpmfiObject_s {
12 PyObject *md_dict; /*!< to look like PyModuleObject */
18 rpmfi_FC(rpmfiObject * s, PyObject * unused)
20 return Py_BuildValue("i", rpmfiFC(s->fi));
24 rpmfi_FX(rpmfiObject * s, PyObject * unused)
26 return Py_BuildValue("i", rpmfiFX(s->fi));
30 rpmfi_DC(rpmfiObject * s, PyObject * unused)
32 return Py_BuildValue("i", rpmfiDC(s->fi));
36 rpmfi_DX(rpmfiObject * s, PyObject * unused)
38 return Py_BuildValue("i", rpmfiDX(s->fi));
42 rpmfi_BN(rpmfiObject * s, PyObject * unused)
44 return utf8FromString(rpmfiBN(s->fi));
48 rpmfi_DN(rpmfiObject * s, PyObject * unused)
50 return utf8FromString(rpmfiDN(s->fi));
54 rpmfi_FN(rpmfiObject * s, PyObject * unused)
56 return utf8FromString(rpmfiFN(s->fi));
60 rpmfi_FindFN(rpmfiObject * s, PyObject * args, PyObject * kwds)
62 char * kwlist[] = {"filename", NULL};
63 PyObject * filename = NULL;
64 if (!PyArg_ParseTupleAndKeywords(args, kwds, "S:FindFN", kwlist,
67 return Py_BuildValue("i", rpmfiFindFN(s->fi, PyBytes_AsString(filename)));
72 rpmfi_FFlags(rpmfiObject * s, PyObject * unused)
74 return Py_BuildValue("i", rpmfiFFlags(s->fi));
78 rpmfi_VFlags(rpmfiObject * s, PyObject * unused)
80 return Py_BuildValue("i", rpmfiVFlags(s->fi));
84 rpmfi_FMode(rpmfiObject * s, PyObject * unused)
86 return Py_BuildValue("i", rpmfiFMode(s->fi));
90 rpmfi_FState(rpmfiObject * s, PyObject * unused)
92 return Py_BuildValue("i", rpmfiFState(s->fi));
95 /* XXX rpmfiFDigest */
97 rpmfi_Digest(rpmfiObject * s, PyObject * unused)
99 char *digest = rpmfiFDigestHex(s->fi, NULL);
101 PyObject *dig = utf8FromString(digest);
110 rpmfi_FLink(rpmfiObject * s, PyObject * unused)
112 return utf8FromString(rpmfiFLink(s->fi));
116 rpmfi_FSize(rpmfiObject * s, PyObject * unused)
118 return Py_BuildValue("L", rpmfiFSize(s->fi));
122 rpmfi_FRdev(rpmfiObject * s, PyObject * unused)
124 return Py_BuildValue("i", rpmfiFRdev(s->fi));
128 rpmfi_FMtime(rpmfiObject * s, PyObject * unused)
130 return Py_BuildValue("i", rpmfiFMtime(s->fi));
134 rpmfi_FUser(rpmfiObject * s, PyObject * unused)
136 return utf8FromString(rpmfiFUser(s->fi));
140 rpmfi_FGroup(rpmfiObject * s, PyObject * unused)
142 return utf8FromString(rpmfiFGroup(s->fi));
146 rpmfi_FColor(rpmfiObject * s, PyObject * unused)
148 return Py_BuildValue("i", rpmfiFColor(s->fi));
152 rpmfi_FClass(rpmfiObject * s, PyObject * unused)
156 if ((FClass = rpmfiFClass(s->fi)) == NULL)
158 return utf8FromString(FClass);
162 rpmfi_FLinks(rpmfiObject * s, PyObject * unused)
168 nlinks = rpmfiFLinks(s->fi, &files);
170 return Py_BuildValue("(i)", rpmfiFX(s->fi));
173 result = PyTuple_New(nlinks);
174 for (uint32_t i=0; i<nlinks; i++) {
175 PyTuple_SET_ITEM(result, i, PyInt_FromLong(files[i]));
181 rpmfi_iternext(rpmfiObject * s)
183 PyObject * result = NULL;
185 /* Reset loop indices on 1st entry. */
187 s->fi = rpmfiInit(s->fi, 0);
191 /* If more to do, return the file tuple. */
192 if (rpmfiNext(s->fi) >= 0) {
193 const char * FN = rpmfiFN(s->fi);
194 rpm_loff_t FSize = rpmfiFSize(s->fi);
195 int FMode = rpmfiFMode(s->fi);
196 int FMtime = rpmfiFMtime(s->fi);
197 int FFlags = rpmfiFFlags(s->fi);
198 int FRdev = rpmfiFRdev(s->fi);
199 int FInode = rpmfiFInode(s->fi);
200 int FNlink = rpmfiFNlink(s->fi);
201 int FState = rpmfiFState(s->fi);
202 int VFlags = rpmfiVFlags(s->fi);
203 const char * FUser = rpmfiFUser(s->fi);
204 const char * FGroup = rpmfiFGroup(s->fi);
206 result = PyTuple_New(13);
209 PyTuple_SET_ITEM(result, 0, Py_None);
211 PyTuple_SET_ITEM(result, 0, utf8FromString(FN));
212 PyTuple_SET_ITEM(result, 1, PyLong_FromLongLong(FSize));
213 PyTuple_SET_ITEM(result, 2, PyInt_FromLong(FMode));
214 PyTuple_SET_ITEM(result, 3, PyInt_FromLong(FMtime));
215 PyTuple_SET_ITEM(result, 4, PyInt_FromLong(FFlags));
216 PyTuple_SET_ITEM(result, 5, PyInt_FromLong(FRdev));
217 PyTuple_SET_ITEM(result, 6, PyInt_FromLong(FInode));
218 PyTuple_SET_ITEM(result, 7, PyInt_FromLong(FNlink));
219 PyTuple_SET_ITEM(result, 8, PyInt_FromLong(FState));
220 PyTuple_SET_ITEM(result, 9, PyInt_FromLong(VFlags));
223 PyTuple_SET_ITEM(result, 10, Py_None);
225 PyTuple_SET_ITEM(result, 10, utf8FromString(FUser));
226 if (FGroup == NULL) {
228 PyTuple_SET_ITEM(result, 11, Py_None);
230 PyTuple_SET_ITEM(result, 11, utf8FromString(FGroup));
231 PyTuple_SET_ITEM(result, 12, rpmfi_Digest(s, NULL));
239 static struct PyMethodDef rpmfi_methods[] = {
240 {"FC", (PyCFunction)rpmfi_FC, METH_NOARGS,
241 "fi.FC() -- Return number of files entries."},
242 {"FX", (PyCFunction)rpmfi_FX, METH_NOARGS,
243 "fi.FX() -- Return current position of the iterator."},
244 {"DC", (PyCFunction)rpmfi_DC, METH_NOARGS,
245 "fi.DC() --Return number of directory entries."},
246 {"DX", (PyCFunction)rpmfi_DX, METH_NOARGS,
247 "fi.DX() -- Return number of directory entry matching current file."},
248 {"BN", (PyCFunction)rpmfi_BN, METH_NOARGS,
249 "fi.BN() -- Return base name of current file."},
250 {"DN", (PyCFunction)rpmfi_DN, METH_NOARGS,
251 "fi.DN() -- Return directory name of the current file."},
252 {"FN", (PyCFunction)rpmfi_FN, METH_NOARGS,
253 "fi.FN() -- Return the name/path of the current file."},
254 {"FindFN", (PyCFunction)rpmfi_FindFN, METH_VARARGS|METH_KEYWORDS,
255 "fi.FindFN(pathname) -- Return entry number of given pathname.\n\nReturn -1 if file is not found.\nLeading '.' in the given name is stripped before the search."},
256 {"FFlags", (PyCFunction)rpmfi_FFlags, METH_NOARGS,
257 "fi.FFlags() -- Return the flags of the current file."},
258 {"VFlags", (PyCFunction)rpmfi_VFlags, METH_NOARGS,
259 "fi.VFlags() -- Return the verify flags of the current file.\n\nSee RPMVERIFY_* (in rpmvf.h)"},
260 {"FMode", (PyCFunction)rpmfi_FMode, METH_NOARGS,
261 "fi.FMode() -- Return the mode flags of the current file."},
262 {"FState", (PyCFunction)rpmfi_FState, METH_NOARGS,
263 "fi.FState() -- Return the file state of the current file."},
264 {"MD5", (PyCFunction)rpmfi_Digest, METH_NOARGS,
265 "fi.() -- Return the checksum of the current file.\n\nDEPRECATED! Use fi.Digest instead!"},
266 {"Digest", (PyCFunction)rpmfi_Digest, METH_NOARGS,
267 "fi.() -- Return the checksum of the current file."},
268 {"FLink", (PyCFunction)rpmfi_FLink, METH_NOARGS,
269 "fi.() -- Return the link target of the current file.\n\nFor soft links only."},
270 {"FSize", (PyCFunction)rpmfi_FSize, METH_NOARGS,
271 "fi.() -- Return the size of the current file."},
272 {"FRdev", (PyCFunction)rpmfi_FRdev, METH_NOARGS,
273 "fi.() -- Return the device number of the current file.\n\nFor device files only."},
274 {"FMtime", (PyCFunction)rpmfi_FMtime, METH_NOARGS,
275 "fi.() -- Return the modification time of the current file."},
276 {"FUser", (PyCFunction)rpmfi_FUser, METH_NOARGS,
277 "fi.() -- Return the user name owning the current file."},
278 {"FGroup", (PyCFunction)rpmfi_FGroup, METH_NOARGS,
279 "fi.() -- Return the group name of the current file."},
280 {"FColor", (PyCFunction)rpmfi_FColor, METH_NOARGS,
281 "fi.() -- Return the color of the current file.\n\n2 for 64 bit binaries\n1 for 32 bit binaries\n0 for everything else"},
282 {"FClass", (PyCFunction)rpmfi_FClass, METH_NOARGS,
283 "fi.() -- Return the classification of the current file."},
284 {"FLinks", (PyCFunction)rpmfi_FLinks, METH_NOARGS,
285 "fi.() -- Return the number of hardlinks pointing to of the\ncurrent file."},
286 {NULL, NULL} /* sentinel */
292 rpmfi_dealloc(rpmfiObject * s)
294 s->fi = rpmfiFree(s->fi);
295 Py_TYPE(s)->tp_free((PyObject *)s);
299 rpmfi_length(rpmfiObject * s)
301 return rpmfiFC(s->fi);
305 rpmfi_subscript(rpmfiObject * s, PyObject * key)
309 if (!PyInt_Check(key)) {
310 PyErr_SetString(PyExc_TypeError, "integer expected");
314 ix = (int) PyInt_AsLong(key);
315 rpmfiSetFX(s->fi, ix);
316 return utf8FromString(rpmfiFN(s->fi));
319 static PyMappingMethods rpmfi_as_mapping = {
320 (lenfunc) rpmfi_length, /* mp_length */
321 (binaryfunc) rpmfi_subscript, /* mp_subscript */
322 (objobjargproc)0, /* mp_ass_subscript */
325 static int rpmfi_init(rpmfiObject * s, PyObject *args, PyObject *kwds)
331 static PyObject * rpmfi_new(PyTypeObject * subtype, PyObject *args, PyObject *kwds)
333 PyObject * to = NULL;
336 rpmTagVal tagN = RPMTAG_BASENAMES;
338 rpmstrPool pool = NULL;
339 char * kwlist[] = {"header", "tag", "flags", "pool", NULL};
341 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|OiO&:rpmfi_init", kwlist,
342 hdrFromPyObject, &h, &to, &flags,
343 poolFromPyObject, &pool))
346 fi = rpmfiNewPool(pool, h, tagN, flags);
349 PyErr_SetString(PyExc_ValueError, "invalid file data in header");
353 return rpmfi_Wrap(subtype, fi);
356 static char rpmfi_doc[] =
358 "DEPRECATED! This old API mixes storing and iterating over the meta data\n"
359 "of the files of a package. Use rpm.files and rpm.file data types as a\n"
360 "much cleaner API.\n\n"
361 "Iteration returns a tuple of\n(FN, FSize, FMode, FMtime, FFlags, FRdev, FInode, FNlink, FState,\n VFlags, FUser, FGroup, Digest)";
363 PyTypeObject rpmfi_Type = {
364 PyVarObject_HEAD_INIT(&PyType_Type, 0)
365 "rpm.fi", /* tp_name */
366 sizeof(rpmfiObject), /* tp_basicsize */
369 (destructor) rpmfi_dealloc, /* tp_dealloc */
371 (getattrfunc)0, /* tp_getattr */
372 (setattrfunc)0, /* tp_setattr */
374 (reprfunc)0, /* tp_repr */
375 0, /* tp_as_number */
376 0, /* tp_as_sequence */
377 &rpmfi_as_mapping, /* tp_as_mapping */
378 (hashfunc)0, /* tp_hash */
379 (ternaryfunc)0, /* tp_call */
380 (reprfunc)0, /* tp_str */
381 PyObject_GenericGetAttr, /* tp_getattro */
382 PyObject_GenericSetAttr, /* tp_setattro */
383 0, /* tp_as_buffer */
384 Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
385 rpmfi_doc, /* tp_doc */
388 0, /* tp_richcompare */
389 0, /* tp_weaklistoffset */
390 PyObject_SelfIter, /* tp_iter */
391 (iternextfunc) rpmfi_iternext, /* tp_iternext */
392 rpmfi_methods, /* tp_methods */
397 0, /* tp_descr_get */
398 0, /* tp_descr_set */
399 0, /* tp_dictoffset */
400 (initproc) rpmfi_init, /* tp_init */
402 (newfunc) rpmfi_new, /* tp_new */
409 rpmfi fiFromFi(rpmfiObject * s)
414 PyObject * rpmfi_Wrap(PyTypeObject *subtype, rpmfi fi)
416 rpmfiObject *s = (rpmfiObject *)subtype->tp_alloc(subtype, 0);
417 if (s == NULL) return NULL;
421 return (PyObject *) s;