*** empty log message ***
[platform/upstream/rpm.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 #include <db.h>
7
8 /* it shouldn't need these :-( */
9 #include "dbindex.h"
10 #include "header.h"
11
12 int rpmReadPackageInfo(int fd, Header * signatures, Header * hdr);
13 int rpmReadPackageHeader(int fd, Header * hdr, int * isSource, int * major,
14                          int * minor);
15    /* 0 = success */
16    /* 1 = bad magic */
17    /* 2 = error */
18
19 extern const struct headerTagTableEntry rpmTagTable[];
20 extern const int rpmTagTableSize;
21
22 /* this chains to headerDefaultFormats[] */
23 extern const struct headerSprintfExtension rpmHeaderFormats[];
24
25 /* these tags are for both the database and packages */
26 /* none of these can be 0 !!                         */
27
28 #define RPMTAG_NAME                     1000
29 #define RPMTAG_VERSION                  1001
30 #define RPMTAG_RELEASE                  1002
31 #define RPMTAG_SERIAL                   1003
32 #define RPMTAG_SUMMARY                  1004
33 #define RPMTAG_DESCRIPTION              1005
34 #define RPMTAG_BUILDTIME                1006
35 #define RPMTAG_BUILDHOST                1007
36 #define RPMTAG_INSTALLTIME              1008
37 #define RPMTAG_SIZE                     1009
38 #define RPMTAG_DISTRIBUTION             1010
39 #define RPMTAG_VENDOR                   1011
40 #define RPMTAG_GIF                      1012
41 #define RPMTAG_XPM                      1013
42 #define RPMTAG_COPYRIGHT                1014
43 #define RPMTAG_PACKAGER                 1015
44 #define RPMTAG_GROUP                    1016
45 #define RPMTAG_CHANGELOG                1017 /* internal */
46 #define RPMTAG_SOURCE                   1018
47 #define RPMTAG_PATCH                    1019
48 #define RPMTAG_URL                      1020
49 #define RPMTAG_OS                       1021
50 #define RPMTAG_ARCH                     1022
51 #define RPMTAG_PREIN                    1023
52 #define RPMTAG_POSTIN                   1024
53 #define RPMTAG_PREUN                    1025
54 #define RPMTAG_POSTUN                   1026
55 #define RPMTAG_FILENAMES                1027
56 #define RPMTAG_FILESIZES                1028
57 #define RPMTAG_FILESTATES               1029
58 #define RPMTAG_FILEMODES                1030
59 #define RPMTAG_FILEUIDS                 1031 /* internal */
60 #define RPMTAG_FILEGIDS                 1032 /* internal */
61 #define RPMTAG_FILERDEVS                1033
62 #define RPMTAG_FILEMTIMES               1034
63 #define RPMTAG_FILEMD5S                 1035
64 #define RPMTAG_FILELINKTOS              1036
65 #define RPMTAG_FILEFLAGS                1037
66 #define RPMTAG_ROOT                     1038
67 #define RPMTAG_FILEUSERNAME             1039
68 #define RPMTAG_FILEGROUPNAME            1040
69 #define RPMTAG_EXCLUDE                  1041 /* not used - internal */
70 #define RPMTAG_EXCLUSIVE                1042 /* not used - internal */
71 #define RPMTAG_ICON                     1043
72 #define RPMTAG_SOURCERPM                1044
73 #define RPMTAG_FILEVERIFYFLAGS          1045
74 #define RPMTAG_ARCHIVESIZE              1046
75 #define RPMTAG_PROVIDES                 1047
76 #define RPMTAG_REQUIREFLAGS             1048
77 #define RPMTAG_REQUIRENAME              1049
78 #define RPMTAG_REQUIREVERSION           1050
79 #define RPMTAG_NOSOURCE                 1051 /* internal */
80 #define RPMTAG_NOPATCH                  1052 /* internal */
81 #define RPMTAG_CONFLICTFLAGS            1053
82 #define RPMTAG_CONFLICTNAME             1054
83 #define RPMTAG_CONFLICTVERSION          1055
84 #define RPMTAG_DEFAULTPREFIX            1056
85 #define RPMTAG_BUILDROOT                1057
86 #define RPMTAG_INSTALLPREFIX            1058
87 #define RPMTAG_EXCLUDEARCH              1059
88 #define RPMTAG_EXCLUDEOS                1060
89 #define RPMTAG_EXCLUSIVEARCH            1061
90 #define RPMTAG_EXCLUSIVEOS              1062
91 #define RPMTAG_AUTOREQPROV              1063 /* internal */
92 #define RPMTAG_RPMVERSION               1064
93 #define RPMTAG_TRIGGERSCRIPTS           1065 /* internal */
94 #define RPMTAG_TRIGGERNAME              1066 /* internal */
95 #define RPMTAG_TRIGGERVERSION           1067 /* internal */
96 #define RPMTAG_TRIGGERFLAGS             1068 /* internal */
97 #define RPMTAG_TRIGGERINDEX             1069 /* internal */
98 #define RPMTAG_VERIFYSCRIPT             1079
99 #define RPMTAG_CHANGELOGTIME            1080
100 #define RPMTAG_CHANGELOGNAME            1081
101 #define RPMTAG_CHANGELOGTEXT            1082
102 #define RPMTAG_BROKENMD5                1083 /* internal */
103
104 #define RPMTAG_EXTERNAL_TAG             1000000
105
106 #define RPMFILE_STATE_NORMAL            0
107 #define RPMFILE_STATE_REPLACED          1
108 #define RPMFILE_STATE_NOTINSTALLED      2
109 #define RPMFILE_STATE_NETSHARED         3
110
111 /* these can be ORed together */
112 #define RPMFILE_CONFIG                  (1 << 0)
113 #define RPMFILE_DOC                     (1 << 1)
114 #define RPMFILE_SPECFILE                (1 << 2)
115 #define RPMFILE_MISSINGOK               (1 << 3)
116 #define RPMFILE_NOREPLACE               (1 << 4)
117     
118 #define RPMINSTALL_REPLACEPKG           (1 << 0)
119 #define RPMINSTALL_REPLACEFILES         (1 << 1)
120 #define RPMINSTALL_TEST                 (1 << 2)
121 #define RPMINSTALL_UPGRADE              (1 << 3)
122 #define RPMINSTALL_UPGRADETOOLD         (1 << 4)
123 #define RPMINSTALL_NODOCS               (1 << 5)
124 #define RPMINSTALL_NOSCRIPTS            (1 << 6)
125 #define RPMINSTALL_NOARCH               (1 << 7)
126 #define RPMINSTALL_NOOS                 (1 << 8)
127
128 #define RPMUNINSTALL_TEST               (1 << 0)
129 #define RPMUNINSTALL_NOSCRIPTS          (1 << 1)
130
131 #define RPMVERIFY_NONE             0
132 #define RPMVERIFY_MD5              (1 << 0)
133 #define RPMVERIFY_FILESIZE         (1 << 1)
134 #define RPMVERIFY_LINKTO           (1 << 2)
135 #define RPMVERIFY_USER             (1 << 3)
136 #define RPMVERIFY_GROUP            (1 << 4)
137 #define RPMVERIFY_MTIME            (1 << 5)
138 #define RPMVERIFY_MODE             (1 << 6)
139 #define RPMVERIFY_RDEV             (1 << 7)
140 #define RPMVERIFY_ALL              ~(RPMVERIFY_NONE)
141
142 #define RPMSENSE_ANY             0
143 #define RPMSENSE_SERIAL          (1 << 0)
144 #define RPMSENSE_LESS            (1 << 1)
145 #define RPMSENSE_GREATER         (1 << 2)
146 #define RPMSENSE_EQUAL           (1 << 3)
147 #define RPMSENSE_PROVIDES        (1 << 4) /* only used internally by builds */
148 #define RPMSENSE_CONFLICTS       (1 << 5) /* only used internally by builds */
149 #define RPMSENSE_SENSEMASK       15       /* Mask to get senses */
150
151 #define RPMSENSE_TRIGGER_IN      (1 << 16)
152 #define RPMSENSE_TRIGGER_UN      (1 << 17)
153
154 /* Stuff for maintaining "variables" like SOURCEDIR, BUILDDIR, etc */
155
156 #define RPMVAR_SOURCEDIR                0
157 #define RPMVAR_BUILDDIR                 1
158 /* #define RPMVAR_DOCDIR                2 -- No longer used */
159 #define RPMVAR_OPTFLAGS                 3
160 #define RPMVAR_TOPDIR                   4
161 #define RPMVAR_SPECDIR                  5
162 #define RPMVAR_ROOT                     6
163 #define RPMVAR_RPMDIR                   7
164 #define RPMVAR_SRPMDIR                  8
165 /* #define RPMVAR_ARCHSENSITIVE         9  -- No longer used */
166 #define RPMVAR_REQUIREDISTRIBUTION      10
167 /* #define RPMVAR_REQUIREGROUP          11 -- No longer used */
168 #define RPMVAR_REQUIREVENDOR            12
169 #define RPMVAR_DISTRIBUTION             13
170 #define RPMVAR_VENDOR                   14
171 #define RPMVAR_MESSAGELEVEL             15
172 #define RPMVAR_REQUIREICON              16
173 #define RPMVAR_TIMECHECK                17
174 #define RPMVAR_SIGTYPE                  18
175 #define RPMVAR_PGP_PATH                 19
176 #define RPMVAR_PGP_NAME                 20
177 /* #define RPMVAR_PGP_SECRING           21 -- No longer used */
178 /* #define RPMVAR_PGP_PUBRING           22 -- No longer used */
179 #define RPMVAR_EXCLUDEDOCS              23
180 /* #define RPMVAR_BUILDARCH             24 -- No longer used */
181 /* #define RPMVAR_BUILDOS               25 -- No longer used */
182 #define RPMVAR_BUILDROOT                26
183 #define RPMVAR_DBPATH                   27
184 #define RPMVAR_PACKAGER                 28
185 #define RPMVAR_FTPPROXY                 29
186 #define RPMVAR_TMPPATH                  30
187 #define RPMVAR_CPIOBIN                  31
188 #define RPMVAR_FTPPORT                  32
189 #define RPMVAR_NETSHAREDPATH            33
190 #define RPMVAR_DEFAULTDOCDIR            34
191 #define RPMVAR_FIXPERMS                 35
192 #define RPMVAR_GZIPBIN                  36
193 #define RPMVAR_LASTVAR                  37 /* IMPORTANT to keep right! */
194
195 char *rpmGetVar(int var);
196 int rpmGetBooleanVar(int var);
197 void rpmSetVar(int var, char *val);
198
199 /** rpmrc.c **/
200
201 int rpmReadConfigFiles(char * file, char * arch, char * os, int building);
202 int rpmGetOsNum(void);
203 int rpmGetArchNum(void);
204 char *rpmGetOsName(void);
205 char *rpmGetArchName(void);
206 int rpmShowRC(FILE *f);
207 int rpmArchScore(char * arch);
208 int rpmOsScore(char * os);
209
210 /** **/
211
212 typedef struct rpmdb * rpmdb;
213
214 typedef void (*rpmNotifyFunction)(const unsigned long amount,
215                                const unsigned long total);
216
217 int rpmdbOpen (char * root, rpmdb * dbp, int mode, int perms);
218     /* 0 on error */
219 int rpmdbInit(char * root, int perms);
220     /* nonzero on error */
221 void rpmdbClose (rpmdb db);
222
223 int rpmdbFirstRecNum(rpmdb db);
224 int rpmdbNextRecNum(rpmdb db, unsigned int lastOffset);  
225     /* 0 at end, -1 on error */
226
227 Header rpmdbGetRecord(rpmdb db, unsigned int offset);
228 int rpmdbFindByFile(rpmdb db, char * filespec, dbiIndexSet * matches);
229 int rpmdbFindByGroup(rpmdb db, char * group, dbiIndexSet * matches);
230 int rpmdbFindPackage(rpmdb db, char * name, dbiIndexSet * matches);
231 int rpmdbFindByProvides(rpmdb db, char * provides, dbiIndexSet * matches);
232 int rpmdbFindByRequiredBy(rpmdb db, char * requires, dbiIndexSet * matches);
233 int rpmdbFindByConflicts(rpmdb db, char * conflicts, dbiIndexSet * matches);
234
235 int rpmInstallSourcePackage(char * root, int fd, char ** specFile,
236                             rpmNotifyFunction notify, char * labelFormat);
237 int rpmInstallPackage(char * rootdir, rpmdb db, int fd, char * prefix, 
238                       int flags, rpmNotifyFunction notify, char * labelFormat,
239                       char * netsharedPath);
240 int rpmVersionCompare(Header first, Header second);
241 int rpmRemovePackage(char * root, rpmdb db, unsigned int offset, int flags);
242 int rpmdbRebuild(char * root);
243
244 int rpmVerifyFile(char * root, Header h, int filenum, int * result, 
245                   int omitMask);
246 int rpmVerifyScript(char * root, Header h, int err);
247
248 typedef struct rpmDependencyCheck * rpmDependencies;
249
250 struct rpmDependencyConflict {
251     char * byName, * byVersion, * byRelease;
252     /* these needs fields are misnamed -- they are used for the package
253        which isn't needed as well */
254     char * needsName, * needsVersion;
255     int needsFlags;
256     void * suggestedPackage;                    /* NULL if none */
257     enum { RPMDEP_SENSE_REQUIRES, RPMDEP_SENSE_CONFLICTS } sense;
258 } ;
259
260 rpmDependencies rpmdepDependencies(rpmdb db);          /* db may be NULL */
261 void rpmdepAddPackage(rpmDependencies rpmdep, Header h);
262 void rpmdepAvailablePackage(rpmDependencies rpmdep, Header h, void * key);
263 void rpmdepUpgradePackage(rpmDependencies rpmdep, Header h);
264 void rpmdepRemovePackage(rpmDependencies rpmdep, int dboffset);
265 int rpmdepCheck(rpmDependencies rpmdep, 
266                 struct rpmDependencyConflict ** conflicts, int * numConflicts);
267 void rpmdepDone(rpmDependencies rpmdep);
268 void rpmdepFreeConflicts(struct rpmDependencyConflict * conflicts, int
269                          numConflicts);
270
271 /** messages.c **/
272
273 #define RPMMESS_DEBUG      1
274 #define RPMMESS_VERBOSE    2
275 #define RPMMESS_NORMAL     3
276 #define RPMMESS_WARNING    4
277 #define RPMMESS_ERROR      5
278 #define RPMMESS_FATALERROR 6
279
280 #define RPMMESS_QUIET (RPMMESS_NORMAL + 1)
281
282 void rpmIncreaseVerbosity(void);
283 void rpmSetVerbosity(int level);
284 int rpmGetVerbosity(void);
285 int rpmIsVerbose(void);
286 int rpmIsDebug(void);
287
288 /** rpmlead.c **/
289
290 #define RPMLEAD_BINARY 0
291 #define RPMLEAD_SOURCE 1
292
293 #define RPMLEAD_MAGIC0 0xed
294 #define RPMLEAD_MAGIC1 0xab
295 #define RPMLEAD_MAGIC2 0xee
296 #define RPMLEAD_MAGIC3 0xdb
297
298 /* The lead needs to be 8 byte aligned */
299
300 #define RPMLEAD_SIZE 96
301
302 struct rpmlead {
303     unsigned char magic[4];
304     unsigned char major, minor;
305     short type;
306     short archnum;
307     char name[66];
308     short osnum;
309     short signature_type;
310     char reserved[16];      /* pads to 96 bytes -- 8 byte aligned! */
311 } ;
312
313 struct oldrpmlead {             /* for version 1 packages */
314     unsigned char magic[4];
315     unsigned char major, minor;
316     short type;
317     short archnum;
318     char name[66];
319     unsigned int specOffset;
320     unsigned int specLength;
321     unsigned int archiveOffset;
322 } ;
323
324 /** rpmerr.c **/
325
326 typedef void (*rpmErrorCallBackType)(void);
327
328 void rpmError(int code, char * format, ...);
329 int rpmErrorCode(void);
330 char *rpmErrorString(void);
331 rpmErrorCallBackType rpmErrorSetCallback(rpmErrorCallBackType);
332
333 #define RPMERR_GDBMOPEN         -2      /* gdbm open failed */
334 #define RPMERR_GDBMREAD         -3      /* gdbm read failed */
335 #define RPMERR_GDBMWRITE        -4      /* gdbm write failed */
336 #define RPMERR_INTERNAL         -5      /* internal RPM error */
337 #define RPMERR_DBCORRUPT        -6      /* rpm database is corrupt */
338 #define RPMERR_OLDDBCORRUPT     -7      /* old style rpm database is corrupt */
339 #define RPMERR_OLDDBMISSING     -8      /* old style rpm database is missing */
340 #define RPMERR_NOCREATEDB       -9      /* cannot create new database */
341 #define RPMERR_DBOPEN           -10     /* database open failed */
342 #define RPMERR_DBGETINDEX       -11     /* database get from index failed */
343 #define RPMERR_DBPUTINDEX       -12     /* database get from index failed */
344 #define RPMERR_NEWPACKAGE       -13     /* package is too new to handle */
345 #define RPMERR_BADMAGIC         -14     /* bad magic for an RPM */
346 #define RPMERR_RENAME           -15     /* rename(2) failed */
347 #define RPMERR_UNLINK           -16     /* unlink(2) failed */
348 #define RPMERR_RMDIR            -17     /* rmdir(2) failed */
349 #define RPMERR_PKGINSTALLED     -18     /* package already installed */
350 #define RPMERR_CHOWN            -19     /* chown() call failed */
351 #define RPMERR_NOUSER           -20     /* user does not exist */
352 #define RPMERR_NOGROUP          -21     /* group does not exist */
353 #define RPMERR_MKDIR            -22     /* mkdir() call failed */
354 #define RPMERR_FILECONFLICT     -23     /* file being installed exists */
355 #define RPMERR_RPMRC            -24     /* bad line in rpmrc */
356 #define RPMERR_NOSPEC           -25     /* .spec file is missing */
357 #define RPMERR_NOTSRPM          -26     /* a source rpm was expected */
358 #define RPMERR_FLOCK            -27     /* locking the database failed */
359 #define RPMERR_OLDPACKAGE       -28     /* trying upgrading to old version */
360 #define RPMERR_BADARCH          -29     /* bad architecture or arch mismatch */
361 #define RPMERR_CREATE           -30     /* failed to create a file */
362 #define RPMERR_NOSPACE          -31     /* out of disk space */
363 #define RPMERR_NORELOCATE       -32     /* tried to relocate improper package */
364 #define RPMERR_BADOS            -33     /* bad architecture or arch mismatch */
365 #define RPMMESS_BACKUP          -34     /* backup made during [un]install */
366
367 /* spec.c build.c pack.c */
368 #define RPMERR_UNMATCHEDIF      -107    /* unclosed %ifarch or %ifos */
369 #define RPMERR_BADARG           -109
370 #define RPMERR_SCRIPT           -110    /* errors related to script exec */
371 #define RPMERR_READERROR        -111
372 #define RPMERR_UNKNOWNOS        -112
373 #define RPMERR_UNKNOWNARCH      -113
374 #define RPMERR_EXEC             -114
375 #define RPMERR_FORK             -115
376 #define RPMERR_CPIO             -116
377 #define RPMERR_GZIP             -117
378 #define RPMERR_BADSPEC          -118
379 #define RPMERR_LDD              -119    /* couldn't understand ldd output */
380
381 #define RPMERR_BADSIGTYPE       -200    /* Unknown signature type */
382 #define RPMERR_SIGGEN           -201    /* Error generating signature */
383
384 /** signature.c **/
385
386 /**************************************************/
387 /*                                                */
388 /* Signature Tags                                 */
389 /*                                                */
390 /* These go in the sig Header to specify          */
391 /* individual signature types.                    */
392 /*                                                */
393 /**************************************************/
394
395 #define RPMSIGTAG_SIZE                  1000
396 /* the md5 sum was broken *twice* on big endian machines */
397 #define RPMSIGTAG_LEMD5_1               1001
398 #define RPMSIGTAG_PGP                   1002
399 #define RPMSIGTAG_LEMD5_2               1003
400 #define RPMSIGTAG_MD5                   1004
401
402 /**************************************************/
403 /*                                                */
404 /* verifySignature() results                      */
405 /*                                                */
406 /**************************************************/
407
408 /* verifySignature() results */
409 #define RPMSIG_OK        0
410 #define RPMSIG_UNKNOWN   1
411 #define RPMSIG_BAD       2
412 #define RPMSIG_NOKEY     3  /* Do not have the key to check this signature */
413
414 void rpmFreeSignature(Header h);
415
416 int rpmVerifySignature(char *file, int_32 sigTag, void *sig, int count,
417                        char *result);
418
419 #endif