8f3e694afe34a87b25fcf8a8e510c98c23506082
[tools/librpm-tizen.git] / lib / rpmlib.h
1 #ifndef H_RPMLIB
2 #define H_RPMLIB
3
4 /* This is the *only* module users of rpmlib should need to include */
5
6 /* and it shouldn't need these :-( */
7
8 #include <rpmio.h>
9 #include <dbindex.h>
10 #include <header.h>
11 #include <popt.h>
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 int rpmReadPackageInfo(FD_t fd, /*@out@*/ Header * signatures,
18         /*@out@*/ Header * hdr);
19 int rpmReadPackageHeader(FD_t fd, /*@out@*/ Header * hdr,
20         /*@out@*/ int * isSource, /*@out@*/ int * major, /*@out@*/ int * minor);
21
22 int headerNVR(Header h, /*@out@*/ const char **np, /*@out@*/ const char **vp,
23         /*@out@*/ const char **rp);
24
25 void    rpmBuildFileList(Header h, /*@out@*/ const char *** fileListPtr, 
26                         /*@out@*/ int * fileCountPtr);
27
28 /*
29  * XXX This is a "dressed" entry to headerGetEntry to do:
30  *      1) DIRNAME/BASENAME/DIRINDICES -> FILENAMES tag conversions.
31  *      2) i18n lookaside (if enabled).
32  */
33 int rpmHeaderGetEntry(Header h, int_32 tag, /*@out@*/ int_32 *type,
34         /*@out@*/ void **p, /*@out@*/int_32 *c);
35
36    /* 0 = success */
37    /* 1 = bad magic */
38    /* 2 = error */
39
40 extern const struct headerTagTableEntry rpmTagTable[];
41 extern const int rpmTagTableSize;
42
43 /* this chains to headerDefaultFormats[] */
44 extern const struct headerSprintfExtension rpmHeaderFormats[];
45
46 /* these tags are for both the database and packages */
47 /* none of these can be 0 !!                         */
48
49 #define RPMTAG_NAME                     1000
50 #define RPMTAG_VERSION                  1001
51 #define RPMTAG_RELEASE                  1002
52 #define RPMTAG_EPOCH                    1003
53 #define RPMTAG_SERIAL           RPMTAG_EPOCH    /* backward comaptibility */
54 #define RPMTAG_SUMMARY                  1004
55 #define RPMTAG_DESCRIPTION              1005
56 #define RPMTAG_BUILDTIME                1006
57 #define RPMTAG_BUILDHOST                1007
58 #define RPMTAG_INSTALLTIME              1008
59 #define RPMTAG_SIZE                     1009
60 #define RPMTAG_DISTRIBUTION             1010
61 #define RPMTAG_VENDOR                   1011
62 #define RPMTAG_GIF                      1012
63 #define RPMTAG_XPM                      1013
64 #define RPMTAG_LICENSE                  1014
65 #define RPMTAG_COPYRIGHT        RPMTAG_LICENSE  /* backward comaptibility */
66 #define RPMTAG_PACKAGER                 1015
67 #define RPMTAG_GROUP                    1016
68 #define RPMTAG_CHANGELOG                1017 /* internal */
69 #define RPMTAG_SOURCE                   1018
70 #define RPMTAG_PATCH                    1019
71 #define RPMTAG_URL                      1020
72 #define RPMTAG_OS                       1021
73 #define RPMTAG_ARCH                     1022
74 #define RPMTAG_PREIN                    1023
75 #define RPMTAG_POSTIN                   1024
76 #define RPMTAG_PREUN                    1025
77 #define RPMTAG_POSTUN                   1026
78 #define RPMTAG_OLDFILENAMES             1027 /* obsolete */
79 #define RPMTAG_FILESIZES                1028
80 #define RPMTAG_FILESTATES               1029
81 #define RPMTAG_FILEMODES                1030
82 #define RPMTAG_FILEUIDS                 1031 /* internal */
83 #define RPMTAG_FILEGIDS                 1032 /* internal */
84 #define RPMTAG_FILERDEVS                1033
85 #define RPMTAG_FILEMTIMES               1034
86 #define RPMTAG_FILEMD5S                 1035
87 #define RPMTAG_FILELINKTOS              1036
88 #define RPMTAG_FILEFLAGS                1037
89 #define RPMTAG_ROOT                     1038 /* obsolete */
90 #define RPMTAG_FILEUSERNAME             1039
91 #define RPMTAG_FILEGROUPNAME            1040
92 #define RPMTAG_EXCLUDE                  1041 /* internal - depricated */
93 #define RPMTAG_EXCLUSIVE                1042 /* internal - depricated */
94 #define RPMTAG_ICON                     1043
95 #define RPMTAG_SOURCERPM                1044
96 #define RPMTAG_FILEVERIFYFLAGS          1045
97 #define RPMTAG_ARCHIVESIZE              1046
98 #define RPMTAG_PROVIDENAME              1047
99 #define RPMTAG_PROVIDES RPMTAG_PROVIDENAME      /* backward comaptibility */
100 #define RPMTAG_REQUIREFLAGS             1048
101 #define RPMTAG_REQUIRENAME              1049
102 #define RPMTAG_REQUIREVERSION           1050
103 #define RPMTAG_NOSOURCE                 1051 /* internal */
104 #define RPMTAG_NOPATCH                  1052 /* internal */
105 #define RPMTAG_CONFLICTFLAGS            1053
106 #define RPMTAG_CONFLICTNAME             1054
107 #define RPMTAG_CONFLICTVERSION          1055
108 #define RPMTAG_DEFAULTPREFIX            1056 /* internal - deprecated */
109 #define RPMTAG_BUILDROOT                1057
110 #define RPMTAG_INSTALLPREFIX            1058 /* internal - deprecated */
111 #define RPMTAG_EXCLUDEARCH              1059
112 #define RPMTAG_EXCLUDEOS                1060
113 #define RPMTAG_EXCLUSIVEARCH            1061
114 #define RPMTAG_EXCLUSIVEOS              1062
115 #define RPMTAG_AUTOREQPROV              1063 /* internal */
116 #define RPMTAG_RPMVERSION               1064
117 #define RPMTAG_TRIGGERSCRIPTS           1065
118 #define RPMTAG_TRIGGERNAME              1066
119 #define RPMTAG_TRIGGERVERSION           1067
120 #define RPMTAG_TRIGGERFLAGS             1068
121 #define RPMTAG_TRIGGERINDEX             1069
122 #define RPMTAG_VERIFYSCRIPT             1079
123 #define RPMTAG_CHANGELOGTIME            1080
124 #define RPMTAG_CHANGELOGNAME            1081
125 #define RPMTAG_CHANGELOGTEXT            1082
126 #define RPMTAG_BROKENMD5                1083 /* internal */
127 #define RPMTAG_PREREQ                   1084 /* internal */
128 #define RPMTAG_PREINPROG                1085
129 #define RPMTAG_POSTINPROG               1086
130 #define RPMTAG_PREUNPROG                1087
131 #define RPMTAG_POSTUNPROG               1088
132 #define RPMTAG_BUILDARCHS               1089
133 #define RPMTAG_OBSOLETENAME             1090
134 #define RPMTAG_OBSOLETES RPMTAG_OBSOLETENAME    /* backward comaptibility */
135 #define RPMTAG_VERIFYSCRIPTPROG         1091
136 #define RPMTAG_TRIGGERSCRIPTPROG        1092
137 #define RPMTAG_DOCDIR                   1093 /* internal */
138 #define RPMTAG_COOKIE                   1094
139 #define RPMTAG_FILEDEVICES              1095
140 #define RPMTAG_FILEINODES               1096
141 #define RPMTAG_FILELANGS                1097
142 #define RPMTAG_PREFIXES                 1098
143 #define RPMTAG_INSTPREFIXES             1099
144 #define RPMTAG_TRIGGERIN                1100 /* internal */
145 #define RPMTAG_TRIGGERUN                1101 /* internal */
146 #define RPMTAG_TRIGGERPOSTUN            1102 /* internal */
147 #define RPMTAG_AUTOREQ                  1103 /* internal */
148 #define RPMTAG_AUTOPROV                 1104 /* internal */
149 #define RPMTAG_CAPABILITY               1105 /* unused */
150 #define RPMTAG_SOURCEPACKAGE            1106 /* internal */
151 #define RPMTAG_OLDORIGFILENAMES         1107 /* obsolete */
152 #define RPMTAG_BUILDPREREQ              1108 /* internal */
153 #define RPMTAG_BUILDREQUIRES            1109 /* internal */
154 #define RPMTAG_BUILDCONFLICTS           1110 /* internal */
155 #define RPMTAG_BUILDMACROS              1111
156 #define RPMTAG_PROVIDEFLAGS             1112
157 #define RPMTAG_PROVIDEVERSION           1113
158 #define RPMTAG_OBSOLETEFLAGS            1114
159 #define RPMTAG_OBSOLETEVERSION          1115
160 #define RPMTAG_DIRINDEXES               1116
161 #define RPMTAG_BASENAMES                1117
162 #define RPMTAG_DIRNAMES                 1118
163 #define RPMTAG_ORIGDIRINDEXES           1119 /* internal */
164 #define RPMTAG_ORIGBASENAMES            1120 /* internal */
165 #define RPMTAG_ORIGDIRNAMES             1121 /* internal */
166
167 #define RPMTAG_FIRSTFREE_TAG            1122 /* internal */
168 #define RPMTAG_EXTERNAL_TAG             1000000
169
170 #define RPMFILE_STATE_NORMAL            0
171 #define RPMFILE_STATE_REPLACED          1
172 #define RPMFILE_STATE_NOTINSTALLED      2
173 #define RPMFILE_STATE_NETSHARED         3
174
175 /* these can be ORed together */
176 #define RPMFILE_CONFIG                  (1 << 0)
177 #define RPMFILE_DOC                     (1 << 1)
178 #define RPMFILE_DONOTUSE                (1 << 2)
179 #define RPMFILE_MISSINGOK               (1 << 3)
180 #define RPMFILE_NOREPLACE               (1 << 4)
181 #define RPMFILE_SPECFILE                (1 << 5)
182 #define RPMFILE_GHOST                   (1 << 6)
183 #define RPMFILE_LICENSE                 (1 << 7)
184 #define RPMFILE_README                  (1 << 8)
185
186 #define RPMVERIFY_NONE          0
187 #define RPMVERIFY_MD5           (1 << 0)
188 #define RPMVERIFY_FILESIZE      (1 << 1)
189 #define RPMVERIFY_LINKTO        (1 << 2)
190 #define RPMVERIFY_USER          (1 << 3)
191 #define RPMVERIFY_GROUP         (1 << 4)
192 #define RPMVERIFY_MTIME         (1 << 5)
193 #define RPMVERIFY_MODE          (1 << 6)
194 #define RPMVERIFY_RDEV          (1 << 7)
195 #define RPMVERIFY_READLINKFAIL  (1 << 28)
196 #define RPMVERIFY_READFAIL      (1 << 29)
197 #define RPMVERIFY_LSTATFAIL     (1 << 30)
198
199 #define RPMVERIFY_ALL           ~(RPMVERIFY_NONE)
200
201 #define RPMSENSE_ANY            0
202 #define RPMSENSE_SERIAL         (1 << 0) /* eliminated, backward compatibilty */
203 #define RPMSENSE_LESS           (1 << 1)
204 #define RPMSENSE_GREATER        (1 << 2)
205 #define RPMSENSE_EQUAL          (1 << 3)
206 #define RPMSENSE_PROVIDES       (1 << 4) /* only used internally by builds */
207 #define RPMSENSE_CONFLICTS      (1 << 5) /* only used internally by builds */
208 #define RPMSENSE_PREREQ         (1 << 6)
209 #define RPMSENSE_OBSOLETES      (1 << 7) /* only used internally by builds */
210 #define RPMSENSE_SENSEMASK      15       /* Mask to get senses, ie serial, */
211                                          /* less, greater, equal.          */
212
213 #define RPMSENSE_TRIGGERIN      (1 << 16)
214 #define RPMSENSE_TRIGGERUN      (1 << 17)
215 #define RPMSENSE_TRIGGERPOSTUN  (1 << 18)
216 #define RPMSENSE_TRIGGER        (RPMSENSE_TRIGGERIN | RPMSENSE_TRIGGERUN | \
217                                   RPMSENSE_TRIGGERPOSTUN)
218
219 /* Stuff for maintaining "variables" like SOURCEDIR, BUILDDIR, etc */
220
221 /* #define      RPMVAR_SOURCEDIR                0 -- No longer used */
222 /* #define      RPMVAR_BUILDDIR                 1 -- No longer used */
223 /* #define RPMVAR_DOCDIR                        2 -- No longer used */
224 #define RPMVAR_OPTFLAGS                 3
225 /* #define      RPMVAR_TOPDIR                   4 -- No longer used */
226 /* #define      RPMVAR_SPECDIR                  5 -- No longer used */
227 /* #define      RPMVAR_ROOT                     6 -- No longer used */
228 /* #define      RPMVAR_RPMDIR                   7 -- No longer used */
229 /* #define      RPMVAR_SRPMDIR                  8 -- No longer used */
230 /* #define RPMVAR_ARCHSENSITIVE                 9  -- No longer used */
231 /* #define      RPMVAR_REQUIREDISTRIBUTION      10 -- No longer used */
232 /* #define RPMVAR_REQUIREGROUP                  11 -- No longer used */
233 /* #define      RPMVAR_REQUIREVENDOR            12 -- No longer used */
234 /* #define      RPMVAR_DISTRIBUTION             13 -- No longer used */
235 /* #define      RPMVAR_VENDOR                   14 -- No longer used */
236 /* #define      RPMVAR_MESSAGELEVEL             15 -- No longer used */
237 /* #define      RPMVAR_REQUIREICON              16 -- No longer used */
238 /* #define      RPMVAR_TIMECHECK                17 -- No longer used */
239 /* #define      RPMVAR_SIGTYPE                  18 -- No longer used */
240 /* #define      RPMVAR_PGP_PATH                 19 -- No longer used */
241 /* #define      RPMVAR_PGP_NAME                 20 -- No longer used */
242 /* #define      RPMVAR_PGP_SECRING              21 -- No longer used */
243 /* #define      RPMVAR_PGP_PUBRING              22 -- No longer used */
244 /* #define      RPMVAR_EXCLUDEDOCS              23 -- No longer used */
245 /* #define      RPMVAR_BUILDARCH                24 -- No longer used */
246 /* #define      RPMVAR_BUILDOS                  25 -- No longer used */
247 /* #define      RPMVAR_BUILDROOT                26 */
248 /* #define      RPMVAR_DBPATH                   27 -- No longer used */
249 /* #define      RPMVAR_PACKAGER                 28 -- No longer used */
250 /* #define      RPMVAR_FTPPROXY                 29 -- No longer used */
251 /* #define      RPMVAR_TMPPATH                  30 -- No longer used */
252 /* #define      RPMVAR_CPIOBIN                  31 -- No longer used */
253 /* #define      RPMVAR_FTPPORT                  32 -- No longer used */
254 /* #define      RPMVAR_NETSHAREDPATH            33 -- No longer used */
255 /* #define      RPMVAR_DEFAULTDOCDIR            34 -- No longer used */
256 /* #define      RPMVAR_FIXPERMS                 35 -- No longer used */
257 /* #define      RPMVAR_GZIPBIN                  36 -- No longer used */
258 /* #define      RPMVAR_RPMFILENAME              37 -- No longer used */
259 #define RPMVAR_PROVIDES                 38
260 /* #define      RPMVAR_BUILDSHELL               39 -- No longer used */
261 /* #define      RPMVAR_INSTCHANGELOG            40 -- No longer used */
262 /* #define      RPMVAR_BZIP2BIN                 41 -- No longer used */
263 /* #define      RPMVAR_LANGPATT                 42 -- No longer used */
264 #define RPMVAR_INCLUDE                  43
265 /* #define      RPMVAR_ARCH                     44 -- No longer used */
266 /* #define      RPMVAR_OS                       45 -- No longer used */
267 /* #define      RPMVAR_BUILDPLATFORM            46 -- No longer used */
268 /* #define      RPMVAR_BUILDARCH                47 -- No longer used */
269 /* #define      RPMVAR_BUILDOS                  48 -- No longer used */
270 #define RPMVAR_MACROFILES               49
271 /* #define      RPMVAR_GPG_PATH                 51 -- No longer used */
272 /* #define      RPMVAR_GPG_NAME                 52 -- No longer used */
273 /* #define      RPMVAR_HTTPPROXY                53 -- No longer used */
274 /* #define      RPMVAR_HTTPPORT                 54 -- No longer used */
275
276 #define RPMVAR_NUM                      55      /* number of RPMVAR entries */
277
278 #define xfree(_p)       free((void *)_p)
279
280 const char * rpmGetVar(int var);
281 void rpmSetVar(int var, const char *val);
282
283 /** rpmrc.c **/
284
285 #define RPM_MACHTABLE_INSTARCH          0
286 #define RPM_MACHTABLE_INSTOS            1
287 #define RPM_MACHTABLE_BUILDARCH         2
288 #define RPM_MACHTABLE_BUILDOS           3
289 #define RPM_MACHTABLE_COUNT             4       /* number of arch/os tables */
290
291 int rpmReadConfigFiles(const char * file, const char * target);
292 int rpmReadRC(const char * file);
293 void rpmGetArchInfo( /*@out@*/ const char ** name, /*@out@*/ int * num);
294 void rpmGetOsInfo( /*@out@*/ const char ** name, /*@out@*/ int * num);
295 int rpmMachineScore(int type, const char * name);
296 int rpmShowRC(FILE *f);
297 void rpmSetTables(int archTable, int osTable);  /* only used by build code */
298 /* if either are NULL, they are set to the default value (munged uname())
299    pushed through a translation table (if appropriate) */
300 void rpmSetMachine(const char * arch, const char * os);
301 void rpmGetMachine( /*@out@*/ const char **arch, /*@out@*/ const char **os);
302 void rpmFreeRpmrc(void);
303
304 /** **/
305
306 typedef /*@abstract@*/ struct rpmdb_s * rpmdb;
307
308 typedef enum rpmCallbackType_e {
309     RPMCALLBACK_INST_PROGRESS, RPMCALLBACK_INST_START,
310     RPMCALLBACK_INST_OPEN_FILE, RPMCALLBACK_INST_CLOSE_FILE,
311     RPMCALLBACK_TRANS_PROGRESS, RPMCALLBACK_TRANS_START, RPMCALLBACK_TRANS_STOP,
312     RPMCALLBACK_UNINST_PROGRESS, RPMCALLBACK_UNINST_START, RPMCALLBACK_UNINST_STOP
313 } rpmCallbackType;
314 typedef void * (*rpmCallbackFunction)(const Header h, 
315                                       const rpmCallbackType what, 
316                                       const unsigned long amount, 
317                                       const unsigned long total,
318                                       const void * pkgKey, void * data);
319
320 void    urlSetCallback(rpmCallbackFunction notify, void *notifyData, int notifyCount);
321
322 int rpmdbOpen (const char * root, /*@out@*/ rpmdb * dbp, int mode, int perms);
323     /* 0 on error */
324 int rpmdbInit(const char * root, int perms);
325     /* nonzero on error */
326 void rpmdbClose ( /*@only@*/ rpmdb db);
327 /* Databases like this should only have rpmdb*RecNum and rpmdbGetRecord
328    used on them. Anything else could fail! */
329 int rpmdbOpenForTraversal(const char * prefix, /*@out@*/ rpmdb * rpmdbp);
330
331 int rpmdbFirstRecNum(rpmdb db);
332 int rpmdbNextRecNum(rpmdb db, unsigned int lastOffset);
333     /* 0 at end, -1 on error */
334
335 Header rpmdbGetRecord(rpmdb db, unsigned int offset);
336 int rpmdbFindByFile(rpmdb db, const char * filespec,
337         /*@out@*/ dbiIndexSet * matches);
338 int rpmdbFindByGroup(rpmdb db, const char * group,
339         /*@out@*/ dbiIndexSet * matches);
340 int rpmdbFindPackage(rpmdb db, const char * name,
341         /*@out@*/ dbiIndexSet * matches);
342 int rpmdbFindByProvides(rpmdb db, const char * provides,
343         /*@out@*/ dbiIndexSet * matches);
344 int rpmdbFindByRequiredBy(rpmdb db, const char * requires,
345         /*@out@*/ dbiIndexSet * matches);
346 int rpmdbFindByConflicts(rpmdb db, const char * conflicts,
347         /*@out@*/ dbiIndexSet * matches);
348 int rpmdbFindByTriggeredBy(rpmdb db, const char * package,
349         /*@out@*/ dbiIndexSet * matches);
350
351 /* these are just convenience functions */
352 int rpmdbFindByLabel(rpmdb db, const char * label,
353         /*@out@*/ dbiIndexSet * matches);
354 int rpmdbFindByHeader(rpmdb db, Header h,
355         /*@out@*/ dbiIndexSet * matches);
356
357 /* we pass these around as an array with a sentinel */
358 typedef struct rpmRelocation_s {
359     const char * oldPath;       /* NULL here evals to RPMTAG_DEFAULTPREFIX, */
360                                 /* XXX for backwards compatibility */
361     const char * newPath;       /* NULL means to omit the file completely! */
362 } rpmRelocation;
363
364 int rpmInstallSourcePackage(const char * root, FD_t fd, const char ** specFile,
365                             rpmCallbackFunction notify, void * notifyData,
366                             char ** cookie);
367 int rpmVersionCompare(Header first, Header second);
368 int rpmdbRebuild(const char * root);
369
370 int rpmVerifyFile(const char * root, Header h, int filenum,
371         /*@out@*/ int * result, int omitMask);
372 int rpmVerifyScript(const char * root, Header h, FD_t err);
373
374 /* Transaction sets are inherently unordered! RPM may reorder transaction
375    sets to reduce errors. In general, installs/upgrades are done before
376    strict removals, and prerequisite ordering is done on installs/upgrades. */
377 typedef /*@abstract@*/ struct rpmTransactionSet_s * rpmTransactionSet;
378
379 struct rpmDependencyConflict {
380     char * byName, * byVersion, * byRelease;
381     Header byHeader;
382     /* these needs fields are misnamed -- they are used for the package
383        which isn't needed as well */
384     char * needsName, * needsVersion;
385     int needsFlags;
386     /*@observer@*/ /*@null@*/ const void * suggestedPackage; /* NULL if none */
387     enum { RPMDEP_SENSE_REQUIRES, RPMDEP_SENSE_CONFLICTS } sense;
388 } ;
389
390 /* db may be NULL, but don't do things which require the database! */
391 /*@only@*/ rpmTransactionSet rpmtransCreateSet( /*@only@*/ rpmdb db,
392         const char * rootdir);
393
394 /* if fd is NULL, the callback specified in rpmtransCreateSet() is used to
395    open and close the file descriptor. If Header is NULL, the fd is always
396    used, otherwise fd is only needed (and only opened) for actual package 
397    installation
398
399    returns 0 on success, 1 on I/O error, 2 if the package needs capabilities
400    which are not implemented */
401 int rpmtransAddPackage(rpmTransactionSet rpmdep, Header h, FD_t fd,
402                 /*@owned@*/ const void * key, int update,
403                 rpmRelocation * relocs);
404 void rpmtransAvailablePackage(rpmTransactionSet rpmdep, Header h,
405                 /*@owned@*/ const void * key);
406 void rpmtransRemovePackage(rpmTransactionSet rpmdep, int dboffset);
407 void rpmtransFree( /*@only@*/ rpmTransactionSet rpmdep);
408 void rpmtransSetScriptFd(rpmTransactionSet ts, FD_t fd);
409
410 /* this checks for dependency satisfaction, but *not* ordering */
411 int rpmdepCheck(rpmTransactionSet rpmdep,
412         /*@exposed@*/ /*@out@*/ struct rpmDependencyConflict ** conflicts,
413         /*@exposed@*/ /*@out@*/ int * numConflicts);
414
415 /* Orders items, returns error on circle, finals keys[] is NULL. No dependency
416    check is done, use rpmdepCheck() for that. If dependencies are not
417    satisfied a "best-try" ordering is returned. */
418 int rpmdepOrder(rpmTransactionSet order);
419 void rpmdepFreeConflicts( /*@only@*/ struct rpmDependencyConflict * conflicts,
420         int numConflicts);
421
422 #define RPMTRANS_FLAG_TEST              (1 << 0)
423 #define RPMTRANS_FLAG_BUILD_PROBS       (1 << 1)
424 #define RPMTRANS_FLAG_NOSCRIPTS         (1 << 2)
425 #define RPMTRANS_FLAG_JUSTDB            (1 << 3)
426 #define RPMTRANS_FLAG_NOTRIGGERS        (1 << 4)
427 #define RPMTRANS_FLAG_NODOCS            (1 << 5)
428 #define RPMTRANS_FLAG_ALLFILES          (1 << 6)
429 #define RPMTRANS_FLAG_KEEPOBSOLETE      (1 << 7)
430
431 typedef enum rpmProblemType_e { RPMPROB_BADARCH, 
432                                 RPMPROB_BADOS,
433                                 RPMPROB_PKG_INSTALLED,
434                                 RPMPROB_BADRELOCATE,
435                                 RPMPROB_REQUIRES,
436                                 RPMPROB_CONFLICT,
437                                 RPMPROB_NEW_FILE_CONFLICT,
438                                 RPMPROB_FILE_CONFLICT,
439                                 RPMPROB_OLDPACKAGE,
440                                 RPMPROB_DISKSPACE
441                               } rpmProblemType;
442
443 typedef /*@abstract@*/ struct rpmProblem_s {
444     Header h, altH;
445     /*@dependent@*/ const void * key;
446     rpmProblemType type;
447     int ignoreProblem;
448     /*@only@*/ const char * str1;
449     unsigned long ulong1;
450 } rpmProblem;
451
452 typedef /*@abstract@*/ struct rpmProblemSet_s {
453     int numProblems;
454     int numProblemsAlloced;
455     rpmProblem * probs;
456 } * rpmProblemSet;
457
458 void printDepFlags(FILE *fp, const char *version, int flags);
459 void printDepProblems(FILE *fp, struct rpmDependencyConflict *conflicts,
460         int numConflicts);
461
462 /*@only@*/ const char * rpmProblemString(rpmProblem prob);
463 void rpmProblemPrint(FILE *fp, rpmProblem prob);
464 void rpmProblemSetPrint(FILE *fp, rpmProblemSet probs);
465
466 void rpmProblemSetFree( /*@only@*/ rpmProblemSet probs);
467
468 int rpmRunTransactions(rpmTransactionSet ts, rpmCallbackFunction notify,
469                        void * notifyData, rpmProblemSet okProbs,
470                        /*@out@*/ rpmProblemSet * newProbs, int flags,
471                         int ignoreSet);
472
473 #define RPMPROB_FILTER_IGNOREOS         (1 << 0)
474 #define RPMPROB_FILTER_IGNOREARCH       (1 << 1)
475 #define RPMPROB_FILTER_REPLACEPKG       (1 << 2)
476 #define RPMPROB_FILTER_FORCERELOCATE    (1 << 3)
477 #define RPMPROB_FILTER_REPLACENEWFILES  (1 << 4)
478 #define RPMPROB_FILTER_REPLACEOLDFILES  (1 << 5)
479 #define RPMPROB_FILTER_OLDPACKAGE       (1 << 6)
480 #define RPMPROB_FILTER_DISKSPACE        (1 << 7)
481
482 /** messages.c **/
483
484 #define RPMMESS_DEBUG      1
485 #define RPMMESS_VERBOSE    2
486 #define RPMMESS_NORMAL     3
487 #define RPMMESS_WARNING    4
488 #define RPMMESS_ERROR      5
489 #define RPMMESS_FATALERROR 6
490
491 #define RPMMESS_QUIET (RPMMESS_NORMAL + 1)
492
493 void rpmIncreaseVerbosity(void);
494 void rpmSetVerbosity(int level);
495 int rpmGetVerbosity(void);
496 int rpmIsVerbose(void);
497 int rpmIsDebug(void);
498 void rpmMessage(int level, const char * format, ...);
499
500 /** rpmlead.c **/
501
502 #define RPMLEAD_BINARY 0
503 #define RPMLEAD_SOURCE 1
504
505 #define RPMLEAD_MAGIC0 0xed
506 #define RPMLEAD_MAGIC1 0xab
507 #define RPMLEAD_MAGIC2 0xee
508 #define RPMLEAD_MAGIC3 0xdb
509
510 /* The lead needs to be 8 byte aligned */
511
512 #define RPMLEAD_SIZE 96
513
514 struct rpmlead {
515     unsigned char magic[4];
516     unsigned char major, minor;
517     short type;
518     short archnum;
519     char name[66];
520     short osnum;
521     short signature_type;
522     char reserved[16];      /* pads to 96 bytes -- 8 byte aligned! */
523 } ;
524
525 struct oldrpmlead {             /* for version 1 packages */
526     unsigned char magic[4];
527     unsigned char major, minor;
528     short type;
529     short archnum;
530     char name[66];
531     unsigned int specOffset;
532     unsigned int specLength;
533     unsigned int archiveOffset;
534 } ;
535
536 /** rpmerr.c **/
537
538 typedef void (*rpmErrorCallBackType)(void);
539
540 #if defined(__GNUC__)
541 void rpmError(int code, char * format, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
542 #else
543 void rpmError(int code, char * format, ...);
544 #endif
545
546 int rpmErrorCode(void);
547 char *rpmErrorCodeString(void);
548 char *rpmErrorString(void);
549 rpmErrorCallBackType rpmErrorSetCallback(rpmErrorCallBackType);
550
551 #define RPMERR_GDBMOPEN         -2      /* gdbm open failed */
552 #define RPMERR_GDBMREAD         -3      /* gdbm read failed */
553 #define RPMERR_GDBMWRITE        -4      /* gdbm write failed */
554 #define RPMERR_INTERNAL         -5      /* internal RPM error */
555 #define RPMERR_DBCORRUPT        -6      /* rpm database is corrupt */
556 #define RPMERR_OLDDBCORRUPT     -7      /* old style rpm database is corrupt */
557 #define RPMERR_OLDDBMISSING     -8      /* old style rpm database is missing */
558 #define RPMERR_NOCREATEDB       -9      /* cannot create new database */
559 #define RPMERR_DBOPEN           -10     /* database open failed */
560 #define RPMERR_DBGETINDEX       -11     /* database get from index failed */
561 #define RPMERR_DBPUTINDEX       -12     /* database get from index failed */
562 #define RPMERR_NEWPACKAGE       -13     /* package is too new to handle */
563 #define RPMERR_BADMAGIC         -14     /* bad magic for an RPM */
564 #define RPMERR_RENAME           -15     /* rename(2) failed */
565 #define RPMERR_UNLINK           -16     /* unlink(2) failed */
566 #define RPMERR_RMDIR            -17     /* rmdir(2) failed */
567 #define RPMERR_PKGINSTALLED     -18     /* package already installed */
568 #define RPMERR_CHOWN            -19     /* chown() call failed */
569 #define RPMERR_NOUSER           -20     /* user does not exist */
570 #define RPMERR_NOGROUP          -21     /* group does not exist */
571 #define RPMERR_MKDIR            -22     /* mkdir() call failed */
572 #define RPMERR_FILECONFLICT     -23     /* file being installed exists */
573 #define RPMERR_RPMRC            -24     /* bad line in rpmrc */
574 #define RPMERR_NOSPEC           -25     /* .spec file is missing */
575 #define RPMERR_NOTSRPM          -26     /* a source rpm was expected */
576 #define RPMERR_FLOCK            -27     /* locking the database failed */
577 #define RPMERR_OLDPACKAGE       -28     /* trying upgrading to old version */
578 /*#define       RPMERR_BADARCH  -29        bad architecture or arch mismatch */
579 #define RPMERR_CREATE           -30     /* failed to create a file */
580 #define RPMERR_NOSPACE          -31     /* out of disk space */
581 #define RPMERR_NORELOCATE       -32     /* tried to do improper relocatation */
582 /*#define       RPMERR_BADOS    -33        bad architecture or arch mismatch */
583 #define RPMMESS_BACKUP          -34     /* backup made during [un]install */
584 #define RPMERR_MTAB             -35     /* failed to read mount table */
585 #define RPMERR_STAT             -36     /* failed to stat something */
586 #define RPMERR_BADDEV           -37     /* file on device not listed in mtab */
587 #define RPMMESS_ALTNAME         -38     /* file written as .rpmnew */
588 #define RPMMESS_PREREQLOOP      -39     /* loop in prerequisites */
589 #define RPMERR_BADRELOCATE      -40     /* bad relocation was specified */
590 #define RPMERR_OLDDB            -41     /* old format database */
591
592 /* spec.c build.c pack.c */
593 #define RPMERR_UNMATCHEDIF      -107    /* unclosed %ifarch or %ifos */
594 #define RPMERR_BADARG           -109
595 #define RPMERR_SCRIPT           -110    /* errors related to script exec */
596 #define RPMERR_READERROR        -111
597 #define RPMERR_UNKNOWNOS        -112
598 #define RPMERR_UNKNOWNARCH      -113
599 #define RPMERR_EXEC             -114
600 #define RPMERR_FORK             -115
601 #define RPMERR_CPIO             -116
602 #define RPMERR_GZIP             -117
603 #define RPMERR_BADSPEC          -118
604 #define RPMERR_LDD              -119    /* couldn't understand ldd output */
605 #define RPMERR_BADFILENAME      -120
606
607 #define RPMERR_BADSIGTYPE       -200    /* Unknown signature type */
608 #define RPMERR_SIGGEN           -201    /* Error generating signature */
609
610 /** signature.c **/
611
612 /**************************************************/
613 /*                                                */
614 /* Signature Tags                                 */
615 /*                                                */
616 /* These go in the sig Header to specify          */
617 /* individual signature types.                    */
618 /*                                                */
619 /**************************************************/
620
621 #define RPMSIGTAG_SIZE                  1000
622 /* the md5 sum was broken *twice* on big endian machines */
623 #define RPMSIGTAG_LEMD5_1               1001
624 #define RPMSIGTAG_PGP                   1002
625 #define RPMSIGTAG_LEMD5_2               1003
626 #define RPMSIGTAG_MD5                   1004
627 #define RPMSIGTAG_GPG                   1005
628 #define RPMSIGTAG_PGP5                  1006    /* XXX legacy use only */
629
630 /* Signature tags by Public Key Algorithm (RFC 2440) */
631 /* N.B.: These tags are tenative, the values may change */
632 #define RPMTAG_PK_BASE                  2048
633 #define RPMTAG_PK_RSA_ES                RPMTAG_PK_BASE+1
634 #define RPMTAG_PK_RSA_E                 RPMTAG_PK_BASE+2
635 #define RPMTAG_PK_RSA_S                 RPMTAG_PK_BASE+3
636 #define RPMTAG_PK_ELGAMAL_E             RPMTAG_PK_BASE+16
637 #define RPMTAG_PK_DSA                   RPMTAG_PK_BASE+17
638 #define RPMTAG_PK_ELLIPTIC              RPMTAG_PK_BASE+18
639 #define RPMTAG_PK_ECDSA                 RPMTAG_PK_BASE+19
640 #define RPMTAG_PK_ELGAMAL_ES            RPMTAG_PK_BASE+20
641 #define RPMTAG_PK_DH                    RPMTAG_PK_BASE+21
642
643 #define RPMTAG_HASH_BASE                2048+64
644 #define RPMTAG_HASH_MD5                 RPMTAG_HASH_BASE+1
645 #define RPMTAG_HASH_SHA1                RPMTAG_HASH_BASE+2
646 #define RPMTAG_HASH_RIPEMD160           RPMTAG_HASH_BASE+3
647 #define RPMTAG_HASH_MD2                 RPMTAG_HASH_BASE+5
648 #define RPMTAG_HASH_TIGER192            RPMTAG_HASH_BASE+6
649 #define RPMTAG_HASH_HAVAL_5_160         RPMTAG_HASH_BASE+7
650
651 /**************************************************/
652 /*                                                */
653 /* verifySignature() results                      */
654 /*                                                */
655 /**************************************************/
656
657 /* verifySignature() results */
658 #define RPMSIG_OK               0
659 #define RPMSIG_UNKNOWN          1
660 #define RPMSIG_BAD              2
661 #define RPMSIG_NOKEY            3  /* Do not have the key to check this signature */
662 #define RPMSIG_NOTTRUSTED       4  /* We have the key but it is not trusted */
663
664 void rpmFreeSignature(Header h);
665
666 int rpmVerifySignature(const char *file, int_32 sigTag, void *sig, int count,
667                        char *result);
668
669 void freeFilesystems(void);
670 int rpmGetFilesystemList( /*@out@*/ const char *** listptr, /*@out@*/int * num);
671 int rpmGetFilesystemUsage(const char ** filelist, int_32 * fssizes,
672         int numFiles, /*@out@*/ uint_32 ** usagesPtr, int flags);
673
674 /* ==================================================================== */
675 /* --- query/verify */
676
677 /* XXX SPECFILE is not verify sources */
678 enum rpmQVSources { RPMQV_PACKAGE = 0, RPMQV_PATH, RPMQV_ALL, RPMQV_RPM, 
679                        RPMQV_GROUP, RPMQV_WHATPROVIDES, RPMQV_WHATREQUIRES,
680                        RPMQV_TRIGGEREDBY, RPMQV_DBOFFSET, RPMQV_SPECFILE };
681
682 extern struct poptOption rpmQVSourcePoptTable[];
683
684 struct rpmQVArguments {
685     enum rpmQVSources qva_source;
686     int         qva_sourceCount;        /* > 1 is an error */
687     int         qva_flags;
688     int         qva_verbose;
689     const char *qva_queryFormat;
690     const char *qva_prefix;
691 };
692 typedef struct rpmQVArguments QVA_t;
693
694 typedef int (*QVF_t) (QVA_t *qva, rpmdb db, Header h);
695 int showMatches(QVA_t *qva, rpmdb db, dbiIndexSet matches, QVF_t showPackage);
696
697 #define QUERY_FOR_LIST          (1 << 1)
698 #define QUERY_FOR_STATE         (1 << 2)
699 #define QUERY_FOR_DOCS          (1 << 3)
700 #define QUERY_FOR_CONFIG        (1 << 4)
701 #define QUERY_FOR_DUMPFILES     (1 << 8)
702
703 /*@observer@*/ const char *const tagName(int tag);
704 extern int specedit;
705 extern char * i18ndomains;
706 extern struct poptOption rpmQueryPoptTable[];
707
708 void rpmDisplayQueryTags(FILE * f);
709 int rpmQueryVerify(QVA_t *qva, enum rpmQVSources source, const char * arg,
710         rpmdb db, QVF_t showPackage);
711
712 int showQueryPackage(QVA_t *qva, rpmdb db, Header h);
713 int rpmQuery(QVA_t *qva, enum rpmQVSources source, const char * arg);
714
715 #define VERIFY_FILES            (1 <<  9)
716 #define VERIFY_DEPS             (1 << 10)
717 #define VERIFY_SCRIPT           (1 << 11)
718 #define VERIFY_MD5              (1 << 12)
719
720 extern struct poptOption rpmVerifyPoptTable[];
721
722 int showVerifyPackage(QVA_t *qva, /*@only@*/ rpmdb db, Header h);
723 int rpmVerify(QVA_t *qva, enum rpmQVSources source, const char *arg);
724
725 /* ==================================================================== */
726 /* --- install/upgrade/erase */
727
728 #define INSTALL_PERCENT         (1 << 0)
729 #define INSTALL_HASH            (1 << 1)
730 #define INSTALL_NODEPS          (1 << 2)
731 #define INSTALL_NOORDER         (1 << 3)
732 #define INSTALL_LABEL           (1 << 4)  /* set if we're being verbose */
733 #define INSTALL_UPGRADE         (1 << 5)
734
735 #define UNINSTALL_NODEPS        (1 << 0)
736 #define UNINSTALL_ALLMATCHES    (1 << 1)
737
738 int rpmInstall(const char * rootdir, const char ** argv, int installFlags, 
739               int interfaceFlags, int probFilter, rpmRelocation * relocations);
740 int rpmInstallSource(const char * prefix, const char * arg, const char ** specFile,
741                     char ** cookie);
742 int rpmErase(const char * rootdir, const char ** argv, int uninstallFlags, 
743                  int interfaceFlags);
744
745 /* ==================================================================== */
746 /* --- checksig/resign */
747
748 #define CHECKSIG_PGP (1 << 0)
749 #define CHECKSIG_MD5 (1 << 1)
750 #define CHECKSIG_GPG (1 << 2)
751
752 int rpmCheckSig(int flags, const char **argv);
753 int rpmReSign(int add, char *passPhrase, const char **argv);
754
755 #define ADD_SIGNATURE 1
756 #define NEW_SIGNATURE 0
757
758 #ifdef __cplusplus
759 }
760 #endif
761
762 #endif  /* H_RPMLIB */