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 hi = headerFreeIterator(hi);
87 return headerReload(nh, RPMTAG_HEADERIMAGE);
90 void headerCopyTags(Header headerFrom, Header headerTo,
91 const rpmTag * 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, rpmTag 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, rpmTag 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, rpmTag 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, rpmTag tag, rpmTagType reqtype,
156 rpm_constdata_t data, rpm_count_t size)
159 rpmTagType type = rpmTagGetType(tag);
160 headerPutFlags flags = HEADERPUT_APPEND;
163 /* Basic sanity checks: type must match and there must be data to put */
164 if ((type & RPM_MASK_TYPE) != reqtype
165 || size < 1 || data == NULL || h == NULL) {
170 * Non-array types can't be appended to. Binary types use size
171 * for data length, for other non-array types size must be 1.
173 if ((type & RPM_MASK_RETURN_TYPE) != RPM_ARRAY_RETURN_TYPE) {
174 flags = HEADERPUT_DEFAULT;
175 if ((type & RPM_MASK_TYPE) != RPM_BIN_TYPE && size != 1) {
183 td.type = type & RPM_MASK_TYPE;
184 td.data = (void *) data;
187 valid = headerPut(h, &td, flags);
193 int headerPutString(Header h, rpmTag tag, const char *val)
195 rpmTagType type = rpmTagGetType(tag) & RPM_MASK_TYPE;
196 const void *sptr = NULL;
198 /* string arrays expect char **, arrange that */
199 if (type == RPM_STRING_ARRAY_TYPE || type == RPM_I18NSTRING_TYPE) {
201 } else if (type == RPM_STRING_TYPE) {
207 return headerPutType(h, tag, type, sptr, 1);
210 int headerPutStringArray(Header h, rpmTag tag, const char **array, rpm_count_t size)
212 return headerPutType(h, tag, RPM_STRING_ARRAY_TYPE, array, size);
215 int headerPutChar(Header h, rpmTag tag, const char *val, rpm_count_t size)
217 return headerPutType(h, tag, RPM_CHAR_TYPE, val, size);
220 int headerPutUint8(Header h, rpmTag tag, const uint8_t *val, rpm_count_t size)
222 return headerPutType(h, tag, RPM_INT8_TYPE, val, size);
225 int headerPutUint16(Header h, rpmTag tag, const uint16_t *val, rpm_count_t size)
227 return headerPutType(h, tag, RPM_INT16_TYPE, val, size);
230 int headerPutUint32(Header h, rpmTag tag, const uint32_t *val, rpm_count_t size)
232 return headerPutType(h, tag, RPM_INT32_TYPE, val, size);
235 int headerPutUint64(Header h, rpmTag tag, const uint64_t *val, rpm_count_t size)
237 return headerPutType(h, tag, RPM_INT64_TYPE, val, size);
240 int headerPutBin(Header h, rpmTag tag, const uint8_t *val, rpm_count_t size)
242 return headerPutType(h, tag, RPM_BIN_TYPE, val, size);