- fix: clean relocation path for --prefix=/.
[platform/upstream/rpm.git] / python / rpmmodule.c
1 /** \ingroup python
2  * \file python/rpmmodule.c
3  */
4
5 #include "system.h"
6
7 #include "Python.h"
8 #ifdef __LCLINT__
9 #undef  PyObject_HEAD
10 #define PyObject_HEAD   int _PyObjectHead;
11 #endif
12
13 #include <rpmio_internal.h>
14 #include <rpmcli.h>     /* XXX for rpmCheckSig */
15 #include <rpmdb.h>
16
17 #include "legacy.h"
18 #include "misc.h"
19 #include "header_internal.h"
20
21 #include "header-py.h"
22 #include "rpmal-py.h"
23 #include "rpmbc-py.h"
24 #include "rpmds-py.h"
25 #include "rpmfd-py.h"
26 #include "rpmfts-py.h"
27 #include "rpmfi-py.h"
28 #include "rpmmi-py.h"
29 #include "rpmrc-py.h"
30 #include "rpmte-py.h"
31 #include "rpmts-py.h"
32
33 #include "debug.h"
34
35 #ifdef __LCLINT__
36 #undef  PyObject_HEAD
37 #define PyObject_HEAD   int _PyObjectHead
38 #endif
39
40 /** \ingroup python
41  * \name Module: rpm
42  */
43 /*@{*/
44
45 /**
46  */
47 static PyObject * archScore(PyObject * self, PyObject * args)
48 {
49     char * arch;
50     int score;
51
52     if (!PyArg_ParseTuple(args, "s", &arch))
53         return NULL;
54
55     score = rpmMachineScore(RPM_MACHTABLE_INSTARCH, arch);
56
57     return Py_BuildValue("i", score);
58 }
59
60 /**
61  */
62 static PyObject * setLogFile (PyObject * self, PyObject * args)
63 {
64     PyObject * fop = NULL;
65     FILE * fp = NULL;
66
67     if (!PyArg_ParseTuple(args, "|O:logSetFile", &fop))
68         return NULL;
69
70     if (fop) {
71         if (!PyFile_Check(fop)) {
72             PyErr_SetString(pyrpmError, "requires file object");
73             return NULL;
74         }
75         fp = PyFile_AsFile(fop);
76     }
77
78     (void) rpmlogSetFile(fp);
79
80     Py_INCREF(Py_None);
81     return (PyObject *) Py_None;
82 }
83
84 /**
85  */
86 static PyObject * setVerbosity (PyObject * self, PyObject * args)
87 {
88     int level;
89
90     if (!PyArg_ParseTuple(args, "i", &level))
91         return NULL;
92
93     rpmSetVerbosity(level);
94
95     Py_INCREF(Py_None);
96     return (PyObject *) Py_None;
97 }
98
99 /**
100  */
101 static PyObject * setEpochPromote (PyObject * self, PyObject * args)
102 {
103     if (!PyArg_ParseTuple(args, "i", &_rpmds_nopromote))
104         return NULL;
105     Py_INCREF(Py_None);
106     return (PyObject *) Py_None;
107 }
108
109 /**
110  */
111 static PyMethodDef rpmModuleMethods[] = {
112     { "TransactionSet", (PyCFunction) rpmts_Create, METH_VARARGS,
113 "rpm.TransactionSet([rootDir, [db]]) -> ts\n\
114 - Create a transaction set.\n" },
115
116 #if Py_TPFLAGS_HAVE_ITER        /* XXX backport to python-1.5.2 */
117     { "newrc", (PyCFunction) rpmrc_Create, METH_VARARGS|METH_KEYWORDS,
118         NULL },
119 #endif
120     { "addMacro", (PyCFunction) rpmrc_AddMacro, METH_VARARGS,
121         NULL },
122     { "delMacro", (PyCFunction) rpmrc_DelMacro, METH_VARARGS,
123         NULL },
124
125     { "archscore", (PyCFunction) archScore, METH_VARARGS,
126         NULL },
127
128     { "headerLoad", (PyCFunction) hdrLoad, METH_VARARGS,
129         NULL },
130     { "rhnLoad", (PyCFunction) rhnLoad, METH_VARARGS,
131         NULL },
132     { "mergeHeaderListFromFD", (PyCFunction) rpmMergeHeadersFromFD, METH_VARARGS,
133         NULL },
134     { "readHeaderListFromFD", (PyCFunction) rpmHeaderFromFD, METH_VARARGS,
135         NULL },
136     { "readHeaderListFromFile", (PyCFunction) rpmHeaderFromFile, METH_VARARGS,
137         NULL },
138
139     { "setLogFile", (PyCFunction) setLogFile, METH_VARARGS,
140         NULL },
141
142     { "versionCompare", (PyCFunction) versionCompare, METH_VARARGS,
143         NULL },
144     { "labelCompare", (PyCFunction) labelCompare, METH_VARARGS,
145         NULL },
146     { "setVerbosity", (PyCFunction) setVerbosity, METH_VARARGS,
147         NULL },
148     { "setEpochPromote", (PyCFunction) setEpochPromote, METH_VARARGS,
149         NULL },
150
151     { "dsSingle", (PyCFunction) rpmds_Single, METH_VARARGS,
152 "rpm.dsSingle(TagN, N, [EVR, [Flags]] -> ds\n\
153 - Create a single element dependency set.\n" },
154     { NULL }
155 } ;
156
157 /**
158  */
159 static char rpm__doc__[] =
160 "";
161
162 void initrpm(void);     /* XXX eliminate gcc warning */
163 /**
164  */
165 void initrpm(void)
166 {
167     PyObject * d, *o, * tag = NULL, * dict;
168     int i;
169     const struct headerSprintfExtension_s * extensions = rpmHeaderFormats;
170     struct headerSprintfExtension_s * ext;
171     PyObject * m;
172
173 #if Py_TPFLAGS_HAVE_ITER        /* XXX backport to python-1.5.2 */
174     if (PyType_Ready(&hdr_Type) < 0) return;
175     if (PyType_Ready(&rpmal_Type) < 0) return;
176     if (PyType_Ready(&rpmbc_Type) < 0) return;
177     if (PyType_Ready(&rpmds_Type) < 0) return;
178     if (PyType_Ready(&rpmfd_Type) < 0) return;
179     if (PyType_Ready(&rpmfts_Type) < 0) return;
180     if (PyType_Ready(&rpmfi_Type) < 0) return;
181     if (PyType_Ready(&rpmmi_Type) < 0) return;
182
183     rpmrc_Type.tp_base = &PyDict_Type;
184     if (PyType_Ready(&rpmrc_Type) < 0) return;
185
186     if (PyType_Ready(&rpmte_Type) < 0) return;
187     if (PyType_Ready(&rpmts_Type) < 0) return;
188 #endif
189
190     m = Py_InitModule3("rpm", rpmModuleMethods, rpm__doc__);
191     if (m == NULL)
192         return;
193
194     rpmReadConfigFiles(NULL, NULL);
195
196     d = PyModule_GetDict(m);
197
198 #ifdef  HACK
199     pyrpmError = PyString_FromString("rpm.error");
200     PyDict_SetItemString(d, "error", pyrpmError);
201     Py_DECREF(pyrpmError);
202 #else
203     pyrpmError = PyErr_NewException("rpm.error", NULL, NULL);
204     if (pyrpmError != NULL)
205         PyDict_SetItemString(d, "error", pyrpmError);
206 #endif
207
208 #if Py_TPFLAGS_HAVE_ITER        /* XXX backport to python-1.5.2 */
209     Py_INCREF(&hdr_Type);
210     PyModule_AddObject(m, "hdr", (PyObject *) &hdr_Type);
211
212     Py_INCREF(&rpmal_Type);
213     PyModule_AddObject(m, "al", (PyObject *) &rpmal_Type);
214
215     Py_INCREF(&rpmbc_Type);
216     PyModule_AddObject(m, "bc", (PyObject *) &rpmbc_Type);
217
218     Py_INCREF(&rpmds_Type);
219     PyModule_AddObject(m, "ds", (PyObject *) &rpmds_Type);
220
221     Py_INCREF(&rpmfd_Type);
222     PyModule_AddObject(m, "fd", (PyObject *) &rpmfd_Type);
223
224     Py_INCREF(&rpmfts_Type);
225     PyModule_AddObject(m, "fts", (PyObject *) &rpmfts_Type);
226
227     Py_INCREF(&rpmfi_Type);
228     PyModule_AddObject(m, "fi", (PyObject *) &rpmfi_Type);
229
230     Py_INCREF(&rpmmi_Type);
231     PyModule_AddObject(m, "mi", (PyObject *) &rpmmi_Type);
232
233     Py_INCREF(&rpmrc_Type);
234     PyModule_AddObject(m, "rc", (PyObject *) &rpmrc_Type);
235
236     Py_INCREF(&rpmte_Type);
237     PyModule_AddObject(m, "te", (PyObject *) &rpmte_Type);
238
239     Py_INCREF(&rpmts_Type);
240     PyModule_AddObject(m, "ts", (PyObject *) &rpmts_Type);
241 #else
242     hdr_Type.ob_type = &PyType_Type;
243     rpmal_Type.ob_type = &PyType_Type;
244     rpmbc_Type.ob_type = &PyType_Type;
245     rpmds_Type.ob_type = &PyType_Type;
246     rpmfd_Type.ob_type = &PyType_Type;
247     rpmfts_Type.ob_type = &PyType_Type;
248     rpmfi_Type.ob_type = &PyType_Type;
249     rpmmi_Type.ob_type = &PyType_Type;
250     rpmte_Type.ob_type = &PyType_Type;
251     rpmts_Type.ob_type = &PyType_Type;
252 #endif
253
254     dict = PyDict_New();
255
256     for (i = 0; i < rpmTagTableSize; i++) {
257         tag = PyInt_FromLong(rpmTagTable[i].val);
258         PyDict_SetItemString(d, (char *) rpmTagTable[i].name, tag);
259         Py_DECREF(tag);
260         PyDict_SetItem(dict, tag, o=PyString_FromString(rpmTagTable[i].name + 7));
261         Py_DECREF(o);
262     }
263
264     while (extensions->name) {
265         if (extensions->type == HEADER_EXT_TAG) {
266             (const struct headerSprintfExtension *) ext = extensions;
267             PyDict_SetItemString(d, (char *) extensions->name, o=PyCObject_FromVoidPtr(ext, NULL));
268             Py_DECREF(o);
269             PyDict_SetItem(dict, tag, o=PyString_FromString(ext->name + 7));
270             Py_DECREF(o);    
271         }
272         extensions++;
273     }
274
275     PyDict_SetItemString(d, "tagnames", dict);
276     Py_DECREF(dict);
277
278
279 #define REGISTER_ENUM(val) \
280     PyDict_SetItemString(d, #val, o=PyInt_FromLong( val )); \
281     Py_DECREF(o);
282     
283     REGISTER_ENUM(RPMFILE_STATE_NORMAL);
284     REGISTER_ENUM(RPMFILE_STATE_REPLACED);
285     REGISTER_ENUM(RPMFILE_STATE_NOTINSTALLED);
286     REGISTER_ENUM(RPMFILE_STATE_NETSHARED);
287     REGISTER_ENUM(RPMFILE_STATE_WRONGCOLOR);
288
289     REGISTER_ENUM(RPMFILE_CONFIG);
290     REGISTER_ENUM(RPMFILE_DOC);
291     REGISTER_ENUM(RPMFILE_ICON);
292     REGISTER_ENUM(RPMFILE_MISSINGOK);
293     REGISTER_ENUM(RPMFILE_NOREPLACE);
294     REGISTER_ENUM(RPMFILE_GHOST);
295     REGISTER_ENUM(RPMFILE_LICENSE);
296     REGISTER_ENUM(RPMFILE_README);
297     REGISTER_ENUM(RPMFILE_EXCLUDE);
298     REGISTER_ENUM(RPMFILE_UNPATCHED);
299     REGISTER_ENUM(RPMFILE_PUBKEY);
300
301     REGISTER_ENUM(RPMDEP_SENSE_REQUIRES);
302     REGISTER_ENUM(RPMDEP_SENSE_CONFLICTS);
303
304     REGISTER_ENUM(RPMSENSE_SERIAL);
305     REGISTER_ENUM(RPMSENSE_LESS);
306     REGISTER_ENUM(RPMSENSE_GREATER);
307     REGISTER_ENUM(RPMSENSE_EQUAL);
308     REGISTER_ENUM(RPMSENSE_PREREQ);
309     REGISTER_ENUM(RPMSENSE_INTERP);
310     REGISTER_ENUM(RPMSENSE_SCRIPT_PRE);
311     REGISTER_ENUM(RPMSENSE_SCRIPT_POST);
312     REGISTER_ENUM(RPMSENSE_SCRIPT_PREUN);
313     REGISTER_ENUM(RPMSENSE_SCRIPT_POSTUN);
314     REGISTER_ENUM(RPMSENSE_SCRIPT_VERIFY);
315     REGISTER_ENUM(RPMSENSE_FIND_REQUIRES);
316     REGISTER_ENUM(RPMSENSE_FIND_PROVIDES);
317     REGISTER_ENUM(RPMSENSE_TRIGGERIN);
318     REGISTER_ENUM(RPMSENSE_TRIGGERUN);
319     REGISTER_ENUM(RPMSENSE_TRIGGERPOSTUN);
320     REGISTER_ENUM(RPMSENSE_SCRIPT_PREP);
321     REGISTER_ENUM(RPMSENSE_SCRIPT_BUILD);
322     REGISTER_ENUM(RPMSENSE_SCRIPT_INSTALL);
323     REGISTER_ENUM(RPMSENSE_SCRIPT_CLEAN);
324     REGISTER_ENUM(RPMSENSE_RPMLIB);
325     REGISTER_ENUM(RPMSENSE_TRIGGERPREIN);
326     REGISTER_ENUM(RPMSENSE_KEYRING);
327     REGISTER_ENUM(RPMSENSE_PATCHES);
328     REGISTER_ENUM(RPMSENSE_CONFIG);
329
330     REGISTER_ENUM(RPMTRANS_FLAG_TEST);
331     REGISTER_ENUM(RPMTRANS_FLAG_BUILD_PROBS);
332     REGISTER_ENUM(RPMTRANS_FLAG_NOSCRIPTS);
333     REGISTER_ENUM(RPMTRANS_FLAG_JUSTDB);
334     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERS);
335     REGISTER_ENUM(RPMTRANS_FLAG_NODOCS);
336     REGISTER_ENUM(RPMTRANS_FLAG_ALLFILES);
337     REGISTER_ENUM(RPMTRANS_FLAG_KEEPOBSOLETE);
338     REGISTER_ENUM(RPMTRANS_FLAG_REPACKAGE);
339     REGISTER_ENUM(RPMTRANS_FLAG_REVERSE);
340     REGISTER_ENUM(RPMTRANS_FLAG_NOPRE);
341     REGISTER_ENUM(RPMTRANS_FLAG_NOPOST);
342     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPREIN);
343     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERIN);
344     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERUN);
345     REGISTER_ENUM(RPMTRANS_FLAG_NOPREUN);
346     REGISTER_ENUM(RPMTRANS_FLAG_NOPOSTUN);
347     REGISTER_ENUM(RPMTRANS_FLAG_NOTRIGGERPOSTUN);
348     REGISTER_ENUM(RPMTRANS_FLAG_ANACONDA);
349     REGISTER_ENUM(RPMTRANS_FLAG_NOMD5);
350     REGISTER_ENUM(RPMTRANS_FLAG_NOSUGGEST);
351     REGISTER_ENUM(RPMTRANS_FLAG_ADDINDEPS);
352     REGISTER_ENUM(RPMTRANS_FLAG_NOCONFIGS);
353
354     REGISTER_ENUM(RPMPROB_FILTER_IGNOREOS);
355     REGISTER_ENUM(RPMPROB_FILTER_IGNOREARCH);
356     REGISTER_ENUM(RPMPROB_FILTER_REPLACEPKG);
357     REGISTER_ENUM(RPMPROB_FILTER_FORCERELOCATE);
358     REGISTER_ENUM(RPMPROB_FILTER_REPLACENEWFILES);
359     REGISTER_ENUM(RPMPROB_FILTER_REPLACEOLDFILES);
360     REGISTER_ENUM(RPMPROB_FILTER_OLDPACKAGE);
361     REGISTER_ENUM(RPMPROB_FILTER_DISKSPACE);
362     REGISTER_ENUM(RPMPROB_FILTER_DISKNODES);
363
364     REGISTER_ENUM(RPMCALLBACK_UNKNOWN);
365     REGISTER_ENUM(RPMCALLBACK_INST_PROGRESS);
366     REGISTER_ENUM(RPMCALLBACK_INST_START);
367     REGISTER_ENUM(RPMCALLBACK_INST_OPEN_FILE);
368     REGISTER_ENUM(RPMCALLBACK_INST_CLOSE_FILE);
369     REGISTER_ENUM(RPMCALLBACK_TRANS_PROGRESS);
370     REGISTER_ENUM(RPMCALLBACK_TRANS_START);
371     REGISTER_ENUM(RPMCALLBACK_TRANS_STOP);
372     REGISTER_ENUM(RPMCALLBACK_UNINST_PROGRESS);
373     REGISTER_ENUM(RPMCALLBACK_UNINST_START);
374     REGISTER_ENUM(RPMCALLBACK_UNINST_STOP);
375     REGISTER_ENUM(RPMCALLBACK_REPACKAGE_PROGRESS);
376     REGISTER_ENUM(RPMCALLBACK_REPACKAGE_START);
377     REGISTER_ENUM(RPMCALLBACK_REPACKAGE_STOP);
378     REGISTER_ENUM(RPMCALLBACK_UNPACK_ERROR);
379     REGISTER_ENUM(RPMCALLBACK_CPIO_ERROR);
380
381     REGISTER_ENUM(RPMPROB_BADARCH);
382     REGISTER_ENUM(RPMPROB_BADOS);
383     REGISTER_ENUM(RPMPROB_PKG_INSTALLED);
384     REGISTER_ENUM(RPMPROB_BADRELOCATE);
385     REGISTER_ENUM(RPMPROB_REQUIRES);
386     REGISTER_ENUM(RPMPROB_CONFLICT);
387     REGISTER_ENUM(RPMPROB_NEW_FILE_CONFLICT);
388     REGISTER_ENUM(RPMPROB_FILE_CONFLICT);
389     REGISTER_ENUM(RPMPROB_OLDPACKAGE);
390     REGISTER_ENUM(RPMPROB_DISKSPACE);
391     REGISTER_ENUM(RPMPROB_DISKNODES);
392     REGISTER_ENUM(RPMPROB_BADPRETRANS);
393
394     REGISTER_ENUM(VERIFY_DIGEST);
395     REGISTER_ENUM(VERIFY_SIGNATURE);
396
397     REGISTER_ENUM(RPMLOG_EMERG);
398     REGISTER_ENUM(RPMLOG_ALERT);
399     REGISTER_ENUM(RPMLOG_CRIT);
400     REGISTER_ENUM(RPMLOG_ERR);
401     REGISTER_ENUM(RPMLOG_WARNING);
402     REGISTER_ENUM(RPMLOG_NOTICE);
403     REGISTER_ENUM(RPMLOG_INFO);
404     REGISTER_ENUM(RPMLOG_DEBUG);
405
406     REGISTER_ENUM(RPMMIRE_DEFAULT);
407     REGISTER_ENUM(RPMMIRE_STRCMP);
408     REGISTER_ENUM(RPMMIRE_REGEX);
409     REGISTER_ENUM(RPMMIRE_GLOB);
410
411     REGISTER_ENUM(RPMVSF_DEFAULT);
412     REGISTER_ENUM(RPMVSF_NOHDRCHK);
413     REGISTER_ENUM(RPMVSF_NEEDPAYLOAD);
414     REGISTER_ENUM(RPMVSF_NOSHA1HEADER);
415     REGISTER_ENUM(RPMVSF_NOMD5HEADER);
416     REGISTER_ENUM(RPMVSF_NODSAHEADER);
417     REGISTER_ENUM(RPMVSF_NORSAHEADER);
418     REGISTER_ENUM(RPMVSF_NOSHA1);
419     REGISTER_ENUM(RPMVSF_NOMD5);
420     REGISTER_ENUM(RPMVSF_NODSA);
421     REGISTER_ENUM(RPMVSF_NORSA);
422     REGISTER_ENUM(_RPMVSF_NODIGESTS);
423     REGISTER_ENUM(_RPMVSF_NOSIGNATURES);
424     REGISTER_ENUM(_RPMVSF_NOHEADER);
425     REGISTER_ENUM(_RPMVSF_NOPAYLOAD);
426
427     REGISTER_ENUM(TR_ADDED);
428     REGISTER_ENUM(TR_REMOVED);
429
430     PyDict_SetItemString(d, "RPMAL_NOMATCH", o=PyInt_FromLong( (long)RPMAL_NOMATCH ));
431     Py_DECREF(o);
432 }
433
434 /*@}*/