7 #include <rpm/rpmtypes.h>
8 #include <rpm/header.h>
9 #include <rpm/rpmstring.h>
13 static int NEVRA(Header h, const char **np,
14 uint32_t **ep, const char **vp, const char **rp,
17 if (np) *np = headerGetString(h, RPMTAG_NAME);
18 if (vp) *vp = headerGetString(h, RPMTAG_VERSION);
19 if (rp) *rp = headerGetString(h, RPMTAG_RELEASE);
20 if (ap) *ap = headerGetString(h, RPMTAG_ARCH);
23 headerGet(h, RPMTAG_EPOCH, &td, HEADERGET_DEFAULT);
24 *ep = rpmtdGetUint32(&td);
29 int headerNVR(Header h, const char **np, const char **vp, const char **rp)
31 return NEVRA(h, np, NULL, vp, rp, NULL);
34 int headerNEVRA(Header h, const char **np,
35 uint32_t **ep, const char **vp, const char **rp,
38 return NEVRA(h, np, ep, vp, rp, ap);
41 static char *getNEVRA(Header h, rpmTag tag, const char **np)
43 if (np) *np = headerGetString(h, RPMTAG_NAME);
44 return headerGetAsString(h, tag);
47 char * headerGetNEVR(Header h, const char ** np)
49 return getNEVRA(h, RPMTAG_NEVR, np);
52 char * headerGetNEVRA(Header h, const char ** np)
54 return getNEVRA(h, RPMTAG_NEVRA, np);
57 char * headerGetEVR(Header h, const char ** np)
59 return getNEVRA(h, RPMTAG_EVR, np);
62 rpm_color_t headerGetColor(Header h)
64 return headerGetNumber(h, RPMTAG_HEADERCOLOR);
67 int headerIsSource(Header h)
69 return (!headerIsEntry(h, RPMTAG_SOURCERPM));
72 Header headerCopy(Header h)
74 Header nh = headerNew();
78 hi = headerInitIterator(h);
79 while (headerNext(hi, &td)) {
80 if (rpmtdCount(&td) > 0) {
81 (void) headerPut(nh, &td, HEADERPUT_DEFAULT);
85 headerFreeIterator(hi);
87 return headerReload(nh, RPMTAG_HEADERIMAGE);
90 void headerCopyTags(Header headerFrom, Header headerTo,
91 const rpmTagVal * tagstocopy)
96 if (headerFrom == headerTo)
99 for (p = tagstocopy; *p != 0; p++) {
100 if (headerIsEntry(headerTo, *p))
102 if (!headerGet(headerFrom, *p, &td, (HEADERGET_MINMEM|HEADERGET_RAW)))
104 (void) headerPut(headerTo, &td, HEADERPUT_DEFAULT);
109 char * headerGetAsString(Header h, rpmTagVal tag)
114 if (headerGet(h, tag, &td, HEADERGET_EXT)) {
115 if (rpmtdCount(&td) == 1) {
116 res = rpmtdFormat(&td, RPMTD_FORMAT_STRING, NULL);
123 const char * headerGetString(Header h, rpmTagVal tag)
125 const char *res = NULL;
128 if (headerGet(h, tag, &td, HEADERGET_MINMEM)) {
129 if (rpmtdCount(&td) == 1) {
130 res = rpmtdGetString(&td);
137 uint64_t headerGetNumber(Header h, rpmTagVal tag)
142 if (headerGet(h, tag, &td, HEADERGET_EXT)) {
143 if (rpmtdCount(&td) == 1) {
144 res = rpmtdGetNumber(&td);
152 * Sanity check data types against tag table before putting. Assume
153 * append on all array-types.
155 static int headerPutType(Header h, rpmTagVal tag, rpmTagType reqtype,
156 rpm_constdata_t data, rpm_count_t size)
159 rpmTagType type = rpmTagGetTagType(tag);
160 rpmTagReturnType retype = rpmTagGetReturnType(tag);
161 headerPutFlags flags = HEADERPUT_APPEND;
164 /* Basic sanity checks: type must match and there must be data to put */
166 || size < 1 || data == NULL || h == NULL) {
171 * Non-array types can't be appended to. Binary types use size
172 * for data length, for other non-array types size must be 1.
174 if (retype != RPM_ARRAY_RETURN_TYPE) {
175 flags = HEADERPUT_DEFAULT;
176 if (type != RPM_BIN_TYPE && size != 1) {
185 td.data = (void *) data;
188 valid = headerPut(h, &td, flags);
194 int headerPutString(Header h, rpmTagVal tag, const char *val)
196 rpmTagType type = rpmTagGetTagType(tag);
197 const void *sptr = NULL;
199 /* string arrays expect char **, arrange that */
200 if (type == RPM_STRING_ARRAY_TYPE || type == RPM_I18NSTRING_TYPE) {
202 } else if (type == RPM_STRING_TYPE) {
208 return headerPutType(h, tag, type, sptr, 1);
211 int headerPutStringArray(Header h, rpmTagVal tag, const char **array, rpm_count_t size)
213 return headerPutType(h, tag, RPM_STRING_ARRAY_TYPE, array, size);
216 int headerPutChar(Header h, rpmTagVal tag, const char *val, rpm_count_t size)
218 return headerPutType(h, tag, RPM_CHAR_TYPE, val, size);
221 int headerPutUint8(Header h, rpmTagVal tag, const uint8_t *val, rpm_count_t size)
223 return headerPutType(h, tag, RPM_INT8_TYPE, val, size);
226 int headerPutUint16(Header h, rpmTagVal tag, const uint16_t *val, rpm_count_t size)
228 return headerPutType(h, tag, RPM_INT16_TYPE, val, size);
231 int headerPutUint32(Header h, rpmTagVal tag, const uint32_t *val, rpm_count_t size)
233 return headerPutType(h, tag, RPM_INT32_TYPE, val, size);
236 int headerPutUint64(Header h, rpmTagVal tag, const uint64_t *val, rpm_count_t size)
238 return headerPutType(h, tag, RPM_INT64_TYPE, val, size);
241 int headerPutBin(Header h, rpmTagVal tag, const uint8_t *val, rpm_count_t size)
243 return headerPutType(h, tag, RPM_BIN_TYPE, val, size);