10 #define _RPMTAG_INTERNAL 28 int (*cmp) (
const void * avp,
const void * bvp))
33 char * s =
rpmExpand(
"%{?_arbitrary_tags}", NULL);
39 if (aTags && aTags[0] && aTags[1])
40 (void)
argvSort(aTags, (
int (*) (
const char **,
const char **))cmp);
58 static int tagCmpName(
const void * avp,
const void * bvp)
63 return strcmp(a->name, b->name);
77 int ret = ((int)a->val - (
int)b->val);
80 ret = ((int)strlen(b->name) - (int)strlen(a->name));
92 int (*cmp) (
const void * avp,
const void * bvp))
101 for (tte =
rpmTagTable; tte->name != NULL; tte++) {
109 qsort(ip, n,
sizeof(*ip), cmp);
124 if (!strncasecmp(s,
"RPMTAG_",
sizeof(
"RPMTAG_")-1))
125 s +=
sizeof(
"RPMTAG_") - 1;
127 while ((c = (
int)*se++) &&
xisalnum(c))
130 te = t = (
char *)
xmalloc(nb+1);
131 if (*s !=
'\0' && nb > 0) {
146 const char * digest = NULL;
147 size_t digestlen = 0;
148 size_t nb = strlen(s);
154 if (digest && digestlen > 4) {
155 memcpy(&tag, digest + (digestlen - 4), 4);
156 tag = (
rpmTag) (tag & 0x3fffffff);
157 tag = (
rpmTag) (tag | 0x40000000);
159 digest =
_free(digest);
191 size_t nameBufLen = 0;
198 if (_rpmTags.aTags == NULL)
200 if (_rpmTags.byValue == NULL)
201 xx =
tagLoadIndex(&_rpmTags.byValue, &_rpmTags.byValueSize,
203 if (_rpmTags.nameBufLen == 0)
204 _rpmTags.nameBufLen = 256;
205 if (_rpmTags.nameBuf == NULL)
206 _rpmTags.nameBuf = (
char *)
xcalloc(1, _rpmTags.nameBufLen);
207 nameBuf = _rpmTags.nameBuf;
208 nameBuf[0] = nameBuf[1] =
'\0';
209 nameBufLen = _rpmTags.nameBufLen;
213 strncpy(nameBuf,
"Packages", nameBufLen);
216 strncpy(nameBuf,
"Depcache", nameBufLen);
219 strncpy(nameBuf,
"Added", nameBufLen);
222 strncpy(nameBuf,
"Removed", nameBufLen);
225 strncpy(nameBuf,
"Available", nameBufLen);
228 strncpy(nameBuf,
"Hdlist", nameBufLen);
231 strncpy(nameBuf,
"Arglist", nameBufLen);
234 strncpy(nameBuf,
"Ftswalk", nameBufLen);
237 strncpy(nameBuf,
"Seqno", nameBufLen);
240 strncpy(nameBuf,
"Btree", nameBufLen);
243 strncpy(nameBuf,
"Hash", nameBufLen);
246 strncpy(nameBuf,
"Queue", nameBufLen);
249 strncpy(nameBuf,
"Recno", nameBufLen);
252 strncpy(nameBuf,
"Heap", nameBufLen);
257 strncpy(nameBuf,
"Conflictname", nameBufLen);
260 strncpy(nameBuf,
"Sha1header", nameBufLen);
265 strncpy(nameBuf,
"Filenames", nameBufLen);
269 if (_rpmTags.byValue == NULL)
272 u = _rpmTags.byValueSize;
275 t = _rpmTags.byValue[i];
277 comparison = ((int)tag - (
int)t->val);
281 else if (comparison > 0)
285 while (i > 0 && tag == _rpmTags.byValue[i-1]->val) {
287 t = _rpmTags.byValue[i];
289 s = (*_rpmTags.tagCanonicalize) (t->name);
290 strncpy(nameBuf, s, nameBufLen);
297 if (nameBuf[0] ==
'\0')
298 xx =
snprintf(nameBuf, nameBufLen,
"Tag_0x%08x", (
unsigned) tag);
299 nameBuf[nameBufLen-1] =
'\0';
313 if (_rpmTags.aTags == NULL)
315 if (_rpmTags.byValue == NULL)
335 if (_rpmTags.byValue == NULL)
338 u = _rpmTags.byValueSize;
341 t = _rpmTags.byValue[i];
343 comparison = ((int)tag - (
int)t->val);
347 else if (comparison > 0)
351 while (i > 0 && t->val == _rpmTags.byValue[i-1]->val) {
353 t = _rpmTags.byValue[i];
373 if (!strncasecmp(tagstr,
"RPMTAG_",
sizeof(
"RPMTAG_")-1))
374 tagstr +=
sizeof(
"RPMTAG_") - 1;
405 if (_rpmTags.aTags == NULL)
407 if (_rpmTags.byName == NULL)
409 if (_rpmTags.byName == NULL)
413 u = _rpmTags.byNameSize;
416 t = _rpmTags.byName[i];
418 comparison =
xstrcasecmp(tagstr, t->name + (
sizeof(
"RPMTAG_")-1));
422 else if (comparison > 0)
438 return ((*rpmTags->tagName)(tag));
443 return ((*rpmTags->tagType)(tag));
448 return ((*rpmTags->tagValue)(tagstr));
453 return ((*rpmTags->tagCanonicalize)(s));
458 return ((*rpmTags->tagGenerate)(s));
463 if (_rpmTags == NULL)
466 _rpmTags->nameBuf =
_free(_rpmTags->nameBuf);
467 _rpmTags->byName =
_free(_rpmTags->byName);
468 _rpmTags->byValue =
_free(_rpmTags->byValue);
469 _rpmTags->aTags =
argvFree(_rpmTags->aTags);
475 if (dbiTags != NULL) {
477 for (i = 0; i < dbiNTags; i++) {
478 dbiTags[i].str =
_free(dbiTags[i].str);
481 dbiTags =
_free(dbiTags);
486 #if defined(SUPPORT_IMPLICIT_TAG_DATA_TYPES) 491 void tagTypeValidate(
HE_t he);
492 void tagTypeValidate(
HE_t he)
496 #if !defined(SUPPORT_I18NSTRING_TYPE) 503 if ((he->
tag & 0x40000000)
512 if (!(he->
tag == 62))
513 if (!(he->
tag == 261 || he->
tag == 269))
514 if (!(he->
tag == 1000 || he->
tag == 1004 || he->
tag == 1007))
515 if (!(he->
tag == 1086 || he->
tag == 1087))
517 fprintf(stderr,
"==> warning: tag %u type(0x%x) != implicit type(0x%x)\n", (
unsigned) he->
tag, he->
t,
tagType(he->
tag));
headerTagTableEntry rpmTagTable
Automatically generated table of tag name/value pairs.
char * tagCanonicalize(const char *s)
Canonicalize a rpmTag string.
rpmTag tagValue(const char *tagstr)
Return tag value from name.
rpmTag tagGenerate(const char *s)
Generate a tag from arbitrary string.
static char * _tagCanonicalize(const char *s)
unsigned int tagType(rpmTag tag)
Return tag data type from value.
static int xtoupper(int c)
static int tagCmpName(const void *avp, const void *bvp)
Compare tag table entries by name.
static int xisalnum(int c)
void tagClean(headerTagIndices _rpmTags)
Free memory in header tag indices.
DIGEST_CTX rpmDigestInit(pgpHashAlgo hashalgo, rpmDigestFlags flags)
Initialize digest.
static int tagLoadATags(ARGV_t *argvp, int(*cmp)(const void *avp, const void *bvp))
Load/sort arbitrary tags.
rpmiob rpmiobFree(rpmiob iob)
Destroy a I/O buffer instance.
static int xtolower(int c)
void * xcalloc(size_t nmemb, size_t size)
static int tagLoadIndex(headerTagTableEntry **ipp, size_t *np, int(*cmp)(const void *avp, const void *bvp))
Load/sort a tag index.
int rpmDigestUpdate(DIGEST_CTX ctx, const void *data, size_t len)
Update context with next plain text buffer.
ARGV_t argvFree(ARGV_t argv)
Destroy an argv array.
struct tagStore_s * tagStore_t
static struct headerTagIndices_s _rpmTags
static rpmTag _tagGenerate(const char *s)
const char * tagName(rpmTag tag)
Return tag name from value.
int xstrcasecmp(const char *s1, const char *s2)
Locale insensitive strcasecmp(3).
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
static int tagCmpValue(const void *avp, const void *bvp)
Compare tag table entries by value.
static int snprintf(char *buf, int nb, const char *fmt,...)
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
int rpmTagTableSize
Number of entries in rpmTagTable.
const struct headerTagTableEntry_s * headerTagTableEntry
int argvSplit(ARGV_t *argvp, const char *str, const char *seps)
Split a string into an argv array.
tagStore_t tagStoreFree(tagStore_t dbiTags, size_t dbiNTags)
Destroy tagStore array.
int argvSort(ARGV_t argv, int(*compar)(ARGstr_t *, ARGstr_t *))
Sort an argv array.
int rpmDigestFinal(DIGEST_CTX ctx, void *datap, size_t *lenp, int asAscii)
Return digest and destroy context.
struct headerTagIndices_s * headerTagIndices
static const char * _tagName(rpmTag tag)
static unsigned int _tagType(rpmTag tag)
static rpmTag _tagValue(const char *tagstr)
#define RPMDBI_PACKAGES
Pseudo-tags used by the rpmdb and rpmgi iterator API's.