python/rpmmodule.c

Go to the documentation of this file.
00001 
00005 #include "system.h"
00006 
00007 #include <rpmio_internal.h>
00008 #include <rpmcli.h>     /* XXX for rpmCheckSig */
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 
00062 static PyObject * setLogFile (PyObject * self, PyObject * args, PyObject *kwds)
00063 {
00064     PyObject * fop = NULL;
00065     FILE * fp = NULL;
00066     char * kwlist[] = {"fileObject", NULL};
00067 
00068     if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:logSetFile", kwlist, &fop))
00069         return NULL;
00070 
00071     if (fop) {
00072         if (!PyFile_Check(fop)) {
00073             PyErr_SetString(pyrpmError, "requires file object");
00074             return NULL;
00075         }
00076         fp = PyFile_AsFile(fop);
00077     }
00078 
00079     (void) rpmlogSetFile(fp);
00080 
00081     Py_INCREF(Py_None);
00082     return (PyObject *) Py_None;
00083 }
00084 
00087 static PyObject *
00088 setVerbosity (PyObject * self, PyObject * args, PyObject *kwds)
00089 {
00090     int level;
00091     char * kwlist[] = {"level", NULL};
00092 
00093     if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &level))
00094         return NULL;
00095 
00096     rpmSetVerbosity(level);
00097 
00098     Py_INCREF(Py_None);
00099     return (PyObject *) Py_None;
00100 }
00101 
00104 static PyObject *
00105 setEpochPromote (PyObject * self, PyObject * args, PyObject * kwds)
00106 {
00107     char * kwlist[] = {"promote", NULL};
00108 
00109     if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist,
00110             &_rpmds_nopromote))
00111         return NULL;
00112 
00113     Py_INCREF(Py_None);
00114     return (PyObject *) Py_None;
00115 }
00116 
00119 static PyObject * setStats (PyObject * self, PyObject * args, PyObject * kwds)
00120 {
00121     char * kwlist[] = {"stats", NULL};
00122 
00123     if (!PyArg_ParseTupleAndKeywords(args, kwds, "i", kwlist, &_rpmts_stats))
00124         return NULL;
00125 
00126     Py_INCREF(Py_None);
00127     return (PyObject *) Py_None;
00128 }
00129 
00132 static PyMethodDef rpmModuleMethods[] = {
00133     { "TransactionSet", (PyCFunction) rpmts_Create, METH_VARARGS|METH_KEYWORDS,
00134 "rpm.TransactionSet([rootDir, [db]]) -> ts\n\
00135 - Create a transaction set.\n" },
00136 
00137 #if Py_TPFLAGS_HAVE_ITER        /* XXX backport to python-1.5.2 */
00138     { "newrc", (PyCFunction) rpmrc_Create, METH_VARARGS|METH_KEYWORDS,
00139         NULL },
00140 #endif
00141     { "addMacro", (PyCFunction) rpmrc_AddMacro, METH_VARARGS|METH_KEYWORDS,
00142         NULL },
00143     { "delMacro", (PyCFunction) rpmrc_DelMacro, METH_VARARGS|METH_KEYWORDS,
00144         NULL },
00145 
00146     { "archscore", (PyCFunction) archScore, METH_VARARGS|METH_KEYWORDS,
00147         NULL },
00148 
00149     { "headerLoad", (PyCFunction) hdrLoad, METH_VARARGS|METH_KEYWORDS,
00150         NULL },
00151     { "rhnLoad", (PyCFunction) rhnLoad, METH_VARARGS|METH_KEYWORDS,
00152         NULL },
00153     { "mergeHeaderListFromFD", (PyCFunction) rpmMergeHeadersFromFD, METH_VARARGS|METH_KEYWORDS,
00154         NULL },
00155     { "readHeaderListFromFD", (PyCFunction) rpmHeaderFromFD, METH_VARARGS|METH_KEYWORDS,
00156         NULL },
00157     { "readHeaderListFromFile", (PyCFunction) rpmHeaderFromFile, METH_VARARGS|METH_KEYWORDS,
00158         NULL },
00159     { "readHeaderFromFD", (PyCFunction) rpmSingleHeaderFromFD, METH_VARARGS|METH_KEYWORDS,
00160         NULL },
00161 
00162     { "setLogFile", (PyCFunction) setLogFile, METH_VARARGS|METH_KEYWORDS,
00163         NULL },
00164 
00165     { "versionCompare", (PyCFunction) versionCompare, METH_VARARGS|METH_KEYWORDS,
00166         NULL },
00167     { "labelCompare", (PyCFunction) labelCompare, METH_VARARGS|METH_KEYWORDS,
00168         NULL },
00169     { "setVerbosity", (PyCFunction) setVerbosity, METH_VARARGS|METH_KEYWORDS,
00170         NULL },
00171     { "setEpochPromote", (PyCFunction) setEpochPromote, METH_VARARGS|METH_KEYWORDS,
00172         NULL },
00173     { "setStats", (PyCFunction) setStats, METH_VARARGS|METH_KEYWORDS,
00174         NULL },
00175 
00176     { "dsSingle", (PyCFunction) rpmds_Single, METH_VARARGS|METH_KEYWORDS,
00177 "rpm.dsSingle(TagN, N, [EVR, [Flags]] -> ds\n\
00178 - Create a single element dependency set.\n" },
00179     { NULL }
00180 } ;
00181 
00184 static char rpm__doc__[] =
00185 "";
00186 
00187 void init_rpm(void);    /* XXX eliminate gcc warning */
00190 void init_rpm(void)
00191 {
00192     PyObject * d, *o, * tag = NULL, * dict;
00193     int i;
00194     const struct headerSprintfExtension_s * extensions = rpmHeaderFormats;
00195     struct headerSprintfExtension_s * ext;
00196     PyObject * m;
00197 
00198 #if Py_TPFLAGS_HAVE_ITER        /* XXX backport to python-1.5.2 */
00199     if (PyType_Ready(&hdr_Type) < 0) return;
00200     if (PyType_Ready(&rpmal_Type) < 0) return;
00201     if (PyType_Ready(&rpmds_Type) < 0) return;
00202     if (PyType_Ready(&rpmfd_Type) < 0) return;
00203     if (PyType_Ready(&rpmfts_Type) < 0) return;
00204     if (PyType_Ready(&rpmfi_Type) < 0) return;
00205     if (PyType_Ready(&rpmmi_Type) < 0) return;
00206     if (PyType_Ready(&rpmps_Type) < 0) return;
00207 
00208     rpmrc_Type.tp_base = &PyDict_Type;
00209     if (PyType_Ready(&rpmrc_Type) < 0) return;
00210 
00211     if (PyType_Ready(&rpmte_Type) < 0) return;
00212     if (PyType_Ready(&rpmts_Type) < 0) return;
00213     if (PyType_Ready(&spec_Type) < 0) return;
00214 #endif
00215 
00216     m = Py_InitModule3("_rpm", rpmModuleMethods, rpm__doc__);
00217     if (m == NULL)
00218         return;
00219 
00220     rpmReadConfigFiles(NULL, NULL);
00221 
00222     d = PyModule_GetDict(m);
00223 
00224 #ifdef  HACK
00225     pyrpmError = PyString_FromString("_rpm.error");
00226     PyDict_SetItemString(d, "error", pyrpmError);
00227     Py_DECREF(pyrpmError);
00228 #else
00229     pyrpmError = PyErr_NewException("_rpm.error", NULL, NULL);
00230     if (pyrpmError != NULL)
00231         PyDict_SetItemString(d, "error", pyrpmError);
00232 #endif
00233 
00234 #if Py_TPFLAGS_HAVE_ITER        /* XXX backport to python-1.5.2 */
00235     Py_INCREF(&hdr_Type);
00236     PyModule_AddObject(m, "hdr", (PyObject *) &hdr_Type);
00237 
00238     Py_INCREF(&rpmal_Type);
00239     PyModule_AddObject(m, "al", (PyObject *) &rpmal_Type);
00240 
00241     Py_INCREF(&rpmds_Type);
00242     PyModule_AddObject(m, "ds", (PyObject *) &rpmds_Type);
00243 
00244     Py_INCREF(&rpmfd_Type);
00245     PyModule_AddObject(m, "fd", (PyObject *) &rpmfd_Type);
00246 
00247     Py_INCREF(&rpmfts_Type);
00248     PyModule_AddObject(m, "fts", (PyObject *) &rpmfts_Type);
00249 
00250     Py_INCREF(&rpmfi_Type);
00251     PyModule_AddObject(m, "fi", (PyObject *) &rpmfi_Type);
00252 
00253     Py_INCREF(&rpmmi_Type);
00254     PyModule_AddObject(m, "mi", (PyObject *) &rpmmi_Type);
00255 
00256     Py_INCREF(&rpmps_Type);
00257     PyModule_AddObject(m, "ps", (PyObject *) &rpmps_Type);
00258 
00259     Py_INCREF(&rpmrc_Type);
00260     PyModule_AddObject(m, "rc", (PyObject *) &rpmrc_Type);
00261 
00262     Py_INCREF(&rpmte_Type);
00263     PyModule_AddObject(m, "te", (PyObject *) &rpmte_Type);
00264 
00265     Py_INCREF(&rpmts_Type);
00266     PyModule_AddObject(m, "ts", (PyObject *) &rpmts_Type);
00267 
00268     Py_INCREF(&spec_Type);
00269     PyModule_AddObject(m, "spec", (PyObject *) &spec_Type);
00270 #else
00271     hdr_Type.ob_type = &PyType_Type;
00272     rpmal_Type.ob_type = &PyType_Type;
00273     rpmds_Type.ob_type = &PyType_Type;
00274     rpmfd_Type.ob_type = &PyType_Type;
00275     rpmfts_Type.ob_type = &PyType_Type;
00276     rpmfi_Type.ob_type = &PyType_Type;
00277     rpmmi_Type.ob_type = &PyType_Type;
00278     rpmps_Type.ob_type = &PyType_Type;
00279     rpmte_Type.ob_type = &PyType_Type;
00280     rpmts_Type.ob_type = &PyType_Type;
00281     spec_Type.ob_type =  &PyType_Type;
00282 #endif
00283 
00284     dict = PyDict_New();
00285 
00286     for (i = 0; i < rpmTagTableSize; i++) {
00287         tag = PyInt_FromLong(rpmTagTable[i].val);
00288         PyDict_SetItemString(d, (char *) rpmTagTable[i].name, tag);
00289         Py_DECREF(tag);
00290         PyDict_SetItem(dict, tag, o=PyString_FromString(rpmTagTable[i].name + 7));
00291         Py_DECREF(o);
00292     }
00293 
00294     while (extensions->name) {
00295         if (extensions->type == HEADER_EXT_TAG) {
00296             ext = extensions;
00297             PyDict_SetItemString(d, (char *) extensions->name, o=PyCObject_FromVoidPtr(ext, NULL));
00298             Py_DECREF(o);
00299             PyDict_SetItem(dict, tag, o=PyString_FromString(ext->name + 7));
00300             Py_DECREF(o);
00301         }
00302         extensions++;
00303     }
00304 
00305     PyDict_SetItemString(d, "tagnames", dict);
00306     Py_DECREF(dict);
00307 
00308 
00309 #define REGISTER_ENUM(val) \
00310     PyDict_SetItemString(d, #val, o=PyInt_FromLong( val )); \
00311     Py_DECREF(o);
00312 
00313     REGISTER_ENUM(RPMFILE_STATE_NORMAL);
00314     REGISTER_ENUM(RPMFILE_STATE_REPLACED);
00315     REGISTER_ENUM(RPMFILE_STATE_NOTINSTALLED);
00316     REGISTER_ENUM(RPMFILE_STATE_NETSHARED);
00317     REGISTER_ENUM(RPMFILE_STATE_WRONGCOLOR);
00318 
00319     REGISTER_ENUM(RPMFILE_CONFIG);
00320     REGISTER_ENUM(RPMFILE_DOC);
00321     REGISTER_ENUM(RPMFILE_ICON);
00322     REGISTER_ENUM(RPMFILE_MISSINGOK);
00323     REGISTER_ENUM(RPMFILE_NOREPLACE);
00324     REGISTER_ENUM(RPMFILE_GHOST);
00325     REGISTER_ENUM(RPMFILE_LICENSE);
00326     REGISTER_ENUM(RPMFILE_README);
00327     REGISTER_ENUM(RPMFILE_EXCLUDE);
00328     REGISTER_ENUM(RPMFILE_UNPATCHED);
00329     REGISTER_ENUM(RPMFILE_PUBKEY);
00330 
00331     REGISTER_ENUM(RPMDEP_SENSE_REQUIRES);
00332     REGISTER_ENUM(RPMDEP_SENSE_CONFLICTS);
00333 
00334     REGISTER_ENUM(RPMSENSE_SERIAL);
00335     REGISTER_ENUM(RPMSENSE_LESS);
00336     REGISTER_ENUM(RPMSENSE_GREATER);
00337     REGISTER_ENUM(RPMSENSE_EQUAL);
00338     REGISTER_ENUM(RPMSENSE_PREREQ);
00339     REGISTER_ENUM(RPMSENSE_INTERP);
00340     REGISTER_ENUM(RPMSENSE_SCRIPT_PRE);
00341     REGISTER_ENUM(RPMSENSE_SCRIPT_POST);
00342     REGISTER_ENUM(RPMSENSE_SCRIPT_PREUN);
00343     REGISTER_ENUM(RPMSENSE_SCRIPT_POSTUN);
00344     REGISTER_ENUM(RPMSENSE_SCRIPT_VERIFY);
00345     REGISTER_ENUM(RPMSENSE_FIND_REQUIRES);
00346     REGISTER_ENUM(RPMSENSE_FIND_PROVIDES);
00347     REGISTER_ENUM(RPMSENSE_TRIGGERIN);
00348     REGISTER_ENUM(RPMSENSE_TRIGGERUN);
00349     REGISTER_ENUM(RPMSENSE_TRIGGERPOSTUN);
00350     REGISTER_ENUM(RPMSENSE_SCRIPT_PREP);
00351     REGISTER_ENUM(RPMSENSE_SCRIPT_BUILD);
00352     REGISTER_ENUM(RPMSENSE_SCRIPT_INSTALL);
00353     REGISTER_ENUM(RPMSENSE_SCRIPT_CLEAN);
00354     REGISTER_ENUM(RPMSENSE_RPMLIB);
00355     REGISTER_ENUM(RPMSENSE_TRIGGERPREIN);
00356     REGISTER_ENUM(RPMSENSE_KEYRING);
00357     REGISTER_ENUM(RPMSENSE_PATCHES);
00358     REGISTER_ENUM(RPMSENSE_CONFIG);
00359 
00360     REGISTER_ENUM(RPMTRANS_FLAG_TEST);
00361     REGISTER_ENUM(RPMTRANS_FLAG_BUILD_PROBS);
00362     REGISTER_ENUM(RPMTRANS_FLAG_NOSCRIPTS);
00363     REGISTER_ENUM(RPMTRANS_FLAG_JUSTDB);
00364     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERS);
00365     REGISTER_ENUM(RPMTRANS_FLAG_NODOCS);
00366     REGISTER_ENUM(RPMTRANS_FLAG_ALLFILES);
00367     REGISTER_ENUM(RPMTRANS_FLAG_KEEPOBSOLETE);
00368     REGISTER_ENUM(RPMTRANS_FLAG_REPACKAGE);
00369     REGISTER_ENUM(RPMTRANS_FLAG_REVERSE);
00370     REGISTER_ENUM(RPMTRANS_FLAG_NOPRE);
00371     REGISTER_ENUM(RPMTRANS_FLAG_NOPOST);
00372     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPREIN);
00373     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERIN);
00374     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERUN);
00375     REGISTER_ENUM(RPMTRANS_FLAG_NOPREUN);
00376     REGISTER_ENUM(RPMTRANS_FLAG_NOPOSTUN);
00377     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPOSTUN);
00378     REGISTER_ENUM(RPMTRANS_FLAG_ANACONDA);
00379     REGISTER_ENUM(RPMTRANS_FLAG_NOMD5);
00380     REGISTER_ENUM(RPMTRANS_FLAG_NOSUGGEST);
00381     REGISTER_ENUM(RPMTRANS_FLAG_ADDINDEPS);
00382     REGISTER_ENUM(RPMTRANS_FLAG_NOCONFIGS);
00383 
00384     REGISTER_ENUM(RPMPROB_FILTER_IGNOREOS);
00385     REGISTER_ENUM(RPMPROB_FILTER_IGNOREARCH);
00386     REGISTER_ENUM(RPMPROB_FILTER_REPLACEPKG);
00387     REGISTER_ENUM(RPMPROB_FILTER_FORCERELOCATE);
00388     REGISTER_ENUM(RPMPROB_FILTER_REPLACENEWFILES);
00389     REGISTER_ENUM(RPMPROB_FILTER_REPLACEOLDFILES);
00390     REGISTER_ENUM(RPMPROB_FILTER_OLDPACKAGE);
00391     REGISTER_ENUM(RPMPROB_FILTER_DISKSPACE);
00392     REGISTER_ENUM(RPMPROB_FILTER_DISKNODES);
00393 
00394     REGISTER_ENUM(RPMCALLBACK_UNKNOWN);
00395     REGISTER_ENUM(RPMCALLBACK_INST_PROGRESS);
00396     REGISTER_ENUM(RPMCALLBACK_INST_START);
00397     REGISTER_ENUM(RPMCALLBACK_INST_OPEN_FILE);
00398     REGISTER_ENUM(RPMCALLBACK_INST_CLOSE_FILE);
00399     REGISTER_ENUM(RPMCALLBACK_TRANS_PROGRESS);
00400     REGISTER_ENUM(RPMCALLBACK_TRANS_START);
00401     REGISTER_ENUM(RPMCALLBACK_TRANS_STOP);
00402     REGISTER_ENUM(RPMCALLBACK_UNINST_PROGRESS);
00403     REGISTER_ENUM(RPMCALLBACK_UNINST_START);
00404     REGISTER_ENUM(RPMCALLBACK_UNINST_STOP);
00405     REGISTER_ENUM(RPMCALLBACK_REPACKAGE_PROGRESS);
00406     REGISTER_ENUM(RPMCALLBACK_REPACKAGE_START);
00407     REGISTER_ENUM(RPMCALLBACK_REPACKAGE_STOP);
00408     REGISTER_ENUM(RPMCALLBACK_UNPACK_ERROR);
00409     REGISTER_ENUM(RPMCALLBACK_CPIO_ERROR);
00410 
00411     REGISTER_ENUM(RPMPROB_BADARCH);
00412     REGISTER_ENUM(RPMPROB_BADOS);
00413     REGISTER_ENUM(RPMPROB_PKG_INSTALLED);
00414     REGISTER_ENUM(RPMPROB_BADRELOCATE);
00415     REGISTER_ENUM(RPMPROB_REQUIRES);
00416     REGISTER_ENUM(RPMPROB_CONFLICT);
00417     REGISTER_ENUM(RPMPROB_NEW_FILE_CONFLICT);
00418     REGISTER_ENUM(RPMPROB_FILE_CONFLICT);
00419     REGISTER_ENUM(RPMPROB_OLDPACKAGE);
00420     REGISTER_ENUM(RPMPROB_DISKSPACE);
00421     REGISTER_ENUM(RPMPROB_DISKNODES);
00422     REGISTER_ENUM(RPMPROB_BADPRETRANS);
00423 
00424     REGISTER_ENUM(VERIFY_DIGEST);
00425     REGISTER_ENUM(VERIFY_SIGNATURE);
00426 
00427     REGISTER_ENUM(RPMLOG_EMERG);
00428     REGISTER_ENUM(RPMLOG_ALERT);
00429     REGISTER_ENUM(RPMLOG_CRIT);
00430     REGISTER_ENUM(RPMLOG_ERR);
00431     REGISTER_ENUM(RPMLOG_WARNING);
00432     REGISTER_ENUM(RPMLOG_NOTICE);
00433     REGISTER_ENUM(RPMLOG_INFO);
00434     REGISTER_ENUM(RPMLOG_DEBUG);
00435 
00436     REGISTER_ENUM(RPMMIRE_DEFAULT);
00437     REGISTER_ENUM(RPMMIRE_STRCMP);
00438     REGISTER_ENUM(RPMMIRE_REGEX);
00439     REGISTER_ENUM(RPMMIRE_GLOB);
00440 
00441     REGISTER_ENUM(RPMVSF_DEFAULT);
00442     REGISTER_ENUM(RPMVSF_NOHDRCHK);
00443     REGISTER_ENUM(RPMVSF_NEEDPAYLOAD);
00444     REGISTER_ENUM(RPMVSF_NOSHA1HEADER);
00445     REGISTER_ENUM(RPMVSF_NOMD5HEADER);
00446     REGISTER_ENUM(RPMVSF_NODSAHEADER);
00447     REGISTER_ENUM(RPMVSF_NORSAHEADER);
00448     REGISTER_ENUM(RPMVSF_NOSHA1);
00449     REGISTER_ENUM(RPMVSF_NOMD5);
00450     REGISTER_ENUM(RPMVSF_NODSA);
00451     REGISTER_ENUM(RPMVSF_NORSA);
00452     REGISTER_ENUM(_RPMVSF_NODIGESTS);
00453     REGISTER_ENUM(_RPMVSF_NOSIGNATURES);
00454     REGISTER_ENUM(_RPMVSF_NOHEADER);
00455     REGISTER_ENUM(_RPMVSF_NOPAYLOAD);
00456 
00457     REGISTER_ENUM(TR_ADDED);
00458     REGISTER_ENUM(TR_REMOVED);
00459 
00460     REGISTER_ENUM(RPMDBI_PACKAGES);
00461 
00462     REGISTER_ENUM(RPMAL_NOMATCH);
00463 }
00464 

Generated on Wed Jan 28 12:45:25 2009 for rpm by  doxygen 1.4.7