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>
27 extern const unsigned char rpm_header_magic[8];
30 * Include calculation for 8 bytes of (magic, 0)?
38 * Create new (empty) header instance.
41 Header headerNew(void);
44 * Dereference a header instance.
48 Header headerFree( Header h);
51 * Reference a header instance.
53 * @return new header reference
55 Header headerLink(Header h);
58 * Sort tags in header.
61 void headerSort(Header h);
64 * Restore tags in header to original ordering.
67 void headerUnsort(Header h);
70 * Return size of on-disk header representation in bytes.
72 * @param magicp include size of 8 bytes for (magic, 0)?
73 * @return size of on-disk header
75 unsigned int headerSizeof(Header h, int magicp);
78 * Perform simple sanity and range checks on header tag(s).
79 * @param il no. of tags in header
80 * @param dl no. of bytes in header data.
81 * @param pev 1st element in tag array, big-endian
82 * @param iv failing (or last) tag element, host-endian
83 * @param negate negative offset expected?
84 * @return -1 on success, otherwise failing tag element index
86 int headerVerifyInfo(int il, int dl, const void * pev, void * iv, int negate);
89 * Convert header to on-disk representation.
90 * @deprecated Use headerExport() instead
91 * @param h header (with pointers)
92 * @return on-disk header blob (i.e. with offsets)
94 void * headerUnload(Header h);
97 * Export header to on-disk representation.
98 * @param h header (with pointers)
99 * @retval bsize on-disk header blob size in bytes
100 * @return on-disk header blob (i.e. with offsets)
102 void * headerExport(Header h, unsigned int * bsize);
105 * Convert header to on-disk representation, and then reload.
106 * This is used to insure that all header data is in one chunk.
107 * @param h header (with pointers)
108 * @param tag region tag
109 * @return on-disk header (with offsets)
111 Header headerReload(Header h, rpmTagVal tag);
114 * Duplicate a header.
116 * @return new header instance
118 Header headerCopy(Header h);
121 * Convert header to in-memory representation.
122 * @deprecated Use headerImport() instead
123 * @param uh on-disk header blob (i.e. with offsets)
126 Header headerLoad(void * uh);
129 * Make a copy and convert header to in-memory representation.
130 * @deprecated Use headerImport() instead
131 * @param uh on-disk header blob (i.e. with offsets)
134 Header headerCopyLoad(const void * uh);
136 enum headerImportFlags_e {
137 HEADERIMPORT_COPY = (1 << 0), /* Make copy of blob on import? */
138 HEADERIMPORT_FAST = (1 << 1), /* Faster but less safe? */
141 typedef rpmFlags headerImportFlags;
144 * Import header to in-memory representation.
145 * @param blob on-disk header blob (i.e. with offsets)
146 * @param bsize on-disk header blob size in bytes (0 if unknown)
147 * @param flags flags to control operation
150 Header headerImport(void *blob, unsigned int bsize, headerImportFlags flags);
153 * Read (and load) header from file handle.
154 * @param fd file handle
155 * @param magicp read (and verify) 8 bytes of (magic, 0)?
156 * @return header (or NULL on error)
158 Header headerRead(FD_t fd, int magicp);
161 * Write (with unload) header to file handle.
162 * @param fd file handle
164 * @param magicp prefix write with 8 bytes of (magic, 0)?
165 * @return 0 on success, 1 on error
167 int headerWrite(FD_t fd, Header h, int magicp);
170 * Check if tag is in header.
173 * @return 1 on success, 0 on failure
175 int headerIsEntry(Header h, rpmTagVal tag);
178 * Modifier flags for headerGet() operation.
179 * For consistent behavior you'll probably want to use ALLOC to ensure
180 * the caller owns the data, but MINMEM is useful for avoiding extra
181 * copy of data when you are sure the header wont go away.
182 * Most of the time you'll probably want EXT too, but note that extensions
183 * tags don't generally honor the other flags, MINMEM, RAW, ALLOC and ARGV
184 * are only relevant for non-extension data.
186 enum headerGetFlags_e {
187 HEADERGET_DEFAULT = 0, /* legacy headerGetEntry() behavior */
188 HEADERGET_MINMEM = (1 << 0), /* pointers can refer to header memory */
189 HEADERGET_EXT = (1 << 1), /* lookup extension types too */
190 HEADERGET_RAW = (1 << 2), /* return raw contents (no i18n lookups) */
191 HEADERGET_ALLOC = (1 << 3), /* always allocate memory for all data */
192 HEADERGET_ARGV = (1 << 4), /* return string arrays NULL-terminated */
195 typedef rpmFlags headerGetFlags;
198 * Retrieve tag value.
201 * @retval td tag data container
202 * @param flags retrieval modifier flags
203 * @return 1 on success, 0 on failure
205 int headerGet(Header h, rpmTagVal tag, rpmtd td, headerGetFlags flags);
208 enum headerPutFlags_e {
209 HEADERPUT_DEFAULT = 0,
210 HEADERPUT_APPEND = (1 << 0),
213 typedef rpmFlags headerPutFlags;
216 * Add or append tag to header.
219 * @param td tag data container
220 * @param flags flags to control operation
221 * @return 1 on success, 0 on failure
223 int headerPut(Header h, rpmtd td, headerPutFlags flags);
227 * Type-safe methods for inserting tag data to header.
228 * Tag data type is validated to match the function type, ie things like
229 * headerPutUint32(h, RPMTAG_NAME, ...) will return failure. For non-array
230 * types size must equal 1, and data is checked to be non-NULL. For array
231 * types, add-or-append mode is always used.
233 * headerPutString() can be used on both RPM_STRING_TYPE and
234 * RPM_STRING_ARRAY_TYPE (to add a single string into the array) tags,
235 * for others the type must match exactly.
237 * These are intended to "do the right thing" in the common case, if you
238 * need more fine grained control use headerPut() & friends instead.
239 * @todo Make doxygen group these meaningfully.
242 * @param tag tag to insert
243 * @param val pointer to value(s)
244 * @param size number of items in array (1 or larger)
245 * @return 1 on success, 0 on failure
248 int headerPutString(Header h, rpmTagVal tag, const char *val);
249 int headerPutStringArray(Header h, rpmTagVal tag, const char **val, rpm_count_t size);
250 int headerPutBin(Header h, rpmTagVal tag, const uint8_t *val, rpm_count_t size);
251 int headerPutChar(Header h, rpmTagVal tag, const char *val, rpm_count_t size);
252 int headerPutUint8(Header h, rpmTagVal tag, const uint8_t *val, rpm_count_t size);
253 int headerPutUint16(Header h, rpmTagVal tag, const uint16_t *val, rpm_count_t size);
254 int headerPutUint32(Header h, rpmTagVal tag, const uint32_t *val, rpm_count_t size);
255 int headerPutUint64(Header h, rpmTagVal tag, const uint64_t *val, rpm_count_t size);
259 * Add locale specific tag to header.
260 * A NULL lang is interpreted as the C locale. Here are the rules:
262 * - If the tag isn't in the header, it's added with the passed string
264 * - If the tag occurs multiple times in entry, which tag is affected
265 * by the operation is undefined.
266 * - If the tag is in the header w/ this language, the entry is
267 * *replaced* (like headerMod()).
269 * This function is intended to just "do the right thing". If you need
270 * more fine grained control use headerPut() and headerMod().
274 * @param string tag value
276 * @return 1 on success, 0 on failure
278 int headerAddI18NString(Header h, rpmTagVal tag, const char * string,
282 * Modify tag in header.
283 * If there are multiple entries with this tag, the first one gets replaced.
285 * @param td tag data container
286 * @return 1 on success, 0 on failure
288 int headerMod(Header h, rpmtd td);
291 * Delete tag in header.
292 * Removes all entries of type tag from the header, returns 1 if none were
297 * @return 0 on success, 1 on failure (INCONSISTENT)
299 int headerDel(Header h, rpmTagVal tag);
302 * Return formatted output string from header tags.
303 * The returned string must be free()d.
306 * @param fmt format to use
307 * @retval errmsg error message (if any)
308 * @return formatted output string (malloc'ed)
310 char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg);
313 * Duplicate tag values from one header into another.
314 * @param headerFrom source header
315 * @param headerTo destination header
316 * @param tagstocopy array of tags that are copied
318 void headerCopyTags(Header headerFrom, Header headerTo,
319 const rpmTagVal * tagstocopy);
322 * Destroy header tag iterator.
323 * @param hi header tag iterator
324 * @return NULL always
326 HeaderIterator headerFreeIterator(HeaderIterator hi);
329 * Create header tag iterator.
331 * @return header tag iterator
333 HeaderIterator headerInitIterator(Header h);
336 * Return next tag contents from header.
337 * @param hi header tag iterator
338 * @retval td tag data container
339 * @return 1 on success, 0 on failure
341 int headerNext(HeaderIterator hi, rpmtd td);
344 * Return next tag number from header.
345 * @param hi header tag iterator
346 * @return next tag, RPMTAG_NOT_FOUND to stop iteration
348 rpmTagVal headerNextTag(HeaderIterator hi);
351 * Return name, version, release strings from header.
353 * @retval *np name pointer (or NULL)
354 * @retval *vp version pointer (or NULL)
355 * @retval *rp release pointer (or NULL)
359 int headerNVR(Header h,
365 * Return name, epoch, version, release, arch strings from header.
367 * @retval *np name pointer (or NULL)
368 * @retval *ep epoch pointer (or NULL)
369 * @retval *vp version pointer (or NULL)
370 * @retval *rp release pointer (or NULL)
371 * @retval *ap arch pointer (or NULL)
375 int headerNEVRA(Header h,
383 * Return (malloc'd) header name-version-release string.
385 * @retval np name tag value
386 * @return name-version-release string
389 char * headerGetNEVR(Header h, const char ** np );
392 * Return (malloc'd) header name-version-release.arch string.
394 * @retval np name tag value
395 * @return name-version-release string
398 char * headerGetNEVRA(Header h, const char ** np );
401 * Return (malloc'd) header (epoch:)version-release string.
403 * @retval np name tag value (or NULL)
404 * @return (epoch:)version-release string
407 char * headerGetEVR(Header h, const char **np);
410 * Return any non-array tag from header, converted to string
412 * @param tag tag to retrieve
413 * @return string pointer (malloced) or NULL on failure
415 char * headerGetAsString(Header h, rpmTagVal tag);
418 * Return a simple string tag from header
420 * @param tag tag to retrieve
421 * @return string pointer (to header memory) or NULL on failure
423 const char * headerGetString(Header h, rpmTagVal tag);
426 * Return a simple number tag (or extension) from header
428 * @param tag tag to retrieve
429 * @return numeric tag value or 0 on failure
431 uint64_t headerGetNumber(Header h, rpmTagVal tag);
434 * Return header color.
436 * @return header color
439 rpm_color_t headerGetColor(Header h);
442 * Check if header is a source or binary package header
444 * @return 0 == binary, 1 == source
446 int headerIsSource(Header h);
449 * Return header instance, ie is the header from rpmdb.
451 * @return rpmdb record number or 0
453 unsigned int headerGetInstance(Header h);
455 typedef enum headerConvOps_e {
456 HEADERCONV_EXPANDFILELIST = 0,
457 HEADERCONV_COMPRESSFILELIST = 1,
458 HEADERCONV_RETROFIT_V3 = 2,
462 * Convert header to/from (legacy) data presentation
464 * @param op one of headerConvOps operations
465 * @return 1 on success, 0 on failure
467 int headerConvert(Header h, int op);
473 #endif /* H_HEADER */