2 * \file python/rpmmodule.c
7 #include <rpm/rpmlib.h> /* rpmMachineScore, rpmReadConfigFiles */
8 #include <rpm/rpmtag.h>
10 #include <rpm/rpmsq.h>
11 #include <rpm/rpmlog.h>
13 #include "header-py.h"
19 #include "rpmmacro-py.h"
32 PyObject * pyrpmError;
36 static PyObject * archScore(PyObject * self, PyObject * args, PyObject * kwds)
40 char * kwlist[] = {"arch", NULL};
42 if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &arch))
45 score = rpmMachineScore(RPM_MACHTABLE_INSTARCH, arch);
47 return Py_BuildValue("i", score);
52 static PyObject * signalsCaught(PyObject * self, PyObject * check)
57 sigset_t newMask, oldMask;
59 if (!PyList_Check(check)) {
60 PyErr_SetString(PyExc_TypeError, "list expected");
64 llen = PyList_Size(check);
65 caught = PyList_New(0);
67 /* block signals while checking for them */
68 (void) sigfillset(&newMask);
69 (void) sigprocmask(SIG_BLOCK, &newMask, &oldMask);
71 for (i = 0; i < llen; i++) {
72 o = PyList_GetItem(check, i);
73 signum = PyInt_AsLong(o);
74 if (rpmsqIsCaught(signum) > 0) {
75 PyList_Append(caught, o);
78 (void) sigprocmask(SIG_SETMASK, &oldMask, NULL);
85 static PyObject * checkSignals(PyObject * self, PyObject * args)
87 if (!PyArg_ParseTuple(args, ":checkSignals")) return NULL;
96 static PyObject * setLogFile (PyObject * self, PyObject * args, PyObject *kwds)
98 PyObject * fop = NULL;
100 char * kwlist[] = {"fileObject", NULL};
102 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:logSetFile", kwlist, &fop))
106 if (!PyFile_Check(fop)) {
107 PyErr_SetString(pyrpmError, "requires file object");
110 fp = PyFile_AsFile(fop);
113 (void) rpmlogSetFile(fp);
116 return (PyObject *) Py_None;
122 setVerbosity (PyObject * self, PyObject * args, PyObject *kwds)
125 char * kwlist[] = {"level", NULL};
127 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &level))
130 rpmSetVerbosity(level);
133 return (PyObject *) Py_None;
139 setEpochPromote (PyObject * self, PyObject * args, PyObject * kwds)
141 char * kwlist[] = {"promote", NULL};
143 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist,
148 return (PyObject *) Py_None;
153 static PyObject * setStats (PyObject * self, PyObject * args, PyObject * kwds)
155 char * kwlist[] = {"stats", NULL};
157 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &_rpmts_stats))
161 return (PyObject *) Py_None;
166 static PyMethodDef rpmModuleMethods[] = {
167 { "TransactionSet", (PyCFunction) rpmts_Create, METH_VARARGS|METH_KEYWORDS,
168 "rpm.TransactionSet([rootDir, [db]]) -> ts\n\
169 - Create a transaction set.\n" },
171 { "addMacro", (PyCFunction) rpmmacro_AddMacro, METH_VARARGS|METH_KEYWORDS,
173 { "delMacro", (PyCFunction) rpmmacro_DelMacro, METH_VARARGS|METH_KEYWORDS,
175 { "expandMacro", (PyCFunction) rpmmacro_ExpandMacro, METH_VARARGS|METH_KEYWORDS,
178 { "archscore", (PyCFunction) archScore, METH_VARARGS|METH_KEYWORDS,
181 { "signalsCaught", (PyCFunction) signalsCaught, METH_O,
183 { "checkSignals", (PyCFunction) checkSignals, METH_VARARGS,
186 { "headerLoad", (PyCFunction) hdrLoad, METH_VARARGS|METH_KEYWORDS,
188 { "mergeHeaderListFromFD", (PyCFunction) rpmMergeHeadersFromFD, METH_VARARGS|METH_KEYWORDS,
190 { "readHeaderListFromFD", (PyCFunction) rpmHeaderFromFD, METH_VARARGS|METH_KEYWORDS,
192 { "readHeaderListFromFile", (PyCFunction) rpmHeaderFromFile, METH_VARARGS|METH_KEYWORDS,
194 { "readHeaderFromFD", (PyCFunction) rpmSingleHeaderFromFD, METH_VARARGS|METH_KEYWORDS,
197 { "setLogFile", (PyCFunction) setLogFile, METH_VARARGS|METH_KEYWORDS,
200 { "versionCompare", (PyCFunction) versionCompare, METH_VARARGS|METH_KEYWORDS,
202 { "labelCompare", (PyCFunction) labelCompare, METH_VARARGS|METH_KEYWORDS,
204 { "setVerbosity", (PyCFunction) setVerbosity, METH_VARARGS|METH_KEYWORDS,
206 { "setEpochPromote", (PyCFunction) setEpochPromote, METH_VARARGS|METH_KEYWORDS,
208 { "setStats", (PyCFunction) setStats, METH_VARARGS|METH_KEYWORDS,
211 { "dsSingle", (PyCFunction) rpmds_Single, METH_VARARGS|METH_KEYWORDS,
212 "rpm.dsSingle(TagN, N, [EVR, [Flags]] -> ds\n\
213 - Create a single element dependency set.\n" },
218 * Force clean up of open iterators and dbs on exit.
220 static void rpm_exithook(void)
222 rpmdbCheckTerminate(1);
227 static char rpm__doc__[] =
230 void init_rpm(void); /* XXX eliminate gcc warning */
235 PyObject * d, *o, *tag = NULL, *dict, *m;
237 #if Py_TPFLAGS_HAVE_ITER /* XXX backport to python-1.5.2 */
238 if (PyType_Ready(&hdr_Type) < 0) return;
239 if (PyType_Ready(&rpmds_Type) < 0) return;
240 if (PyType_Ready(&rpmfd_Type) < 0) return;
241 if (PyType_Ready(&rpmfi_Type) < 0) return;
242 if (PyType_Ready(&rpmmi_Type) < 0) return;
243 if (PyType_Ready(&rpmps_Type) < 0) return;
245 if (PyType_Ready(&rpmte_Type) < 0) return;
246 if (PyType_Ready(&rpmts_Type) < 0) return;
247 if (PyType_Ready(&spec_Type) < 0) return;
250 m = Py_InitModule3("_rpm", rpmModuleMethods, rpm__doc__);
255 * treat error to register rpm cleanup hook as fatal, tracebacks
256 * can and will leave stale locks around if we can't clean up
258 if (Py_AtExit(rpm_exithook) == -1)
261 rpmReadConfigFiles(NULL, NULL);
263 d = PyModule_GetDict(m);
266 pyrpmError = PyString_FromString("_rpm.error");
267 PyDict_SetItemString(d, "error", pyrpmError);
268 Py_DECREF(pyrpmError);
270 pyrpmError = PyErr_NewException("_rpm.error", NULL, NULL);
271 if (pyrpmError != NULL)
272 PyDict_SetItemString(d, "error", pyrpmError);
275 #if Py_TPFLAGS_HAVE_ITER /* XXX backport to python-1.5.2 */
276 Py_INCREF(&hdr_Type);
277 PyModule_AddObject(m, "hdr", (PyObject *) &hdr_Type);
279 Py_INCREF(&rpmds_Type);
280 PyModule_AddObject(m, "ds", (PyObject *) &rpmds_Type);
282 Py_INCREF(&rpmfd_Type);
283 PyModule_AddObject(m, "fd", (PyObject *) &rpmfd_Type);
285 Py_INCREF(&rpmfi_Type);
286 PyModule_AddObject(m, "fi", (PyObject *) &rpmfi_Type);
288 Py_INCREF(&rpmmi_Type);
289 PyModule_AddObject(m, "mi", (PyObject *) &rpmmi_Type);
291 Py_INCREF(&rpmps_Type);
292 PyModule_AddObject(m, "ps", (PyObject *) &rpmps_Type);
294 Py_INCREF(&rpmte_Type);
295 PyModule_AddObject(m, "te", (PyObject *) &rpmte_Type);
297 Py_INCREF(&rpmts_Type);
298 PyModule_AddObject(m, "ts", (PyObject *) &rpmts_Type);
300 Py_INCREF(&spec_Type);
301 PyModule_AddObject(m, "spec", (PyObject *) &spec_Type);
303 hdr_Type.ob_type = &PyType_Type;
304 rpmds_Type.ob_type = &PyType_Type;
305 rpmfd_Type.ob_type = &PyType_Type;
306 rpmfi_Type.ob_type = &PyType_Type;
307 rpmmi_Type.ob_type = &PyType_Type;
308 rpmps_Type.ob_type = &PyType_Type;
309 rpmte_Type.ob_type = &PyType_Type;
310 rpmts_Type.ob_type = &PyType_Type;
311 spec_Type.ob_type = &PyType_Type;
315 { const char *tname, *sname;
316 rpmtd names = rpmtdNew();
317 rpmTagGetNames(names, 1);
319 while ((tname = rpmtdNextString(names))) {
320 sname = tname + strlen("RPMTAG_");
321 tag = PyInt_FromLong(rpmTagGetValue(sname));
322 PyDict_SetItemString(d, tname, tag);
324 o = PyString_FromString(sname);
325 PyDict_SetItem(dict, tag, o);
328 rpmtdFreeData(names);
331 PyDict_SetItemString(d, "tagnames", dict);
335 #define REGISTER_ENUM(val) \
336 PyDict_SetItemString(d, #val, o=PyInt_FromLong( val )); \
339 REGISTER_ENUM(RPMTAG_NOT_FOUND);
341 REGISTER_ENUM(RPMFILE_STATE_NORMAL);
342 REGISTER_ENUM(RPMFILE_STATE_REPLACED);
343 REGISTER_ENUM(RPMFILE_STATE_NOTINSTALLED);
344 REGISTER_ENUM(RPMFILE_STATE_NETSHARED);
345 REGISTER_ENUM(RPMFILE_STATE_WRONGCOLOR);
347 REGISTER_ENUM(RPMFILE_CONFIG);
348 REGISTER_ENUM(RPMFILE_DOC);
349 REGISTER_ENUM(RPMFILE_ICON);
350 REGISTER_ENUM(RPMFILE_MISSINGOK);
351 REGISTER_ENUM(RPMFILE_NOREPLACE);
352 REGISTER_ENUM(RPMFILE_GHOST);
353 REGISTER_ENUM(RPMFILE_LICENSE);
354 REGISTER_ENUM(RPMFILE_README);
355 REGISTER_ENUM(RPMFILE_EXCLUDE);
356 REGISTER_ENUM(RPMFILE_UNPATCHED);
357 REGISTER_ENUM(RPMFILE_PUBKEY);
359 REGISTER_ENUM(RPMDEP_SENSE_REQUIRES);
360 REGISTER_ENUM(RPMDEP_SENSE_CONFLICTS);
362 REGISTER_ENUM(RPMSENSE_LESS);
363 REGISTER_ENUM(RPMSENSE_GREATER);
364 REGISTER_ENUM(RPMSENSE_EQUAL);
365 REGISTER_ENUM(RPMSENSE_PREREQ);
366 REGISTER_ENUM(RPMSENSE_INTERP);
367 REGISTER_ENUM(RPMSENSE_SCRIPT_PRE);
368 REGISTER_ENUM(RPMSENSE_SCRIPT_POST);
369 REGISTER_ENUM(RPMSENSE_SCRIPT_PREUN);
370 REGISTER_ENUM(RPMSENSE_SCRIPT_POSTUN);
371 REGISTER_ENUM(RPMSENSE_SCRIPT_VERIFY);
372 REGISTER_ENUM(RPMSENSE_FIND_REQUIRES);
373 REGISTER_ENUM(RPMSENSE_FIND_PROVIDES);
374 REGISTER_ENUM(RPMSENSE_TRIGGERIN);
375 REGISTER_ENUM(RPMSENSE_TRIGGERUN);
376 REGISTER_ENUM(RPMSENSE_TRIGGERPOSTUN);
377 REGISTER_ENUM(RPMSENSE_SCRIPT_PREP);
378 REGISTER_ENUM(RPMSENSE_SCRIPT_BUILD);
379 REGISTER_ENUM(RPMSENSE_SCRIPT_INSTALL);
380 REGISTER_ENUM(RPMSENSE_SCRIPT_CLEAN);
381 REGISTER_ENUM(RPMSENSE_RPMLIB);
382 REGISTER_ENUM(RPMSENSE_TRIGGERPREIN);
383 REGISTER_ENUM(RPMSENSE_KEYRING);
384 REGISTER_ENUM(RPMSENSE_PATCHES);
385 REGISTER_ENUM(RPMSENSE_CONFIG);
387 REGISTER_ENUM(RPMTRANS_FLAG_TEST);
388 REGISTER_ENUM(RPMTRANS_FLAG_BUILD_PROBS);
389 REGISTER_ENUM(RPMTRANS_FLAG_NOSCRIPTS);
390 REGISTER_ENUM(RPMTRANS_FLAG_JUSTDB);
391 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERS);
392 REGISTER_ENUM(RPMTRANS_FLAG_NODOCS);
393 REGISTER_ENUM(RPMTRANS_FLAG_ALLFILES);
394 REGISTER_ENUM(RPMTRANS_FLAG_KEEPOBSOLETE);
395 REGISTER_ENUM(RPMTRANS_FLAG_REPACKAGE);
396 REGISTER_ENUM(RPMTRANS_FLAG_REVERSE);
397 REGISTER_ENUM(RPMTRANS_FLAG_NOPRE);
398 REGISTER_ENUM(RPMTRANS_FLAG_NOPOST);
399 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPREIN);
400 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERIN);
401 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERUN);
402 REGISTER_ENUM(RPMTRANS_FLAG_NOPREUN);
403 REGISTER_ENUM(RPMTRANS_FLAG_NOPOSTUN);
404 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPOSTUN);
405 REGISTER_ENUM(RPMTRANS_FLAG_NOMD5);
406 REGISTER_ENUM(RPMTRANS_FLAG_NOFILEDIGEST);
407 REGISTER_ENUM(RPMTRANS_FLAG_NOSUGGEST);
408 REGISTER_ENUM(RPMTRANS_FLAG_ADDINDEPS);
409 REGISTER_ENUM(RPMTRANS_FLAG_NOCONFIGS);
411 REGISTER_ENUM(RPMPROB_FILTER_IGNOREOS);
412 REGISTER_ENUM(RPMPROB_FILTER_IGNOREARCH);
413 REGISTER_ENUM(RPMPROB_FILTER_REPLACEPKG);
414 REGISTER_ENUM(RPMPROB_FILTER_FORCERELOCATE);
415 REGISTER_ENUM(RPMPROB_FILTER_REPLACENEWFILES);
416 REGISTER_ENUM(RPMPROB_FILTER_REPLACEOLDFILES);
417 REGISTER_ENUM(RPMPROB_FILTER_OLDPACKAGE);
418 REGISTER_ENUM(RPMPROB_FILTER_DISKSPACE);
419 REGISTER_ENUM(RPMPROB_FILTER_DISKNODES);
421 REGISTER_ENUM(RPMCALLBACK_UNKNOWN);
422 REGISTER_ENUM(RPMCALLBACK_INST_PROGRESS);
423 REGISTER_ENUM(RPMCALLBACK_INST_START);
424 REGISTER_ENUM(RPMCALLBACK_INST_OPEN_FILE);
425 REGISTER_ENUM(RPMCALLBACK_INST_CLOSE_FILE);
426 REGISTER_ENUM(RPMCALLBACK_TRANS_PROGRESS);
427 REGISTER_ENUM(RPMCALLBACK_TRANS_START);
428 REGISTER_ENUM(RPMCALLBACK_TRANS_STOP);
429 REGISTER_ENUM(RPMCALLBACK_UNINST_PROGRESS);
430 REGISTER_ENUM(RPMCALLBACK_UNINST_START);
431 REGISTER_ENUM(RPMCALLBACK_UNINST_STOP);
432 REGISTER_ENUM(RPMCALLBACK_REPACKAGE_PROGRESS);
433 REGISTER_ENUM(RPMCALLBACK_REPACKAGE_START);
434 REGISTER_ENUM(RPMCALLBACK_REPACKAGE_STOP);
435 REGISTER_ENUM(RPMCALLBACK_UNPACK_ERROR);
436 REGISTER_ENUM(RPMCALLBACK_CPIO_ERROR);
437 REGISTER_ENUM(RPMCALLBACK_SCRIPT_ERROR);
439 REGISTER_ENUM(RPMPROB_BADARCH);
440 REGISTER_ENUM(RPMPROB_BADOS);
441 REGISTER_ENUM(RPMPROB_PKG_INSTALLED);
442 REGISTER_ENUM(RPMPROB_BADRELOCATE);
443 REGISTER_ENUM(RPMPROB_REQUIRES);
444 REGISTER_ENUM(RPMPROB_CONFLICT);
445 REGISTER_ENUM(RPMPROB_NEW_FILE_CONFLICT);
446 REGISTER_ENUM(RPMPROB_FILE_CONFLICT);
447 REGISTER_ENUM(RPMPROB_OLDPACKAGE);
448 REGISTER_ENUM(RPMPROB_DISKSPACE);
449 REGISTER_ENUM(RPMPROB_DISKNODES);
451 REGISTER_ENUM(VERIFY_DIGEST);
452 REGISTER_ENUM(VERIFY_SIGNATURE);
454 REGISTER_ENUM(RPMLOG_EMERG);
455 REGISTER_ENUM(RPMLOG_ALERT);
456 REGISTER_ENUM(RPMLOG_CRIT);
457 REGISTER_ENUM(RPMLOG_ERR);
458 REGISTER_ENUM(RPMLOG_WARNING);
459 REGISTER_ENUM(RPMLOG_NOTICE);
460 REGISTER_ENUM(RPMLOG_INFO);
461 REGISTER_ENUM(RPMLOG_DEBUG);
463 REGISTER_ENUM(RPMMIRE_DEFAULT);
464 REGISTER_ENUM(RPMMIRE_STRCMP);
465 REGISTER_ENUM(RPMMIRE_REGEX);
466 REGISTER_ENUM(RPMMIRE_GLOB);
468 REGISTER_ENUM(RPMVSF_DEFAULT);
469 REGISTER_ENUM(RPMVSF_NOHDRCHK);
470 REGISTER_ENUM(RPMVSF_NEEDPAYLOAD);
471 REGISTER_ENUM(RPMVSF_NOSHA1HEADER);
472 REGISTER_ENUM(RPMVSF_NOMD5HEADER);
473 REGISTER_ENUM(RPMVSF_NODSAHEADER);
474 REGISTER_ENUM(RPMVSF_NORSAHEADER);
475 REGISTER_ENUM(RPMVSF_NOSHA1);
476 REGISTER_ENUM(RPMVSF_NOMD5);
477 REGISTER_ENUM(RPMVSF_NODSA);
478 REGISTER_ENUM(RPMVSF_NORSA);
479 REGISTER_ENUM(_RPMVSF_NODIGESTS);
480 REGISTER_ENUM(_RPMVSF_NOSIGNATURES);
481 REGISTER_ENUM(_RPMVSF_NOHEADER);
482 REGISTER_ENUM(_RPMVSF_NOPAYLOAD);
484 REGISTER_ENUM(TR_ADDED);
485 REGISTER_ENUM(TR_REMOVED);
487 REGISTER_ENUM(RPMDBI_PACKAGES);