7 * An rpm header carries all information about a package. A header is
8 * a collection of data elements called tags. Each tag has a data type,
9 * and includes 1 or more values.
13 /* RPM - Copyright (C) 1995-2001 Red Hat Software */
15 #include <rpm/rpmio.h>
16 #include <rpm/rpmtypes.h>
17 #include <rpm/rpmtd.h>
18 #include <rpm/rpmutil.h>
25 * Include calculation for 8 bytes of (magic, 0)?
33 * Create new (empty) header instance.
36 Header headerNew(void);
39 * Dereference a header instance.
43 Header headerFree( Header h);
46 * Reference a header instance.
48 * @return new header reference
50 Header headerLink(Header h);
53 * Dereference a header instance.
55 * @return new header reference
57 Header headerUnlink(Header h);
60 * Sort tags in header.
63 void headerSort(Header h);
66 * Restore tags in header to original ordering.
69 void headerUnsort(Header h);
72 * Return size of on-disk header representation in bytes.
74 * @param magicp include size of 8 bytes for (magic, 0)?
75 * @return size of on-disk header
77 unsigned int headerSizeof(Header h, enum hMagic magicp);
80 * Perform simple sanity and range checks on header tag(s).
81 * @param il no. of tags in header
82 * @param dl no. of bytes in header data.
83 * @param pev 1st element in tag array, big-endian
84 * @param iv failing (or last) tag element, host-endian
85 * @param negate negative offset expected?
86 * @return -1 on success, otherwise failing tag element index
88 int headerVerifyInfo(int il, int dl, const void * pev, void * iv, int negate);
91 * Convert header to on-disk representation.
92 * @param h header (with pointers)
93 * @return on-disk header blob (i.e. with offsets)
95 void * headerUnload(Header h);
98 * Convert header to on-disk representation, and then reload.
99 * This is used to insure that all header data is in one chunk.
100 * @param h header (with pointers)
101 * @param tag region tag
102 * @return on-disk header (with offsets)
104 Header headerReload(Header h, rpmTag tag);
107 * Duplicate a header.
109 * @return new header instance
111 Header headerCopy(Header h);
114 * Convert header to in-memory representation.
115 * @param uh on-disk header blob (i.e. with offsets)
118 Header headerLoad(void * uh);
121 * Make a copy and convert header to in-memory representation.
122 * @param uh on-disk header blob (i.e. with offsets)
125 Header headerCopyLoad(const void * uh);
128 * Read (and load) header from file handle.
129 * @param fd file handle
130 * @param magicp read (and verify) 8 bytes of (magic, 0)?
131 * @return header (or NULL on error)
133 Header headerRead(FD_t fd, enum hMagic magicp);
136 * Write (with unload) header to file handle.
137 * @param fd file handle
139 * @param magicp prefix write with 8 bytes of (magic, 0)?
140 * @return 0 on success, 1 on error
142 int headerWrite(FD_t fd, Header h, enum hMagic magicp);
145 * Check if tag is in header.
148 * @return 1 on success, 0 on failure
150 int headerIsEntry(Header h, rpmTag tag);
152 typedef enum headerGetFlags_e {
153 HEADERGET_DEFAULT = 0,
154 HEADERGET_MINMEM = (1 << 0), /* string pointers refer to header memory */
155 HEADERGET_EXT = (1 << 1), /* lookup extension types too */
156 HEADERGET_RAW = (1 << 2), /* return raw contents (no i18n lookups) */
160 * Retrieve tag value.
163 * @retval td tag data container
164 * @param flags retrieval modifier flags
165 * @return 1 on success, 0 on failure
167 int headerGet(Header h, rpmTag tag, rpmtd td, headerGetFlags flags);
170 * Free data allocated when retrieved from header.
172 * @param data pointer to tag value(s)
173 * @param type type of data (or -1 to force free)
174 * @return NULL always
176 void * headerFreeTag(Header h, rpm_data_t data, rpmTagType type);
179 * Retrieve tag value.
180 * Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements with
181 * RPM_I18NSTRING_TYPE equivalent entries are translated (if HEADER_I18NTABLE
186 * @retval *type tag value data type (or NULL)
187 * @retval *p pointer to tag value(s) (or NULL)
188 * @retval *c number of values (or NULL)
189 * @return 1 on success, 0 on failure
191 int headerGetEntry(Header h, rpmTag tag,
197 * Retrieve tag value using header internal array.
198 * Get an entry using as little extra RAM as possible to return the tag value.
199 * This is only an issue for RPM_STRING_ARRAY_TYPE.
203 * @retval *type tag value data type (or NULL)
204 * @retval *p pointer to tag value(s) (or NULL)
205 * @retval *c number of values (or NULL)
206 * @return 1 on success, 0 on failure
208 int headerGetEntryMinMemory(Header h, rpmTag tag,
213 typedef enum headerPutFlags_e {
214 HEADERPUT_DEFAULT = 0,
215 HEADERPUT_APPEND = (1 << 0),
219 * Add or append tag to header.
222 * @param td tag data container
223 * @param flags flags to control operation
224 * @return 1 on success, 0 on failure
226 int headerPut(Header h, rpmtd td, headerPutFlags flags);
230 * Duplicate tags are okay, but only defined for iteration (with the
231 * exceptions noted below). While you are allowed to add i18n string
232 * arrays through this function, you probably don't mean to. See
233 * headerAddI18NString() instead.
237 * @param type tag value data type
238 * @param p pointer to tag value(s)
239 * @param c number of values
240 * @return 1 on success, 0 on failure
242 int headerAddEntry(Header h, rpmTag tag, rpmTagType type, rpm_constdata_t p, rpm_count_t c);
245 * Append element to tag array in header.
246 * Appends item p to entry w/ tag and type as passed. Won't work on
247 * RPM_STRING_TYPE. Any pointers into header memory returned from
248 * headerGetEntryMinMemory() for this entry are invalid after this
249 * call has been made!
253 * @param type tag value data type
254 * @param p pointer to tag value(s)
255 * @param c number of values
256 * @return 1 on success, 0 on failure
258 int headerAppendEntry(Header h, rpmTag tag, rpmTagType type,
259 rpm_constdata_t p, rpm_count_t c);
262 * Add or append element to tag array in header.
265 * @param type tag value data type
266 * @param p pointer to tag value(s)
267 * @param c number of values
268 * @return 1 on success, 0 on failure
270 int headerAddOrAppendEntry(Header h, rpmTag tag, rpmTagType type,
271 rpm_constdata_t p, rpm_count_t c);
274 * Add locale specific tag to header.
275 * A NULL lang is interpreted as the C locale. Here are the rules:
277 * - If the tag isn't in the header, it's added with the passed string
279 * - If the tag occurs multiple times in entry, which tag is affected
280 * by the operation is undefined.
281 * - If the tag is in the header w/ this language, the entry is
282 * *replaced* (like headerModifyEntry()).
284 * This function is intended to just "do the right thing". If you need
285 * more fine grained control use headerAddEntry() and headerModifyEntry().
289 * @param string tag value
291 * @return 1 on success, 0 on failure
293 int headerAddI18NString(Header h, rpmTag tag, const char * string,
297 * Modify tag in header.
298 * If there are multiple entries with this tag, the first one gets replaced.
301 * @param type tag value data type
302 * @param p pointer to tag value(s)
303 * @param c number of values
304 * @return 1 on success, 0 on failure
306 int headerModifyEntry(Header h, rpmTag tag, rpmTagType type,
307 rpm_constdata_t p, rpm_count_t c);
310 * Delete tag in header.
311 * Removes all entries of type tag from the header, returns 1 if none were
316 * @return 0 on success, 1 on failure (INCONSISTENT)
318 int headerRemoveEntry(Header h, rpmTag tag);
321 * Return formatted output string from header tags.
322 * The returned string must be free()d.
325 * @param fmt format to use
326 * @retval errmsg error message (if any)
327 * @return formatted output string (malloc'ed)
329 char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg);
332 * Return formatted output string from header tags.
333 * The returned string must be free()d.
336 * @param fmt format to use
337 * @param tbltags array of tag name/value pairs (unused)
338 * @param extensions chained table of formatting extensions. (unused)
339 * @retval errmsg error message (if any)
340 * @return formatted output string (malloc'ed)
342 char * headerSprintf(Header h, const char * fmt,
343 void * tbltags, void * extensions,
344 errmsg_t * errmsg) RPM_GNUC_DEPRECATED;
347 * Duplicate tag values from one header into another.
348 * @param headerFrom source header
349 * @param headerTo destination header
350 * @param tagstocopy array of tags that are copied
352 void headerCopyTags(Header headerFrom, Header headerTo,
353 const rpmTag * tagstocopy);
356 * Destroy header tag iterator.
357 * @param hi header tag iterator
358 * @return NULL always
360 HeaderIterator headerFreeIterator(HeaderIterator hi);
363 * Create header tag iterator.
365 * @return header tag iterator
367 HeaderIterator headerInitIterator(Header h);
370 * Return next tag from header.
371 * @param hi header tag iterator
372 * @retval td tag data container
373 * @return 1 on success, 0 on failure
375 int headerNext(HeaderIterator hi, rpmtd td);
378 * Return next tag from header.
379 * @deprecated Use headerNext() instead.
381 * @param hi header tag iterator
383 * @retval *type tag value data type
384 * @retval *p pointer to tag value(s)
385 * @retval *c number of values
386 * @return 1 on success, 0 on failure
388 int headerNextIterator(HeaderIterator hi,
392 rpm_count_t * c) RPM_GNUC_DEPRECATED;
397 * Free data allocated when retrieved from header.
398 * @deprecated Use headerFreeTag() instead.
399 * @todo Remove from API.
401 * @param data address of data (or NULL)
402 * @param type type of data (or RPM_FORCEFREE_TYPE to force free)
403 * @return NULL always
405 void * headerFreeData(rpm_data_t data, rpmTagType type);
408 * Return name, version, release strings from header.
410 * @retval *np name pointer (or NULL)
411 * @retval *vp version pointer (or NULL)
412 * @retval *rp release pointer (or NULL)
415 int headerNVR(Header h,
421 * Return name, epoch, version, release, arch strings from header.
423 * @retval *np name pointer (or NULL)
424 * @retval *ep epoch pointer (or NULL)
425 * @retval *vp version pointer (or NULL)
426 * @retval *rp release pointer (or NULL)
427 * @retval *ap arch pointer (or NULL)
430 int headerNEVRA(Header h,
438 * Return (malloc'd) header name-version-release string.
440 * @retval np name tag value
441 * @return name-version-release string
443 char * headerGetNEVR(Header h, const char ** np );
446 * Return (malloc'd) header name-version-release.arch string.
448 * @retval np name tag value
449 * @return name-version-release string
451 char * headerGetNEVRA(Header h, const char ** np );
454 * Return (malloc'd) header (epoch:)version-release string.
456 * @retval np name tag value (or NULL)
457 * @return (epoch:)version-release string
459 char * headerGetEVR(Header h, const char **np);
462 * Return header color.
464 * @return header color
466 rpm_color_t headerGetColor(Header h);
469 * Check if header is a source or binary package header
471 * @return 0 == binary, 1 == source
473 int headerIsSource(Header h);
475 /* ==================================================================== */
478 * Prototype for headerFreeData() vector.
480 * @param data address of data (or NULL)
481 * @param type type of data (or to force free)
482 * @return NULL always
485 void * (*HFD_t) (rpm_data_t data, rpmTagType type);
488 * Prototype for headerGetEntry() vector.
490 * Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements with
491 * RPM_I18NSTRING_TYPE equivalent entries are translated (if HEADER_I18NTABLE
496 * @retval type address of tag value data type (or NULL)
497 * @retval p address of pointer to tag value(s) (or NULL)
498 * @retval c address of number of values (or NULL)
499 * @return 1 on success, 0 on failure
501 typedef int (*HGE_t) (Header h, rpmTag tag,
507 * Prototype for headerAddEntry() vector.
509 * Duplicate tags are okay, but only defined for iteration (with the
510 * exceptions noted below). While you are allowed to add i18n string
511 * arrays through this function, you probably don't mean to. See
512 * headerAddI18NString() instead.
516 * @param type tag value data type
517 * @param p pointer to tag value(s)
518 * @param c number of values
519 * @return 1 on success, 0 on failure
521 typedef int (*HAE_t) (Header h, rpmTag tag, rpmTagType type,
522 rpm_constdata_t p, rpm_count_t c);
525 * Prototype for headerModifyEntry() vector.
526 * If there are multiple entries with this tag, the first one gets replaced.
530 * @param type tag value data type
531 * @param p pointer to tag value(s)
532 * @param c number of values
533 * @return 1 on success, 0 on failure
535 typedef int (*HME_t) (Header h, rpmTag tag, rpmTagType type,
536 rpm_constdata_t p, rpm_count_t c);
539 * Prototype for headerRemoveEntry() vector.
540 * Delete tag in header.
541 * Removes all entries of type tag from the header, returns 1 if none were
546 * @return 0 on success, 1 on failure (INCONSISTENT)
548 typedef int (*HRE_t) (Header h, rpmTag tag);
554 #endif /* H_HEADER */