00001
00005 #include "system.h"
00006
00007 #include <rpmio_internal.h>
00008 #include <rpmcli.h>
00009 #include <rpmdb.h>
00010
00011 #include "legacy.h"
00012 #include "misc.h"
00013 #include "header_internal.h"
00014
00015 #include "header-py.h"
00016 #include "rpmal-py.h"
00017 #include "rpmds-py.h"
00018 #include "rpmfd-py.h"
00019 #include "rpmfts-py.h"
00020 #include "rpmfi-py.h"
00021 #include "rpmmi-py.h"
00022 #include "rpmps-py.h"
00023 #include "rpmrc-py.h"
00024 #include "rpmte-py.h"
00025 #include "rpmts-py.h"
00026 #include "spec-py.h"
00027
00028 #include "debug.h"
00029
00030 #ifdef __LCLINT__
00031 #undef PyObject_HEAD
00032 #define PyObject_HEAD int _PyObjectHead
00033 #endif
00034
00039
00042 PyObject * pyrpmError;
00043
00046 static PyObject * archScore(PyObject * self, PyObject * args, PyObject * kwds)
00047 {
00048 char * arch;
00049 int score;
00050 char * kwlist[] = {"arch", NULL};
00051
00052 if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &arch))
00053 return NULL;
00054
00055 score = rpmMachineScore(RPM_MACHTABLE_INSTARCH, arch);
00056
00057 return Py_BuildValue("i", score);
00058 }
00059
00060 extern sigset_t rpmsqCaught;
00063 static PyObject * sqCaught(PyObject * self, PyObject * args)
00064 {
00065 if (!PyArg_ParseTuple(args, ":sqCaught")) return NULL;
00066
00067 return Py_BuildValue("i", rpmsqCaught);
00068 }
00069
00072 static PyObject * checkSignals(PyObject * self, PyObject * args)
00073 {
00074 if (!PyArg_ParseTuple(args, ":checkSignals")) return NULL;
00075 rpmdbCheckSignals();
00076 Py_INCREF(Py_None);
00077 return Py_None;
00078 }
00079
00082 static PyObject * setLogFile (PyObject * self, PyObject * args, PyObject *kwds)
00083 {
00084 PyObject * fop = NULL;
00085 FILE * fp = NULL;
00086 char * kwlist[] = {"fileObject", NULL};
00087
00088 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:logSetFile", kwlist, &fop))
00089 return NULL;
00090
00091 if (fop) {
00092 if (!PyFile_Check(fop)) {
00093 PyErr_SetString(pyrpmError, "requires file object");
00094 return NULL;
00095 }
00096 fp = PyFile_AsFile(fop);
00097 }
00098
00099 (void) rpmlogSetFile(fp);
00100
00101 Py_INCREF(Py_None);
00102 return (PyObject *) Py_None;
00103 }
00104
00107 static PyObject *
00108 setVerbosity (PyObject * self, PyObject * args, PyObject *kwds)
00109 {
00110 int level;
00111 char * kwlist[] = {"level", NULL};
00112
00113 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &level))
00114 return NULL;
00115
00116 rpmSetVerbosity(level);
00117
00118 Py_INCREF(Py_None);
00119 return (PyObject *) Py_None;
00120 }
00121
00124 static PyObject *
00125 setEpochPromote (PyObject * self, PyObject * args, PyObject * kwds)
00126 {
00127 char * kwlist[] = {"promote", NULL};
00128
00129 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist,
00130 &_rpmds_nopromote))
00131 return NULL;
00132
00133 Py_INCREF(Py_None);
00134 return (PyObject *) Py_None;
00135 }
00136
00139 static PyObject * setStats (PyObject * self, PyObject * args, PyObject * kwds)
00140 {
00141 char * kwlist[] = {"stats", NULL};
00142
00143 if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &_rpmts_stats))
00144 return NULL;
00145
00146 Py_INCREF(Py_None);
00147 return (PyObject *) Py_None;
00148 }
00153 static PyMethodDef rpmModuleMethods[] = {
00154 { "TransactionSet", (PyCFunction) rpmts_Create, METH_VARARGS|METH_KEYWORDS,
00155 "rpm.TransactionSet([rootDir, [db]]) -> ts\n\
00156 - Create a transaction set.\n" },
00157
00158 #if Py_TPFLAGS_HAVE_ITER
00159 { "newrc", (PyCFunction) rpmrc_Create, METH_VARARGS|METH_KEYWORDS,
00160 NULL },
00161 #endif
00162 { "addMacro", (PyCFunction) rpmrc_AddMacro, METH_VARARGS|METH_KEYWORDS,
00163 NULL },
00164 { "delMacro", (PyCFunction) rpmrc_DelMacro, METH_VARARGS|METH_KEYWORDS,
00165 NULL },
00166
00167 { "archscore", (PyCFunction) archScore, METH_VARARGS|METH_KEYWORDS,
00168 NULL },
00169
00170 { "sqCaught", (PyCFunction) sqCaught, METH_VARARGS,
00171 NULL },
00172 { "checkSignals", (PyCFunction) checkSignals, METH_VARARGS,
00173 NULL },
00174
00175 { "headerLoad", (PyCFunction) hdrLoad, METH_VARARGS|METH_KEYWORDS,
00176 NULL },
00177 { "mergeHeaderListFromFD", (PyCFunction) rpmMergeHeadersFromFD, METH_VARARGS|METH_KEYWORDS,
00178 NULL },
00179 { "readHeaderListFromFD", (PyCFunction) rpmHeaderFromFD, METH_VARARGS|METH_KEYWORDS,
00180 NULL },
00181 { "readHeaderListFromFile", (PyCFunction) rpmHeaderFromFile, METH_VARARGS|METH_KEYWORDS,
00182 NULL },
00183 { "readHeaderFromFD", (PyCFunction) rpmSingleHeaderFromFD, METH_VARARGS|METH_KEYWORDS,
00184 NULL },
00185
00186 { "setLogFile", (PyCFunction) setLogFile, METH_VARARGS|METH_KEYWORDS,
00187 NULL },
00188
00189 { "versionCompare", (PyCFunction) versionCompare, METH_VARARGS|METH_KEYWORDS,
00190 NULL },
00191 { "labelCompare", (PyCFunction) labelCompare, METH_VARARGS|METH_KEYWORDS,
00192 NULL },
00193 { "setVerbosity", (PyCFunction) setVerbosity, METH_VARARGS|METH_KEYWORDS,
00194 NULL },
00195 { "setEpochPromote", (PyCFunction) setEpochPromote, METH_VARARGS|METH_KEYWORDS,
00196 NULL },
00197 { "setStats", (PyCFunction) setStats, METH_VARARGS|METH_KEYWORDS,
00198 NULL },
00199
00200 { "dsSingle", (PyCFunction) rpmds_Single, METH_VARARGS|METH_KEYWORDS,
00201 "rpm.dsSingle(TagN, N, [EVR, [Flags]] -> ds\n\
00202 - Create a single element dependency set.\n" },
00203 { NULL }
00204 } ;
00205
00208 static char rpm__doc__[] =
00209 "";
00210
00211 void init_rpm(void);
00214 void init_rpm(void)
00215 {
00216 PyObject * d, *o, * tag = NULL, * dict;
00217 int i;
00218 const struct headerSprintfExtension_s * extensions = rpmHeaderFormats;
00219 struct headerSprintfExtension_s * ext;
00220 PyObject * m;
00221
00222 #if Py_TPFLAGS_HAVE_ITER
00223 if (PyType_Ready(&hdr_Type) < 0) return;
00224 if (PyType_Ready(&rpmal_Type) < 0) return;
00225 if (PyType_Ready(&rpmds_Type) < 0) return;
00226 if (PyType_Ready(&rpmfd_Type) < 0) return;
00227 if (PyType_Ready(&rpmfts_Type) < 0) return;
00228 if (PyType_Ready(&rpmfi_Type) < 0) return;
00229 if (PyType_Ready(&rpmmi_Type) < 0) return;
00230 if (PyType_Ready(&rpmps_Type) < 0) return;
00231
00232 rpmrc_Type.tp_base = &PyDict_Type;
00233 if (PyType_Ready(&rpmrc_Type) < 0) return;
00234
00235 if (PyType_Ready(&rpmte_Type) < 0) return;
00236 if (PyType_Ready(&rpmts_Type) < 0) return;
00237 if (PyType_Ready(&spec_Type) < 0) return;
00238 #endif
00239
00240 m = Py_InitModule3("_rpm", rpmModuleMethods, rpm__doc__);
00241 if (m == NULL)
00242 return;
00243
00244 rpmReadConfigFiles(rpmRcfiles, NULL);
00245
00246 d = PyModule_GetDict(m);
00247
00248 #ifdef HACK
00249 pyrpmError = PyString_FromString("_rpm.error");
00250 PyDict_SetItemString(d, "error", pyrpmError);
00251 Py_DECREF(pyrpmError);
00252 #else
00253 pyrpmError = PyErr_NewException("_rpm.error", NULL, NULL);
00254 if (pyrpmError != NULL)
00255 PyDict_SetItemString(d, "error", pyrpmError);
00256 #endif
00257
00258 #if Py_TPFLAGS_HAVE_ITER
00259 Py_INCREF(&hdr_Type);
00260 PyModule_AddObject(m, "hdr", (PyObject *) &hdr_Type);
00261
00262 Py_INCREF(&rpmal_Type);
00263 PyModule_AddObject(m, "al", (PyObject *) &rpmal_Type);
00264
00265 Py_INCREF(&rpmds_Type);
00266 PyModule_AddObject(m, "ds", (PyObject *) &rpmds_Type);
00267
00268 Py_INCREF(&rpmfd_Type);
00269 PyModule_AddObject(m, "fd", (PyObject *) &rpmfd_Type);
00270
00271 Py_INCREF(&rpmfts_Type);
00272 PyModule_AddObject(m, "fts", (PyObject *) &rpmfts_Type);
00273
00274 Py_INCREF(&rpmfi_Type);
00275 PyModule_AddObject(m, "fi", (PyObject *) &rpmfi_Type);
00276
00277 Py_INCREF(&rpmmi_Type);
00278 PyModule_AddObject(m, "mi", (PyObject *) &rpmmi_Type);
00279
00280 Py_INCREF(&rpmps_Type);
00281 PyModule_AddObject(m, "ps", (PyObject *) &rpmps_Type);
00282
00283 Py_INCREF(&rpmrc_Type);
00284 PyModule_AddObject(m, "rc", (PyObject *) &rpmrc_Type);
00285
00286 Py_INCREF(&rpmte_Type);
00287 PyModule_AddObject(m, "te", (PyObject *) &rpmte_Type);
00288
00289 Py_INCREF(&rpmts_Type);
00290 PyModule_AddObject(m, "ts", (PyObject *) &rpmts_Type);
00291
00292 Py_INCREF(&spec_Type);
00293 PyModule_AddObject(m, "spec", (PyObject *) &spec_Type);
00294 #else
00295 hdr_Type.ob_type = &PyType_Type;
00296 rpmal_Type.ob_type = &PyType_Type;
00297 rpmds_Type.ob_type = &PyType_Type;
00298 rpmfd_Type.ob_type = &PyType_Type;
00299 rpmfts_Type.ob_type = &PyType_Type;
00300 rpmfi_Type.ob_type = &PyType_Type;
00301 rpmmi_Type.ob_type = &PyType_Type;
00302 rpmps_Type.ob_type = &PyType_Type;
00303 rpmte_Type.ob_type = &PyType_Type;
00304 rpmts_Type.ob_type = &PyType_Type;
00305 spec_Type.ob_type = &PyType_Type;
00306 #endif
00307
00308 dict = PyDict_New();
00309
00310 for (i = 0; i < rpmTagTableSize; i++) {
00311 tag = PyInt_FromLong(rpmTagTable[i].val);
00312 PyDict_SetItemString(d, (char *) rpmTagTable[i].name, tag);
00313 Py_DECREF(tag);
00314 PyDict_SetItem(dict, tag, o=PyString_FromString(rpmTagTable[i].name + 7));
00315 Py_DECREF(o);
00316 }
00317
00318 while (extensions->name) {
00319 if (extensions->type == HEADER_EXT_TAG) {
00320 ext = extensions;
00321 PyDict_SetItemString(d, (char *) extensions->name, o=PyCObject_FromVoidPtr(ext, NULL));
00322 Py_DECREF(o);
00323 PyDict_SetItem(dict, tag, o=PyString_FromString(ext->name + 7));
00324 Py_DECREF(o);
00325 }
00326 extensions++;
00327 }
00328
00329 PyDict_SetItemString(d, "tagnames", dict);
00330 Py_DECREF(dict);
00331
00332
00333 #define REGISTER_ENUM(val) \
00334 PyDict_SetItemString(d, #val, o=PyInt_FromLong( val )); \
00335 Py_DECREF(o);
00336
00337 REGISTER_ENUM(RPMFILE_STATE_NORMAL);
00338 REGISTER_ENUM(RPMFILE_STATE_REPLACED);
00339 REGISTER_ENUM(RPMFILE_STATE_NOTINSTALLED);
00340 REGISTER_ENUM(RPMFILE_STATE_NETSHARED);
00341 REGISTER_ENUM(RPMFILE_STATE_WRONGCOLOR);
00342
00343 REGISTER_ENUM(RPMFILE_CONFIG);
00344 REGISTER_ENUM(RPMFILE_DOC);
00345 REGISTER_ENUM(RPMFILE_ICON);
00346 REGISTER_ENUM(RPMFILE_MISSINGOK);
00347 REGISTER_ENUM(RPMFILE_NOREPLACE);
00348 REGISTER_ENUM(RPMFILE_GHOST);
00349 REGISTER_ENUM(RPMFILE_LICENSE);
00350 REGISTER_ENUM(RPMFILE_README);
00351 REGISTER_ENUM(RPMFILE_EXCLUDE);
00352 REGISTER_ENUM(RPMFILE_UNPATCHED);
00353 REGISTER_ENUM(RPMFILE_PUBKEY);
00354
00355 REGISTER_ENUM(RPMDEP_SENSE_REQUIRES);
00356 REGISTER_ENUM(RPMDEP_SENSE_CONFLICTS);
00357
00358 REGISTER_ENUM(RPMSENSE_LESS);
00359 REGISTER_ENUM(RPMSENSE_GREATER);
00360 REGISTER_ENUM(RPMSENSE_EQUAL);
00361 REGISTER_ENUM(RPMSENSE_NOTEQUAL);
00362
00363 REGISTER_ENUM(RPMDEPS_FLAG_NOUPGRADE);
00364 REGISTER_ENUM(RPMDEPS_FLAG_NOREQUIRES);
00365 REGISTER_ENUM(RPMDEPS_FLAG_NOCONFLICTS);
00366 REGISTER_ENUM(RPMDEPS_FLAG_NOOBSOLETES);
00367 REGISTER_ENUM(RPMDEPS_FLAG_NOPARENTDIRS);
00368 REGISTER_ENUM(RPMDEPS_FLAG_NOLINKTOS);
00369 REGISTER_ENUM(RPMDEPS_FLAG_ANACONDA);
00370 REGISTER_ENUM(RPMDEPS_FLAG_NOSUGGEST);
00371 REGISTER_ENUM(RPMDEPS_FLAG_ADDINDEPS);
00372 REGISTER_ENUM(RPMDEPS_FLAG_DEPLOOPS);
00373
00374 REGISTER_ENUM(RPMTRANS_FLAG_TEST);
00375 REGISTER_ENUM(RPMTRANS_FLAG_BUILD_PROBS);
00376 REGISTER_ENUM(RPMTRANS_FLAG_NOSCRIPTS);
00377 REGISTER_ENUM(RPMTRANS_FLAG_JUSTDB);
00378 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERS);
00379 REGISTER_ENUM(RPMTRANS_FLAG_NODOCS);
00380 REGISTER_ENUM(RPMTRANS_FLAG_ALLFILES);
00381 REGISTER_ENUM(RPMTRANS_FLAG_KEEPOBSOLETE);
00382 REGISTER_ENUM(RPMTRANS_FLAG_REPACKAGE);
00383 REGISTER_ENUM(RPMTRANS_FLAG_NOPRE);
00384 REGISTER_ENUM(RPMTRANS_FLAG_NOPOST);
00385 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPREIN);
00386 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERIN);
00387 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERUN);
00388 REGISTER_ENUM(RPMTRANS_FLAG_NOPREUN);
00389 REGISTER_ENUM(RPMTRANS_FLAG_NOPOSTUN);
00390 REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPOSTUN);
00391 REGISTER_ENUM(RPMTRANS_FLAG_NOFDIGESTS);
00392 REGISTER_ENUM(RPMTRANS_FLAG_NOCONFIGS);
00393
00394 REGISTER_ENUM(RPMPROB_FILTER_IGNOREOS);
00395 REGISTER_ENUM(RPMPROB_FILTER_IGNOREARCH);
00396 REGISTER_ENUM(RPMPROB_FILTER_REPLACEPKG);
00397 REGISTER_ENUM(RPMPROB_FILTER_FORCERELOCATE);
00398 REGISTER_ENUM(RPMPROB_FILTER_REPLACENEWFILES);
00399 REGISTER_ENUM(RPMPROB_FILTER_REPLACEOLDFILES);
00400 REGISTER_ENUM(RPMPROB_FILTER_OLDPACKAGE);
00401 REGISTER_ENUM(RPMPROB_FILTER_DISKSPACE);
00402 REGISTER_ENUM(RPMPROB_FILTER_DISKNODES);
00403
00404 REGISTER_ENUM(RPMCALLBACK_UNKNOWN);
00405 REGISTER_ENUM(RPMCALLBACK_INST_PROGRESS);
00406 REGISTER_ENUM(RPMCALLBACK_INST_START);
00407 REGISTER_ENUM(RPMCALLBACK_INST_OPEN_FILE);
00408 REGISTER_ENUM(RPMCALLBACK_INST_CLOSE_FILE);
00409 REGISTER_ENUM(RPMCALLBACK_TRANS_PROGRESS);
00410 REGISTER_ENUM(RPMCALLBACK_TRANS_START);
00411 REGISTER_ENUM(RPMCALLBACK_TRANS_STOP);
00412 REGISTER_ENUM(RPMCALLBACK_UNINST_PROGRESS);
00413 REGISTER_ENUM(RPMCALLBACK_UNINST_START);
00414 REGISTER_ENUM(RPMCALLBACK_UNINST_STOP);
00415 REGISTER_ENUM(RPMCALLBACK_REPACKAGE_PROGRESS);
00416 REGISTER_ENUM(RPMCALLBACK_REPACKAGE_START);
00417 REGISTER_ENUM(RPMCALLBACK_REPACKAGE_STOP);
00418 REGISTER_ENUM(RPMCALLBACK_UNPACK_ERROR);
00419 REGISTER_ENUM(RPMCALLBACK_CPIO_ERROR);
00420
00421 REGISTER_ENUM(RPMPROB_BADARCH);
00422 REGISTER_ENUM(RPMPROB_BADOS);
00423 REGISTER_ENUM(RPMPROB_PKG_INSTALLED);
00424 REGISTER_ENUM(RPMPROB_BADRELOCATE);
00425 REGISTER_ENUM(RPMPROB_REQUIRES);
00426 REGISTER_ENUM(RPMPROB_CONFLICT);
00427 REGISTER_ENUM(RPMPROB_NEW_FILE_CONFLICT);
00428 REGISTER_ENUM(RPMPROB_FILE_CONFLICT);
00429 REGISTER_ENUM(RPMPROB_OLDPACKAGE);
00430 REGISTER_ENUM(RPMPROB_DISKSPACE);
00431 REGISTER_ENUM(RPMPROB_DISKNODES);
00432 REGISTER_ENUM(RPMPROB_BADPRETRANS);
00433
00434 REGISTER_ENUM(VERIFY_DIGEST);
00435 REGISTER_ENUM(VERIFY_SIGNATURE);
00436
00437 REGISTER_ENUM(RPMLOG_EMERG);
00438 REGISTER_ENUM(RPMLOG_ALERT);
00439 REGISTER_ENUM(RPMLOG_CRIT);
00440 REGISTER_ENUM(RPMLOG_ERR);
00441 REGISTER_ENUM(RPMLOG_WARNING);
00442 REGISTER_ENUM(RPMLOG_NOTICE);
00443 REGISTER_ENUM(RPMLOG_INFO);
00444 REGISTER_ENUM(RPMLOG_DEBUG);
00445
00446 REGISTER_ENUM(RPMMIRE_DEFAULT);
00447 REGISTER_ENUM(RPMMIRE_STRCMP);
00448 REGISTER_ENUM(RPMMIRE_REGEX);
00449 REGISTER_ENUM(RPMMIRE_GLOB);
00450
00451 REGISTER_ENUM(RPMVSF_DEFAULT);
00452 REGISTER_ENUM(RPMVSF_NOHDRCHK);
00453 REGISTER_ENUM(RPMVSF_NEEDPAYLOAD);
00454 REGISTER_ENUM(RPMVSF_NOSHA1HEADER);
00455 REGISTER_ENUM(RPMVSF_NOMD5HEADER);
00456 REGISTER_ENUM(RPMVSF_NODSAHEADER);
00457 REGISTER_ENUM(RPMVSF_NORSAHEADER);
00458 REGISTER_ENUM(RPMVSF_NOSHA1);
00459 REGISTER_ENUM(RPMVSF_NOMD5);
00460 REGISTER_ENUM(RPMVSF_NODSA);
00461 REGISTER_ENUM(RPMVSF_NORSA);
00462 REGISTER_ENUM(_RPMVSF_NODIGESTS);
00463 REGISTER_ENUM(_RPMVSF_NOSIGNATURES);
00464 REGISTER_ENUM(_RPMVSF_NOHEADER);
00465 REGISTER_ENUM(_RPMVSF_NOPAYLOAD);
00466
00467 REGISTER_ENUM(TR_ADDED);
00468 REGISTER_ENUM(TR_REMOVED);
00469
00470 REGISTER_ENUM(RPMDBI_PACKAGES);
00471
00472 REGISTER_ENUM((int)RPMAL_NOMATCH);
00473 }