8 #if defined(HAVE_ICONV)
10 #if defined(__LCLINT__)
12 extern iconv_t iconv_open(
const char *__tocode,
const char *__fromcode)
15 extern size_t iconv(iconv_t __cd,
char ** __inbuf,
16 size_t * __inbytesleft,
18 size_t * __outbytesleft)
22 extern int iconv_close( iconv_t __cd)
28 #if defined(HAVE_LANGINFO_H)
30 #if defined(__LCLINT__)
32 extern char *nl_langinfo (nl_item __item)
38 #define _MIRE_INTERNAL
47 #define _RPMTAG_INTERNAL
49 #define _RPMEVR_INTERNAL
88 const char * istr = NULL;
93 if (fmt == NULL || *fmt ==
'\0')
116 istr = he->
p.
argv[ix];
119 {
static char hex[] =
"0123456789abcdef";
120 const char * s = he->
p.
str;
129 *t++ = hex[ (i >> 4) & 0xf ];
130 *t++ = hex[ (i ) & 0xf ];
140 char myfmt[] =
"%llX";
141 myfmt[3] = ((fmt != NULL && *fmt !=
'\0') ? *fmt :
'd');
197 const char * strftimeFormat)
209 { time_t dateint = he->
p.
ui64p[0];
210 tstruct = localtime(&dateint);
214 (void) strftime(buf,
sizeof(buf) - 1, strftimeFormat, tstruct);
215 buf[
sizeof(buf) - 1] =
'\0';
269 xx =
snprintf(val, nb,
"%llu", (
unsigned long long)he->
p.
ui64p[0]);
273 const char * s = he->
p.
str;
278 for (s = he->
p.
str; (c = (
int)*s) != 0; s++) {
286 for (s = he->
p.
str; (c = (
int)*s) != 0; s++) {
287 if (c == (
int)
'\'') {
303 { HEADER_EXT_FORMAT,
"octal",
305 { HEADER_EXT_FORMAT,
"oct",
307 { HEADER_EXT_FORMAT,
"hex",
309 { HEADER_EXT_FORMAT,
"decimal",
311 { HEADER_EXT_FORMAT,
"dec",
313 { HEADER_EXT_FORMAT,
"date",
315 { HEADER_EXT_FORMAT,
"day",
317 { HEADER_EXT_FORMAT,
"shescape",
319 { HEADER_EXT_LAST, NULL, { NULL } }
328 char *perms =
xstrdup(
"----------");
332 else if (S_ISDIR(mode))
336 else if (S_ISFIFO(mode))
342 else if (S_ISCHR(mode))
344 else if (S_ISBLK(mode))
349 if (mode & S_IRUSR) perms[1] =
'r';
350 if (mode & S_IWUSR) perms[2] =
'w';
351 if (mode & S_IXUSR) perms[3] =
'x';
353 if (mode & S_IRGRP) perms[4] =
'r';
354 if (mode & S_IWGRP) perms[5] =
'w';
355 if (mode & S_IXGRP) perms[6] =
'x';
357 if (mode & S_IROTH) perms[7] =
'r';
358 if (mode & S_IWOTH) perms[8] =
'w';
359 if (mode & S_IXOTH) perms[9] =
'x';
362 perms[3] = ((mode & S_IXUSR) ?
's' :
'S');
365 perms[6] = ((mode & S_IXGRP) ?
's' :
'S');
368 perms[9] = ((mode & S_IXOTH) ?
't' :
'T');
382 int ix = (he->
ix > 0 ? he->
ix : 0);
390 if (anint & RPMSENSE_TRIGGERPREIN)
392 else if (anint & RPMSENSE_TRIGGERIN)
394 else if (anint & RPMSENSE_TRIGGERUN)
396 else if (anint & RPMSENSE_TRIGGERPOSTUN)
413 int ix = (he->
ix > 0 ? he->
ix : 0);
436 int ix = (he->
ix >= 0 ? he->
ix : 0);
478 int ix = (he->
ix > 0 ? he->
ix : 0);
480 const unsigned char * s;
488 s = (
unsigned char *) he->
p.
ui8p;
498 if (b64decode(enc, (
void **)&s, &ns))
509 return xstrdup(
_(
"(invalid type)"));
529 int ix = (he->
ix > 0 ? he->
ix : 0);
540 val =
xstrdup(
_(
"(invalid type :base64)"));
544 ns =
sizeof(he->
p.
ui64p[0]);
547 ns = strlen(he->
p.
str);
554 nt = ((ns + 2) / 3) * 4;
558 if (b64encode_chars_per_line > 0 && b64encode_eolstr != NULL) {
559 lc = (nt + b64encode_chars_per_line - 1) / b64encode_chars_per_line;
560 if (((nt + b64encode_chars_per_line - 1) % b64encode_chars_per_line) != 0)
562 nt += lc * strlen(b64encode_eolstr);
570 {
unsigned char * _data =
xcalloc(1, ns+1);
571 assert(he->
p.
ptr != NULL);
572 memcpy(_data, he->
p.
ptr, ns);
574 if ((enc = b64encode(_data, ns)) != NULL) {
579 _data =
_free(_data);
599 while ((c = (
int) *s++) != (
int)
'\0') {
602 case '>': len +=
sizeof(
"<") - 1;
break;
603 case '&': len +=
sizeof(
"&") - 1;
break;
604 default: len += 1;
break;
622 while ((c = (
int) *s++) != (
int)
'\0') {
624 case '<': te =
stpcpy(te,
"<");
break;
625 case '>': te =
stpcpy(te,
">");
break;
626 case '&': te =
stpcpy(te,
"&");
break;
627 default: *te++ = (char) c;
break;
640 #if defined(HAVE_ICONV)
641 char *fromcode = NULL;
650 #ifdef HAVE_LANGINFO_H
651 fromcode = nl_langinfo (CODESET);
654 if (fromcode != NULL && strcmp(tocode, fromcode) != 0
655 && (fd = iconv_open(tocode, fromcode)) != (iconv_t)-1)
657 const char *pin = buffer;
659 size_t ib, ob, dest_size;
663 const char *shift_pin = NULL;
666 err = iconv(fd, NULL, &ib, &pout, &ob);
667 dest_size = ob = ib = strlen(buffer);
668 dest_str = pout = malloc((dest_size + 1) *
sizeof(*dest_str));
673 while (done == 0 && is_error == 0) {
674 err = iconv(fd, (
char **)&pin, &ib, &pout, &ob);
676 if (err == (
size_t)-1) {
682 {
size_t used = (size_t)(pout - dest_str);
684 dest_str = realloc(dest_str, (dest_size + 1) *
sizeof(*dest_str));
685 if (dest_str == NULL) {
689 pout = dest_str + used;
690 ob = dest_size - used;
700 if (shift_pin == NULL) {
709 xx = iconv_close(fd);
712 if (dest_str != NULL)
717 dest_str =
xstrdup((buffer ? buffer :
""));
732 int ix = (he->
ix > 0 ? he->
ix : 0);
768 int ix = (he->
ix > 0 ? he->
ix : 0);
789 int ix = (he->
ix > 0 ? he->
ix : 0);
790 const char * xtag = NULL;
793 const char * s = NULL;
821 {
int cpl = b64encode_chars_per_line;
822 b64encode_chars_per_line = 0;
826 b64encode_chars_per_line = cpl;
844 return xstrdup(
_(
"(invalid xml type)"));
850 t = memset(
alloca(tlen+1), 0, tlen+1);
853 xx =
snprintf(t, tlen,
"%llu", (
unsigned long long)anint);
861 nb += strlen(xtag) +
sizeof(
"\t</>");
865 nb += 2 * strlen(xtag) +
sizeof(
"\t<></>");
894 while ((c = (
int) *s++) != (int)
'\0')
921 while ((c = (
int) *s++) != (int)
'\0') {
924 for (i = 0; i < lvl; i++) {
947 int element = he->
ix;
948 int ix = (he->
ix > 0 ? he->
ix : 0);
949 const char * xtag = NULL;
953 const char * s = NULL;
971 if (strchr(
"[", s[0]))
974 while ((c = (
int) *s++) != (int)
'\0') {
980 if (s[0] ==
' ' || s[0] ==
'\t')
985 if (s[0] !=
' ' && s[0] !=
'\0' && s[1] !=
'"')
994 xtag =
xmalloc(strlen(
"- |##-\n") + 1);
998 sprintf((
char *)xtag,
"- |%d-\n", lvl);
1001 if (he->
ix < 0) lvl++;
1002 sprintf((
char *)xtag,
"|%d-\n", lvl);
1011 if (he->
ix < 0) lvl++;
1015 xtag = (element >= 0 ?
"- " : NULL);
1025 {
int cpl = b64encode_chars_per_line;
1026 b64encode_chars_per_line = 0;
1031 b64encode_chars_per_line = cpl;
1049 return xstrdup(
_(
"(invalid yaml type)"));
1055 t = memset(
alloca(tlen+1), 0, tlen+1);
1057 xx =
snprintf(t, tlen,
"%llu", (
unsigned long long)anint);
1060 xtag = (element >= 0 ?
"- " : NULL);
1066 nb +=
sizeof(
" ") - 1;
1067 nb +=
sizeof(
"- ~") - 1;
1075 nb +=
sizeof(
" ") - 1;
1111 int ix = (he->
ix > 0 ? he->
ix : 0);
1119 unsigned int pktlen = 0;
1120 unsigned int v = (
unsigned int) *pkt;
1123 unsigned int hlen = 0;
1128 plen =
pgpLen(pkt+1, &hlen);
1130 tag = (v >> 2) & 0xf;
1131 plen = (1 << (v & 0x3));
1135 pktlen = 1 + plen + hlen;
1139 val =
xstrdup(
_(
"(not an OpenPGP signature)"));
1144 const char *tempstr;
1153 switch (sigp->pubkey_algo) {
1161 (void)
snprintf(t, nb - (t - val),
"%u", (unsigned)sigp->pubkey_algo);
1165 if (t + 5 >= val + nb)
1168 switch (sigp->hash_algo) {
1176 (void)
snprintf(t, nb - (t - val),
"%u", (unsigned)sigp->hash_algo);
1180 if (t + strlen (
", ") + 1 >= val + nb)
1186 { time_t dateint =
pgpGrab(sigp->time,
sizeof(sigp->time));
1187 struct tm * tstruct = localtime(&dateint);
1189 (void) strftime(t, (nb - (t - val)),
"%c", tstruct);
1192 if (t + strlen (
", Key ID ") + 1 >= val + nb)
1194 t =
stpcpy(t,
", Key ID ");
1195 tempstr =
pgpHexStr(sigp->signid,
sizeof(sigp->signid));
1196 if (t + strlen (tempstr) > val + nb)
1217 int ix = (he->
ix > 0 ? he->
ix : 0);
1222 val =
xstrdup(
_(
"(invalid type)"));
1231 if (anint & RPMSENSE_SCRIPT_PRE)
1233 else if (anint & RPMSENSE_SCRIPT_POST)
1235 else if (anint & RPMSENSE_SCRIPT_PREUN)
1236 t =
stpcpy(t,
"(preun)");
1237 else if (anint & RPMSENSE_SCRIPT_POSTUN)
1238 t =
stpcpy(t,
"(postun)");
1248 if (anint & RPMSENSE_SENSEMASK)
1269 int ix = (he->
ix > 0 ? he->
ix : 0);
1274 val =
xstrdup(
_(
"(invalid type)"));
1282 if (anint & RPMSENSE_SCRIPT_PRE)
1284 else if (anint & RPMSENSE_SCRIPT_POST)
1286 else if (anint & RPMSENSE_SCRIPT_PREUN)
1288 else if (anint & RPMSENSE_SCRIPT_POSTUN)
1290 else if (anint & RPMSENSE_SCRIPT_VERIFY)
1292 else if (anint & RPMSENSE_RPMLIB)
1294 else if (anint & RPMSENSE_INTERP)
1296 else if (anint & (RPMSENSE_FIND_PROVIDES | RPMSENSE_FIND_REQUIRES))
1346 (tv->tv_usec * 10) + 0x01B21DD213814000ULL;
1358 he->
p.
ui8p[6] &= 0xf0;
1359 he->
p.
ui8p[8] &= 0x3f;
1360 he->
p.
ui8p[9] &= 0x00;
1393 tv.tv_sec = (long) he->
p.
ui32p[0];
1394 tv.tv_usec = (
long) (he->
c > 1 ? he->
p.
ui32p[1] : 0);
1486 static const char uuid_auth[] =
"%{?_uuid_auth}%{!?_uuid_auth:http://rpm5.org}";
1488 static const char uuid_path[] =
"%{?_uuid_path}%{!?_uuid_path:/package}";
1505 const char * ns = NULL;
1507 const char * s = NULL;
1511 if (!strcmp(
"Sigmd5", tagn))
1513 else if (!strcmp(
"Sha1header", tagn))
1524 s =
rpmGetPath(uuid_auth,
"/", uuid_path,
"/", tagn,
"/",
1561 static const char hex[] =
"0123456789abcdef";
1567 for (i = 0; i < he->
c; i++) {
1568 *te++ = hex[ (int)((he->
p.
ui8p[i] >> 4) & 0x0f) ];
1569 *te++ = hex[ (int)((he->
p.
ui8p[i] ) & 0x0f) ];
1581 return str2uuid(he, NULL, 0, NULL);
1636 HE_t _he = memset(
alloca(
sizeof(*_he)), 0,
sizeof(*_he));
1637 HE_t Fhe = memset(
alloca(
sizeof(*Fhe)), 0,
sizeof(*Fhe));
1638 HE_t Ihe = memset(
alloca(
sizeof(*Ihe)), 0,
sizeof(*Ihe));
1639 HE_t Nhe = memset(
alloca(
sizeof(*Nhe)), 0,
sizeof(*Nhe));
1640 HE_t Vhe = memset(
alloca(
sizeof(*Vhe)), 0,
sizeof(*Vhe));
1641 HE_t She = memset(
alloca(
sizeof(*She)), 0,
sizeof(*She));
1683 for (i = 0; i < (unsigned) he->
c; i++) {
1684 char * item, * flagsStr;
1689 for (j = 0; j < Nhe->
c; j++) {
1690 if (Ihe->
p.
ui32p[j] != i)
1698 sprintf(item,
"%s%s%s", Nhe->
p.
argv[j], flagsStr, Vhe->
p.
argv[j]);
1699 flagsStr =
_free(flagsStr);
1701 strcpy(item, Nhe->
p.
argv[j]);
1704 chptr =
xrealloc(chptr, strlen(chptr) + strlen(item) + 5);
1705 if (*chptr !=
'\0') strcat(chptr,
", ");
1706 strcat(chptr, item);
1710 he->
p.
argv[i] = chptr;
1734 HE_t _he = memset(
alloca(
sizeof(*_he)), 0,
sizeof(*_he));
1762 numScripts = _he->
c;
1770 for (i = 0; i < (unsigned) he->
c; i++) {
1771 for (j = 0; j < (unsigned) numNames; j++) {
1772 if (indices.
ui32p[j] != i)
1776 if (flags.
ui32p[j] & RPMSENSE_TRIGGERPREIN)
1778 else if (flags.
ui32p[j] & RPMSENSE_TRIGGERIN)
1780 else if (flags.
ui32p[j] & RPMSENSE_TRIGGERUN)
1782 else if (flags.
ui32p[j] & RPMSENSE_TRIGGERPOSTUN)
1800 #if defined(ENABLE_NLS)
1803 extern int _nl_msg_cat_cntr;
1822 char * dstring =
rpmExpand(_macro_i18ndomains, NULL);
1830 if (dstring && *dstring) {
1832 const char * langval;
1833 const char * msgkey;
1836 {
HE_t nhe = memset(
alloca(
sizeof(*nhe)), 0,
sizeof(*nhe));
1839 size_t nb =
sizeof(
"()");
1850 if (tn) nb += strlen(tn);
1851 if (nhe->
p.
str) nb += strlen(nhe->
p.
str);
1854 (nhe->
p.
str ? nhe->
p.
str :
""), (tn ? tn :
""));
1861 langval =
getenv(language);
1862 (void)
setenv(language,
"en_US", 1);
1863 #if defined(ENABLE_NLS)
1868 for (domain = dstring; domain != NULL; domain = de) {
1869 de = strchr(domain,
':');
1870 if (de) *de++ =
'\0';
1874 if (msgid != msgkey)
break;
1879 (void)
setenv(language, langval, 1);
1882 #if defined(ENABLE_NLS)
1886 if (domain && msgid) {
1888 const char * s =
dgettext(domain, msgid);
1900 dstring =
_free(dstring);
1931 if (!rc || he->
p.
str == NULL || he->
c == 0) {
1946 {
const char ** argv;
1950 for (i = 0; i < (unsigned) he->
c; i++) {
1953 assert(he->
p.
argv[i] != NULL);
1954 l += strlen(he->
p.
argv[i]) + 1;
1956 argv =
xmalloc(he->
c *
sizeof(*argv) + l);
1957 te = (
char *)&argv[he->
c];
1958 for (i = 0; i < (unsigned) he->
c; i++) {
2095 const char * origin;
2121 const char * baseurl;
2146 const char * digest;
2211 const char * N = NULL;
2212 const char * V = NULL;
2213 const char * R = NULL;
2214 const char * A = NULL;
2219 if (N) nb += strlen(N);
2220 if (V) nb += strlen(V) + 1;
2221 if (R) nb += strlen(R) + 1;
2222 #if defined(RPM_VENDOR_OPENPKG)
2229 if (A) nb += strlen(A) + 1;
2237 #if defined(RPM_VENDOR_OPENPKG)
2293 HE_t he = memset(
alloca(
sizeof(*he)), 0,
sizeof(*he));
2295 rpmTag dirIndexesTag = 0;
2316 if (fnp) *fnp = NULL;
2325 if (xx == 0 && isSource) {
2330 dirNames.
argv[0] = (
const char *)&dirNames.
argv[2];
2338 if (fnp) *fnp = NULL;
2343 he->
tag = dirNameTag;
2347 he->
tag = dirIndexesTag;
2352 size =
sizeof(*fileNames.
argv) * count;
2353 for (i = 0; i < (unsigned)count; i++) {
2354 const char * dn = NULL;
2356 size += strlen(baseNames.
argv[i]) + strlen(dn) + 1;
2360 t = (
char *)&fileNames.
argv[count];
2361 for (i = 0; i < (unsigned)count; i++) {
2362 const char * dn = NULL;
2364 fileNames.
argv[i] = t;
2374 *fnp = fileNames.
argv;
2378 if (fcp) *fcp = count;
2443 for (Nhe->
ix = 0; Nhe->
ix < (
int)Nhe->
c; Nhe->
ix++) {
2444 nb +=
sizeof(*he->
p.
argv);
2445 nb += strlen(Nhe->
p.
argv[Nhe->
ix]) + 1;
2446 if (*EVRhe->
p.
argv[Nhe->
ix] !=
'\0')
2447 nb += strlen(EVRhe->
p.
argv[Nhe->
ix]) + (
sizeof(
" (== )")-1);
2450 nb +=
sizeof(*he->
p.
argv);
2453 te = (
char *) &he->
p.
argv[he->
c+1];
2456 for (Nhe->
ix = 0; Nhe->
ix < (
int)Nhe->
c; Nhe->
ix++) {
2457 he->
p.
argv[he->
c++] = te;
2458 if (*EVRhe->
p.
argv[Nhe->
ix] !=
'\0') {
2459 char opstr[4], * op = opstr;
2468 " (", opstr,
" ", EVRhe->
p.
argv[Nhe->
ix],
")", NULL);
2475 he->
p.
argv[he->
c] = NULL;
2494 HE_t Nhe = memset(
alloca(
sizeof(*Nhe)), 0,
sizeof(*Nhe));
2495 HE_t EVRhe = memset(
alloca(
sizeof(*EVRhe)), 0,
sizeof(*EVRhe));
2496 HE_t Fhe = memset(
alloca(
sizeof(*Fhe)), 0,
sizeof(*Fhe));
2503 EVRhe->
tag = tagEVR;
2506 assert(EVRhe->
c == Nhe->
c);
2510 assert(Fhe->
c == Nhe->
c);
2573 HE_t Nhe = memset(
alloca(
sizeof(*Nhe)), 0,
sizeof(*Nhe));
2574 HE_t Dhe = memset(
alloca(
sizeof(*Dhe)), 0,
sizeof(*Dhe));
2586 assert(Dhe->
c == Nhe->
c);
2592 for (Dhe->
ix = 0; Dhe->
ix < (
int)Dhe->
c; Dhe->
ix++) {
2595 nb +=
sizeof(*he->
p.
argv);
2596 nb += strlen(Dhe->
p.
argv[Dhe->
ix]) +
sizeof(
" ") + strlen(Nhe->
p.
argv[Dhe->
ix]) - 1;
2599 nb +=
sizeof(*he->
p.
argv);
2602 te = (
char *) &he->
p.
argv[he->
c+1];
2605 for (Dhe->
ix = 0; Dhe->
ix < (
int)Dhe->
c; Dhe->
ix++) {
2608 he->
p.
argv[he->
c++] = te;
2614 he->
p.
argv[he->
c] = NULL;
2664 HE_t NVRAhe = memset(
alloca(
sizeof(*NVRAhe)), 0,
sizeof(*NVRAhe));
2665 HE_t RNhe = memset(
alloca(
sizeof(*RNhe)), 0,
sizeof(*RNhe));
2666 HE_t REVRhe = memset(
alloca(
sizeof(*REVRhe)), 0,
sizeof(*REVRhe));
2667 HE_t RFhe = memset(
alloca(
sizeof(*RFhe)), 0,
sizeof(*RFhe));
2669 const char * key = PNhe->
p.
argv[PNhe->
ix];
2692 REVRhe->
tag = tagEVR;
2695 mi =
rpmmiInit(_rpmdb, tagN, key, keylen);
2701 if (PEVRhe != NULL) {
2704 assert(REVRhe->
c == RNhe->
c);
2707 assert(RFhe->
c == RNhe->
c);
2710 for (RNhe->
ix = 0; RNhe->
ix < (
int)RNhe->
c; RNhe->
ix++) {
2717 if (!(PFlags && RFlags))
2731 NVRAhe->
tag = tagNVRA;
2733 if (!(*avp != NULL &&
argvSearch(*avp, NVRAhe->
p.
str, NULL) != NULL)) {
2758 HE_t NVRAhe = memset(
alloca(
sizeof(*NVRAhe)), 0,
sizeof(*NVRAhe));
2759 HE_t PNhe = memset(
alloca(
sizeof(*PNhe)), 0,
sizeof(*PNhe));
2760 HE_t PEVRhe = memset(
alloca(
sizeof(*PEVRhe)), 0,
sizeof(*PEVRhe));
2761 HE_t PFhe = memset(
alloca(
sizeof(*PFhe)), 0,
sizeof(*PFhe));
2762 HE_t FNhe = memset(
alloca(
sizeof(*FNhe)), 0,
sizeof(*FNhe));
2774 assert(PEVRhe->
c == PNhe->
c);
2778 assert(PFhe->
c == PNhe->
c);
2784 NVRAhe->
tag = tagNVRA;;
2790 for (PNhe->
ix = 0; PNhe->
ix < (
int)PNhe->
c; PNhe->
ix++)
2791 (
void)
wnlookupTag(h, tagNVRA, &pkgs, &hits, PNhe, PEVRhe, PFhe);
2792 for (FNhe->
ix = 0; FNhe->
ix < (
int)FNhe->
c; FNhe->
ix++)
2793 (void)
wnlookupTag(h, tagNVRA, &pkgs, &hits, FNhe, NULL, NULL);
2803 for (i = 0; i < he->
c; i++) {
2804 nb +=
sizeof(*he->
p.
argv);
2805 nb += strlen(pkgs[i]) + 1;
2807 nb +=
sizeof(*he->
p.
argv);
2810 te = (
char *) &he->
p.
argv[he->
c+1];
2812 for (i = 0; i < he->
c; i++) {
2814 te =
stpcpy(te, pkgs[i]);
2817 he->
p.
argv[he->
c] = NULL;
2840 HE_t NVRAhe = memset(
alloca(
sizeof(*NVRAhe)), 0,
sizeof(*NVRAhe));
2841 HE_t PNhe = memset(
alloca(
sizeof(*PNhe)), 0,
sizeof(*PNhe));
2842 HE_t PEVRhe = memset(
alloca(
sizeof(*PEVRhe)), 0,
sizeof(*PEVRhe));
2843 HE_t PFhe = memset(
alloca(
sizeof(*PFhe)), 0,
sizeof(*PFhe));
2845 const char * key = RNhe->
p.
argv[RNhe->
ix];
2869 PEVRhe->
tag = tagEVR;
2872 mi =
rpmmiInit(_rpmdb, tagN, key, keylen);
2878 if (REVRhe != NULL) {
2881 assert(PEVRhe->
c == PNhe->
c);
2884 assert(PFhe->
c == PNhe->
c);
2887 for (PNhe->
ix = 0; PNhe->
ix < (
int)PNhe->
c; PNhe->
ix++) {
2894 if (!(PFlags && RFlags))
2908 NVRAhe->
tag = tagNVRA;
2910 if (!(*avp != NULL &&
argvSearch(*avp, NVRAhe->
p.
str, NULL) != NULL)) {
2935 HE_t NVRAhe = memset(
alloca(
sizeof(*NVRAhe)), 0,
sizeof(*NVRAhe));
2936 HE_t RNhe = memset(
alloca(
sizeof(*RNhe)), 0,
sizeof(*RNhe));
2937 HE_t REVRhe = memset(
alloca(
sizeof(*REVRhe)), 0,
sizeof(*REVRhe));
2938 HE_t RFhe = memset(
alloca(
sizeof(*RFhe)), 0,
sizeof(*RFhe));
2950 assert(REVRhe->
c == RNhe->
c);
2954 assert(RFhe->
c == RNhe->
c);
2956 NVRAhe->
tag = tagNVRA;;
2962 for (RNhe->
ix = 0; RNhe->
ix < (
int)RNhe->
c; RNhe->
ix++) {
2963 if (*RNhe->
p.
argv[RNhe->
ix] ==
'/' || *REVRhe->
p.
argv[RNhe->
ix] ==
'\0')
2964 (void)
nwlookupTag(h, tagNVRA, &pkgs, &hits, RNhe, NULL, NULL);
2966 (
void)
nwlookupTag(h, tagNVRA, &pkgs, &hits, RNhe, REVRhe, RFhe);
2977 for (i = 0; i < he->
c; i++) {
2978 nb +=
sizeof(*he->
p.
argv);
2979 nb += strlen(pkgs[i]) + 1;
2981 nb +=
sizeof(*he->
p.
argv);
2984 te = (
char *) &he->
p.
argv[he->
c+1];
2986 for (i = 0; i < he->
c; i++) {
2988 te =
stpcpy(te, pkgs[i]);
2991 he->
p.
argv[he->
c] = NULL;
3012 if (N.
argv[i] == NULL || *N.
argv[i] ==
'\0')
3015 && !(a=strcmp(N.
argv[i], N.
argv[i-1]))
3016 && !(b=strcmp(EVR.
argv[i], EVR.
argv[i-1]))
3017 && (F.
ui32p[i] & 0x4e) == ((F.
ui32p[i-1] & 0x4e)))
3040 if (xx == 0)
goto exit;
3046 if (xx == 0)
goto exit;
3051 if (xx == 0)
goto exit;
3054 nb =
sizeof(*he->
p.
argv);
3056 for (i = 0; i < c; i++) {
3062 nb +=
sizeof(*he->
p.
argv);
3063 nb +=
sizeof(
"<rpm:entry name=\"\"/>");
3064 if (*N.
argv[i] ==
'/')
3067 nb += strlen(N.
argv[i]);
3068 if (EVR.
argv != NULL && EVR.
argv[i] != NULL && *EVR.
argv[i] !=
'\0') {
3069 nb +=
sizeof(
" flags=\"EQ\" epoch=\"0\" ver=\"\"") - 1;
3070 nb += strlen(EVR.
argv[i]);
3071 if (strchr(EVR.
argv[i],
':') != NULL)
3073 if (strchr(EVR.
argv[i],
'-') != NULL)
3074 nb +=
sizeof(
" rel=\"\"") - 2;
3078 nb +=
sizeof(
" pre=\"1\"") - 1;
3086 t = (
char *) &he->
p.
argv[he->
c + 1];
3088 for (i = 0; i < c; i++) {
3093 he->
p.
argv[ac++] = t;
3094 t =
stpcpy(t,
"<rpm:entry");
3095 t =
stpcpy(t,
" name=\"");
3096 if (*N.
argv[i] ==
'/') {
3102 if (EVR.
argv != NULL && EVR.
argv[i] != NULL && *EVR.
argv[i] !=
'\0') {
3103 static char *Fstr[] = {
"?0",
"LT",
"GT",
"?3",
"EQ",
"LE",
"GE",
"?7" };
3105 const char *E, *V, *R;
3108 f = (
char *) EVR.
argv[i];
3109 for (fe = f; *fe !=
'\0' && *fe >=
'0' && *fe <=
'9'; fe++)
3111 if (*fe ==
':') { *fe++ =
'\0'; E = f; f = fe; }
else E = NULL;
3113 for (fe = f; *fe !=
'\0' && *fe !=
'-'; fe++)
3115 if (*fe ==
'-') { *fe++ =
'\0'; R = fe; }
else R = NULL;
3124 t =
stpcpy(t,
" pre=\"1\"");
3129 he->
p.
argv[he->
c] = NULL;
3187 while ((c = (
int) *s++) != (
int)
'\0') {
3189 case '\'': len += 1;
3190 default: len += 1;
break;
3208 while ((c = (
int) *s++) != (
int)
'\0') {
3210 case '\'': *te++ = (char) c;
3211 default: *te++ = (char) c;
break;
3227 int ix = (he->
ix > 0 ? he->
ix : 0);
3232 val =
xstrdup(
_(
"(not a string)"));
3240 val =
xstrdup(
_(
"(not a string)"));
3275 if (xx == 0)
goto exit;
3281 if (xx == 0)
goto exit;
3286 if (xx == 0)
goto exit;
3290 nb =
sizeof(*he->
p.
argv);
3292 for (i = 0; i < c; i++) {
3298 nb +=
sizeof(*he->
p.
argv);
3299 nb += strlen(instance) +
sizeof(
", '', '', '', '', ''");
3301 nb +=
sizeof(
", ''") - 1;
3302 nb += strlen(N.
argv[i]);
3303 if (EVR.
argv != NULL && EVR.
argv[i] != NULL && *EVR.
argv[i] !=
'\0') {
3304 nb += strlen(EVR.
argv[i]);
3305 nb +=
sizeof(
"EQ0") - 1;
3309 nb +=
sizeof(
"1") - 1;
3317 t = (
char *) &he->
p.
argv[he->
c + 1];
3319 for (i = 0; i < c; i++) {
3324 he->
p.
argv[ac++] = t;
3328 if (EVR.
argv != NULL && EVR.
argv[i] != NULL && *EVR.
argv[i] !=
'\0') {
3329 static char *Fstr[] = {
"?0",
"LT",
"GT",
"?3",
"EQ",
"LE",
"GE",
"?7" };
3331 const char *E, *V, *R;
3334 f = (
char *) EVR.
argv[i];
3335 for (fe = f; *fe !=
'\0' && *fe >=
'0' && *fe <=
'9'; fe++)
3337 if (*fe ==
':') { *fe++ =
'\0'; E = f; f = fe; }
else E = NULL;
3339 for (fe = f; *fe !=
'\0' && *fe !=
'-'; fe++)
3341 if (*fe ==
'-') { *fe++ =
'\0'; R = fe; }
else R = NULL;
3346 t =
stpcpy(t,
", '', '', '', ''");
3354 he->
p.
argv[he->
c] = NULL;
3420 if (xx == 0)
goto exit;
3426 if (xx == 0)
goto exit;
3431 if (xx == 0)
goto exit;
3434 nb =
sizeof(*he->
p.
argv);
3436 for (i = 0; i < c; i++) {
3442 nb +=
sizeof(*he->
p.
argv);
3444 if (*N.
argv[i] ==
'/')
3447 nb += strlen(N.
argv[i]);
3448 if (EVR.
argv != NULL && EVR.
argv[i] != NULL && *EVR.
argv[i] !=
'\0') {
3449 nb +=
sizeof(
" >= ") - 1;
3450 nb += strlen(EVR.
argv[i]);
3458 t = (
char *) &he->
p.
argv[he->
c + 1];
3460 for (i = 0; i < c; i++) {
3465 he->
p.
argv[ac++] = t;
3467 if (*N.
argv[i] ==
'/') {
3472 if (EVR.
argv != NULL && EVR.
argv[i] != NULL && *EVR.
argv[i] !=
'\0') {
3473 static char *Fstr[] = {
"?0",
"<",
">",
"?3",
"=",
"<=",
">=",
"?7" };
3481 he->
p.
argv[he->
c] = NULL;
3532 size_t dnlen = strlen(dn);
3535 if (strstr(dn,
"bin/") != NULL)
3537 if (dnlen >=
sizeof(
"/etc/")-1 && !strncmp(dn,
"/etc/", dnlen))
3539 if (!strcmp(dn,
"/usr/lib/") && !strcmp(BN.
argv[i],
"sendmail"))
3564 if (xx == 0)
goto exit;
3570 if (xx == 0)
goto exit;
3575 if (xx == 0)
goto exit;
3580 if (xx == 0)
goto exit;
3585 if (xx == 0)
goto exit;
3588 nb =
sizeof(*he->
p.
argv);
3590 for (i = 0; i < c; i++) {
3591 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3594 nb +=
sizeof(*he->
p.
argv);
3595 nb +=
sizeof(
"<file></file>");
3598 if (FFLAGS.
ui32p[i] & 0x40)
3599 nb +=
sizeof(
" type=\"ghost\"") - 1;
3600 else if (S_ISDIR(FMODES.
ui16p[i])) {
3601 nb +=
sizeof(
" type=\"dir\"") - 1;
3603 nb +=
sizeof(
"/") - 1;
3612 t = (
char *) &he->
p.
argv[he->
c + 1];
3615 for (i = 0; i < c; i++) {
3616 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3618 if (FFLAGS.
ui32p[i] & 0x40)
3620 if (S_ISDIR(FMODES.
ui16p[i]))
3622 he->
p.
argv[ac++] = t;
3626 t =
stpcpy(t,
"</file>");
3629 for (i = 0; i < c; i++) {
3630 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3632 if (FFLAGS.
ui32p[i] & 0x40)
3634 if (!S_ISDIR(FMODES.
ui16p[i]))
3636 he->
p.
argv[ac++] = t;
3637 t =
stpcpy(t,
"<file type=\"dir\">");
3645 t =
stpcpy(t,
"</file>");
3648 for (i = 0; i < c; i++) {
3649 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3651 if (!(FFLAGS.
ui32p[i] & 0x40))
3653 he->
p.
argv[ac++] = t;
3654 t =
stpcpy(t,
"<file type=\"ghost\">");
3657 t =
stpcpy(t,
"</file>");
3661 he->
p.
argv[he->
c] = NULL;
3717 if (xx == 0)
goto exit;
3723 if (xx == 0)
goto exit;
3728 if (xx == 0)
goto exit;
3733 if (xx == 0)
goto exit;
3738 if (xx == 0)
goto exit;
3742 nb =
sizeof(*he->
p.
argv);
3744 for (i = 0; i < c; i++) {
3745 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3748 nb +=
sizeof(*he->
p.
argv);
3749 nb += strlen(instance) +
sizeof(
", '', ''");
3751 nb += strlen(BN.
argv[i]);
3752 if (FFLAGS.
ui32p[i] & 0x40)
3753 nb +=
sizeof(
"ghost") - 1;
3754 else if (S_ISDIR(FMODES.
ui16p[i])) {
3755 nb +=
sizeof(
"dir") - 1;
3757 nb +=
sizeof(
"/") - 1;
3760 nb +=
sizeof(
"file") - 1;
3767 t = (
char *) &he->
p.
argv[he->
c + 1];
3770 for (i = 0; i < c; i++) {
3771 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3773 if (FFLAGS.
ui32p[i] & 0x40)
3775 if (S_ISDIR(FMODES.
ui16p[i]))
3777 he->
p.
argv[ac++] = t;
3779 t = strcpy(t, DN.
argv[DI.
ui32p[i]]); t += strlen(t);
3780 t = strcpy(t, BN.
argv[i]); t += strlen(t);
3781 t =
stpcpy(t,
"', 'file'");
3784 for (i = 0; i < c; i++) {
3785 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3787 if (FFLAGS.
ui32p[i] & 0x40)
3789 if (!S_ISDIR(FMODES.
ui16p[i]))
3791 he->
p.
argv[ac++] = t;
3793 t = strcpy(t, DN.
argv[DI.
ui32p[i]]); t += strlen(t);
3794 t = strcpy(t, BN.
argv[i]); t += strlen(t);
3800 t =
stpcpy(t,
"', 'dir'");
3803 for (i = 0; i < c; i++) {
3804 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3806 if (!(FFLAGS.
ui32p[i] & 0x40))
3808 he->
p.
argv[ac++] = t;
3810 t = strcpy(t, DN.
argv[DI.
ui32p[i]]); t += strlen(t);
3811 t = strcpy(t, BN.
argv[i]); t += strlen(t);
3812 t =
stpcpy(t,
"', 'ghost'");
3816 he->
p.
argv[he->
c] = NULL;
3872 if (xx == 0)
goto exit;
3878 if (xx == 0)
goto exit;
3883 if (xx == 0)
goto exit;
3888 if (xx == 0)
goto exit;
3893 if (xx == 0)
goto exit;
3896 nb =
sizeof(*he->
p.
argv);
3898 for (i = 0; i < c; i++) {
3899 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3902 nb +=
sizeof(*he->
p.
argv);
3906 if (FFLAGS.
ui32p[i] & 0x40)
3907 nb +=
sizeof(
"") - 1;
3908 else if (S_ISDIR(FMODES.
ui16p[i]))
3909 nb +=
sizeof(
"/") - 1;
3916 t = (
char *) &he->
p.
argv[he->
c + 1];
3919 for (i = 0; i < c; i++) {
3920 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3922 if (FFLAGS.
ui32p[i] & 0x40)
3924 if (S_ISDIR(FMODES.
ui16p[i]))
3926 he->
p.
argv[ac++] = t;
3933 for (i = 0; i < c; i++) {
3934 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3936 if (FFLAGS.
ui32p[i] & 0x40)
3938 if (!S_ISDIR(FMODES.
ui16p[i]))
3940 he->
p.
argv[ac++] = t;
3949 for (i = 0; i < c; i++) {
3950 if (lvl > 0 &&
FDGSkip(DN, BN, DI, i) != lvl)
3952 if (!(FFLAGS.
ui32p[i] & 0x40))
3954 he->
p.
argv[ac++] = t;
3961 he->
p.
argv[he->
c] = NULL;
4008 val =
xstrdup(
_(
"(not a string)"));
4015 assert(he->
p.
str != NULL);
4017 if ((bn = strrchr(he->
p.
str,
'/')) != NULL)
4026 val =
xstrdup(
_(
"(not a string)"));
4092 STAT_KEYS_FLAGS = (1U << 13),
4097 STAT_KEYS_FCONTEXT = (1U << 16),
4115 {
"fcontext", STAT_KEYS_FCONTEXT },
4116 {
"flags", STAT_KEYS_FLAGS },
4160 UUID_KEYS_STRING = (0U << 4),
4161 UUID_KEYS_SIV = (1U << 4),
4162 UUID_KEYS_BINARY = (2U << 4),
4163 UUID_KEYS_TEXT = (3U << 4),
4170 {
"binary", UUID_KEYS_BINARY },
4171 {
"siv", UUID_KEYS_SIV },
4172 {
"string", UUID_KEYS_STRING },
4173 {
"text", UUID_KEYS_TEXT },
4200 if (name && * name) {
4202 KEY *k = (
KEY *)bsearch(&needle, keys, nkeys,
sizeof(*keys),
keyCmp);
4218 int ix = (he->
ix > 0 ? he->
ix : 0);
4225 val =
xstrdup(
_(
"(invalid type :digest)"));
4229 ns =
sizeof(he->
p.
ui64p[0]);
4232 ns = strlen(he->
p.
str);
4239 assert(he->
p.
ptr != NULL);
4263 static const char *avdefault[] = {
"mode", NULL };
4265 const char * fn = NULL;
4266 struct stat sb, *st = &sb;
4267 int ix = (he->
ix > 0 ? he->
ix : 0);
4272 memset(st, 0,
sizeof(*st));
4278 if ((
size_t)he->
c ==
sizeof(*st)) {
4279 st = (
struct stat *)he->
p.
ptr;
4284 val =
xstrdup(
_(
"(invalid type :stat)"));
4289 if (
Lstat(fn, st) == 0)
4298 if (!(av && av[0] && *av[0]))
4300 for (i = 0; av[i] != NULL; i++) {
4302 size_t nb =
sizeof(b);
4314 xx =
snprintf(b, nb,
"0x%lx", (
unsigned long)st->st_dev);
4317 xx =
snprintf(b, nb,
"0x%lx", (
unsigned long)st->st_ino);
4320 xx =
snprintf(b, nb,
"%06o", (
unsigned)st->st_mode);
4323 xx =
snprintf(b, nb,
"0x%ld", (
unsigned long)st->st_nlink);
4326 xx =
snprintf(b, nb,
"%ld", (
unsigned long)st->st_uid);
4329 xx =
snprintf(b, nb,
"%ld", (
unsigned long)st->st_gid);
4332 xx =
snprintf(b, nb,
"0x%lx", (
unsigned long)st->st_rdev);
4335 xx =
snprintf(b, nb,
"%ld", (
unsigned long)st->st_size);
4338 xx =
snprintf(b, nb,
"%ld", (
unsigned long)st->st_blksize);
4341 xx =
snprintf(b, nb,
"%ld", (
unsigned long)st->st_blocks);
4344 (void)
stpcpy(b, ctime((time_t *)&st->st_atime));
4347 (void)
stpcpy(b, ctime((time_t *)&st->st_ctime));
4350 (void)
stpcpy(b, ctime((time_t *)&st->st_mtime));
4353 case STAT_KEYS_FLAGS:
4357 if (fn != NULL &&
S_ISLNK(st->st_mode)) {
4358 ssize_t size =
Readlink(fn, b, nb);
4360 nval =
rpmExpand(
"(Readlink:", fn,
":", strerror(
errno),
")", NULL);
4368 if (fn != NULL && S_ISREG(st->st_mode)) {
4372 if (fd == NULL ||
Ferror(fd)) {
4375 static int asAscii = 1;
4376 char buffer[16 * 1024];
4378 while (
Fread(buffer,
sizeof(buffer[0]),
sizeof(buffer), fd) > 0)
4394 {
const char * uname =
uidToUname(st->st_uid);
4398 xx =
snprintf(b, nb,
"%u", (
unsigned)st->st_uid);
4401 {
const char * gname =
gidToGname(st->st_gid);
4405 xx =
snprintf(b, nb,
"%u", (
unsigned)st->st_gid);
4437 static const char *avdefault[] = {
"v5", NULL };
4440 int ix = (he->
ix > 0 ? he->
ix : 0);
4447 val =
xstrdup(
_(
"(invalid type :uuid)"));
4454 if (!(av && av[0] && *av[0]))
4457 for (i = 0; av[i] != NULL; i++) {
4473 {
HE_t nhe = memset(
alloca(
sizeof(*nhe)), 0,
sizeof(*nhe));
4479 val =
xmalloc((128/4 + 4) + 1);
4481 xx =
str2uuid(nhe, NULL, version, val);
4499 int64_t * stack = memset(
alloca(ac*
sizeof(*stack)), 0, (ac*
sizeof(*stack)));
4507 val =
xstrdup(
_(
"(invalid type :rpn)"));
4511 stack[ix] = he->
p.
ui64p[0];
4516 stack[ix] = strtoll(he->
p.
str, &end, 0);
4518 if (end && *end !=
'\0') {
4519 val =
xstrdup(
_(
"(invalid string :rpn)"));
4526 for (i = 0; av[i] != NULL; i++) {
4527 const char * arg = av[i];
4528 size_t len = strlen(arg);
4533 }
else if (len > 1) {
4535 val =
xstrdup(
_(
"(expected number :rpn)"));
4539 val =
xstrdup(
_(
"(stack overflow :rpn)"));
4543 stack[ix] = strtoll(arg, &end, 0);
4544 if (end && *end !=
'\0') {
4545 val =
xstrdup(
_(
"(invalid number :rpn)"));
4550 val =
xstrdup(
_(
"(stack underflow :rpn)"));
4554 case '&': stack[ix] &= stack[ix+1];
break;
4555 case '|': stack[ix] |= stack[ix+1];
break;
4556 case '^': stack[ix] ^= stack[ix+1];
break;
4557 case '+': stack[ix] += stack[ix+1];
break;
4558 case '-': stack[ix] -= stack[ix+1];
break;
4559 case '*': stack[ix] *= stack[ix+1];
break;
4562 if (stack[ix+1] == 0) {
4563 val =
xstrdup(
_(
"(divide by zero :rpn)"));
4567 stack[ix] %= stack[ix+1];
4569 stack[ix] /= stack[ix+1];
4575 {
HE_t nhe = memset(
alloca(
sizeof(*nhe)), 0,
sizeof(*nhe));
4606 val =
xstrdup(
_(
"(invalid type :strsub)"));
4610 if (ac < 2 || (ac % 2) != 0) {
4611 val =
xstrdup(
_(
"(invalid args :strsub)"));
4620 for (i = 0; av[i] != NULL; i += 2)
4624 if (mires != NULL) {
4627 const char * s, * se;
4633 for (i = 0; i < nmires; i++) {
4634 miRE mire = mires + i;
4644 while (*s !=
'\0') {
4646 if ((se = strchr(s,
'\n')) == NULL)
4651 offsets[0] = offsets[1] = -1;
4657 nb += offsets[0] + strlen(av[2*i+1]);
4659 if (xx != 0 || offsets[1] == offsets[0])
4660 nb += (se - (s + offsets[1]));
4670 if (xx != 0 || offsets[1] == offsets[0]) {
4672 te =
stpncpy(te, s, (se - s));
4694 { HEADER_EXT_TAG,
"RPMTAG_BUILDTIMEUUID",
4696 { HEADER_EXT_TAG,
"RPMTAG_CHANGELOGNAME",
4698 { HEADER_EXT_TAG,
"RPMTAG_CHANGELOGTEXT",
4700 { HEADER_EXT_TAG,
"RPMTAG_DESCRIPTION",
4702 { HEADER_EXT_TAG,
"RPMTAG_GROUP",
4704 { HEADER_EXT_TAG,
"RPMTAG_HDRUUID",
4706 { HEADER_EXT_TAG,
"RPMTAG_INSTALLPREFIX",
4708 { HEADER_EXT_TAG,
"RPMTAG_INSTALLTIDUUID",
4710 { HEADER_EXT_TAG,
"RPMTAG_INSTALLTIMEUUID",
4712 { HEADER_EXT_TAG,
"RPMTAG_ORIGINTIDUUID",
4714 { HEADER_EXT_TAG,
"RPMTAG_ORIGINTIMEUUID",
4716 { HEADER_EXT_TAG,
"RPMTAG_PKGUUID",
4718 { HEADER_EXT_TAG,
"RPMTAG_REMOVETIDUUID",
4720 { HEADER_EXT_TAG,
"RPMTAG_SOURCEPKGUUID",
4722 { HEADER_EXT_TAG,
"RPMTAG_SUMMARY",
4724 { HEADER_EXT_TAG,
"RPMTAG_TRIGGERCONDS",
4726 { HEADER_EXT_TAG,
"RPMTAG_TRIGGERTYPE",
4728 { HEADER_EXT_TAG,
"RPMTAG_DBINSTANCE",
4730 { HEADER_EXT_TAG,
"RPMTAG_HEADERSTARTOFF",
4732 { HEADER_EXT_TAG,
"RPMTAG_HEADERENDOFF",
4734 { HEADER_EXT_TAG,
"RPMTAG_PACKAGEBASEURL",
4736 { HEADER_EXT_TAG,
"RPMTAG_PACKAGEDIGEST",
4738 { HEADER_EXT_TAG,
"RPMTAG_PACKAGEORIGIN",
4740 { HEADER_EXT_TAG,
"RPMTAG_PACKAGESIZE",
4742 { HEADER_EXT_TAG,
"RPMTAG_PACKAGETIME",
4744 { HEADER_EXT_TAG,
"RPMTAG_NVRA",
4746 { HEADER_EXT_TAG,
"RPMTAG_FILENAMES",
4748 { HEADER_EXT_TAG,
"RPMTAG_FILEPATHS",
4750 { HEADER_EXT_TAG,
"RPMTAG_ORIGPATHS",
4752 { HEADER_EXT_TAG,
"RPMTAG_FILESTAT",
4754 { HEADER_EXT_TAG,
"RPMTAG_PROVIDEXMLENTRY",
4756 { HEADER_EXT_TAG,
"RPMTAG_REQUIREXMLENTRY",
4758 { HEADER_EXT_TAG,
"RPMTAG_CONFLICTXMLENTRY",
4760 { HEADER_EXT_TAG,
"RPMTAG_OBSOLETEXMLENTRY",
4762 { HEADER_EXT_TAG,
"RPMTAG_FILESXMLENTRY1",
4764 { HEADER_EXT_TAG,
"RPMTAG_FILESXMLENTRY2",
4766 { HEADER_EXT_TAG,
"RPMTAG_PROVIDEYAMLENTRY",
4768 { HEADER_EXT_TAG,
"RPMTAG_REQUIREYAMLENTRY",
4770 { HEADER_EXT_TAG,
"RPMTAG_CONFLICTYAMLENTRY",
4772 { HEADER_EXT_TAG,
"RPMTAG_OBSOLETEYAMLENTRY",
4774 { HEADER_EXT_TAG,
"RPMTAG_FILESYAMLENTRY1",
4776 { HEADER_EXT_TAG,
"RPMTAG_FILESYAMLENTRY2",
4778 { HEADER_EXT_TAG,
"RPMTAG_PROVIDESQLENTRY",
4780 { HEADER_EXT_TAG,
"RPMTAG_REQUIRESQLENTRY",
4782 { HEADER_EXT_TAG,
"RPMTAG_CONFLICTSQLENTRY",
4784 { HEADER_EXT_TAG,
"RPMTAG_OBSOLETESQLENTRY",
4786 { HEADER_EXT_TAG,
"RPMTAG_FILESSQLENTRY1",
4788 { HEADER_EXT_TAG,
"RPMTAG_FILESSQLENTRY2",
4790 { HEADER_EXT_TAG,
"RPMTAG_DEBCONFLICTS",
4792 { HEADER_EXT_TAG,
"RPMTAG_DEBDEPENDS",
4794 { HEADER_EXT_TAG,
"RPMTAG_DEBMD5SUMS",
4796 { HEADER_EXT_TAG,
"RPMTAG_DEBOBSOLETES",
4798 { HEADER_EXT_TAG,
"RPMTAG_DEBPROVIDES",
4800 { HEADER_EXT_TAG,
"RPMTAG_NEEDSWHAT",
4802 { HEADER_EXT_TAG,
"RPMTAG_WHATNEEDS",
4804 { HEADER_EXT_FORMAT,
"armor",
4806 { HEADER_EXT_FORMAT,
"base64",
4808 { HEADER_EXT_FORMAT,
"bncdata",
4810 { HEADER_EXT_FORMAT,
"cdata",
4812 { HEADER_EXT_FORMAT,
"depflags",
4814 { HEADER_EXT_FORMAT,
"deptype",
4816 { HEADER_EXT_FORMAT,
"digest",
4818 { HEADER_EXT_FORMAT,
"fflags",
4820 { HEADER_EXT_FORMAT,
"iconv",
4822 { HEADER_EXT_FORMAT,
"perms",
4824 { HEADER_EXT_FORMAT,
"permissions",
4826 { HEADER_EXT_FORMAT,
"pgpsig",
4828 { HEADER_EXT_FORMAT,
"rpn",
4830 { HEADER_EXT_FORMAT,
"sqlescape",
4832 { HEADER_EXT_FORMAT,
"stat",
4834 { HEADER_EXT_FORMAT,
"strsub",
4836 { HEADER_EXT_FORMAT,
"triggertype",
4838 { HEADER_EXT_FORMAT,
"utf8",
4840 { HEADER_EXT_FORMAT,
"uuid",
4842 { HEADER_EXT_FORMAT,
"xml",
4844 { HEADER_EXT_FORMAT,
"yaml",
4846 { HEADER_EXT_MORE, NULL, { (
void *) &headerDefaultFormats } }
4855 const struct headerTagTableEntry_s * t;
4862 if (_rpmTagTable == NULL)
4866 if (_rpmHeaderFormats == NULL)
4869 for (t = _rpmTagTable; t && t->name; t++) {
4871 static const char * tagtypes[] = {
4872 "",
"char",
"uint8",
"uint16",
"uint32",
"uint64",
4873 "string",
"octets",
"argv",
"i18nstring",
4878 fprintf(fp,
"%-20s %6d", t->name + 7, t->val);
4883 fprintf(fp,
" openpgp");
4885 fprintf(fp,
" x509");
4887 fprintf(fp,
" asn1");
4889 fprintf(fp,
" opaque");
4890 fprintf(fp,
" %s", tagtypes[ttype]);
4892 fprintf(fp,
" array");
4894 fprintf(fp,
" mapping");
4896 fprintf(fp,
" probe");
4898 fprintf(fp,
" tree");
4900 fprintf(fp,
"%s", t->name + 7);
4905 for (ext = exts, extNum = 0; ext != NULL && ext->type != HEADER_EXT_LAST;
4906 ext = (ext->type == HEADER_EXT_MORE ? *ext->u.more : ext+1), extNum++)
4908 if (ext->name == NULL || ext->type != HEADER_EXT_TAG)
4914 fprintf(fp,
"%s\n", ext->name + 7);
4920 #define PARSER_BEGIN 0
4921 #define PARSER_IN_ARRAY 1
4922 #define PARSER_IN_EXPR 2
5027 fprintf(stderr,
"\t\t\\%c\n", ch);
5030 case 'a':
return '\a';
5031 case 'b':
return '\b';
5032 case 'f':
return '\f';
5033 case 'n':
return '\n';
5034 case 'r':
return '\r';
5035 case 't':
return '\t';
5036 case 'v':
return '\v';
5052 memset(he, 0,
sizeof(*he));
5069 if (format == NULL)
return NULL;
5071 for (i = 0; i < (unsigned) num; i++) {
5072 switch (format[i].type) {
5083 format[i].
u.
array.format =
5085 format[i].
u.
array.numTokens);
5088 format[i].
u.
cond.ifFormat =
5090 format[i].
u.
cond.numIfTokens);
5091 format[i].
u.
cond.elseFormat =
5093 format[i].
u.
cond.numElseTokens);
5099 format[i].
u.
cond.tag.fmtfuncs =
_free(format[i].u.
cond.tag.fmtfuncs);
5108 format =
_free(format);
5117 static headerSprintfArgs
hsaInit( headerSprintfArgs hsa)
5144 static sprintfToken
hsaNext( headerSprintfArgs hsa)
5148 sprintfToken fmt = NULL;
5156 if (hsa != NULL && hsa->
i < hsa->
numTokens) {
5158 if (hsa->
hi == NULL) {
5182 static headerSprintfArgs
hsaFini( headerSprintfArgs hsa)
5226 static char name[128];
5233 if (s != NULL && typep != NULL)
5238 for (; tbl->name != NULL; tbl++) {
5239 if (tbl->val == val)
5242 if ((s = tbl->name) == NULL)
5244 s +=
sizeof(
"RPMTAG_") - 1;
5270 for (; tbl->name != NULL; tbl++) {
5286 static int findTag(headerSprintfArgs hsa, sprintfToken token,
const char *
name)
5291 sprintfTag stag = (token->
type == PTOK_COND
5300 if (!strcmp(name,
"*")) {
5305 if (strncmp(
"RPMTAG_", name,
sizeof(
"RPMTAG_")-1)) {
5306 char * t =
alloca(strlen(name) +
sizeof(
"RPMTAG_"));
5312 for (ext = exts, extNum = 0; ext != NULL && ext->type != HEADER_EXT_LAST;
5313 ext = (ext->type == HEADER_EXT_MORE ? *ext->u.more : ext+1), extNum++)
5315 if (ext->name == NULL || ext->type != HEADER_EXT_TAG)
5318 stag->
ext = ext->u.tagFunction;
5334 stag->
tagno[0] = tagno;
5336 if (stag->
av != NULL) {
5341 for (i = 0; stag->
av[i] != NULL; i++) {
5342 for (ext = exts; ext != NULL && ext->type != HEADER_EXT_LAST;
5343 ext = (ext->type == HEADER_EXT_MORE ? *ext->u.more : ext+1))
5345 if (ext->name == NULL || ext->type != HEADER_EXT_FORMAT)
5347 if (strcmp(ext->name, stag->
av[i]+1))
5349 stag->
fmtfuncs[i] = ext->u.fmtFunction;
5367 char * str,
char ** endPtr)
5382 sprintfToken * formatPtr,
5383 size_t * numTokensPtr,
5384 char ** endPtr,
int state)
5390 static const char *pstates[] = {
5391 "NORMAL",
"ARRAY",
"EXPR",
"WTF?"
5393 char * chptr, * start, * next, * dst;
5394 sprintfToken format;
5403 fprintf(stderr,
"--> parseFormat(%p, \"%.20s...\", %p, %p, %p, %s)\n", hsa, str, formatPtr, numTokensPtr, endPtr, pstates[(state & 0x3)]);
5409 for (chptr = str; *chptr !=
'\0'; chptr++)
5410 if (*chptr ==
'%') numTokens++;
5411 numTokens = numTokens * 2 + 1;
5413 format =
xcalloc(numTokens,
sizeof(*format));
5414 if (endPtr) *endPtr = NULL;
5421 while (*start !=
'\0') {
5425 if (*(start + 1) ==
'%') {
5426 if (token == NULL || token->
type != PTOK_STRING) {
5427 token = format + numTokens++;
5428 token->
type = PTOK_STRING;
5430 dst = token->
u.
string.string = start;
5438 token = format + numTokens++;
5442 if (*start ==
'|') {
5463 while (*chptr && *chptr !=
'{' && *chptr !=
'%') chptr++;
5464 if (!*chptr || *chptr ==
'%') {
5465 hsa->
errmsg =
_(
"missing { after %");
5472 fprintf(stderr,
"\tchptr *%p = NUL\n", chptr);
5476 while (start < chptr) {
5478 i = strtoul(start, &start, 10);
5487 if (*start ==
'=') {
5490 }
else if (*start ==
'#') {
5497 while (*next && *next !=
'}') next++;
5499 hsa->
errmsg =
_(
"missing } after %{");
5505 fprintf(stderr,
"\tnext *%p = NUL\n", next);
5509 #define isSEP(_c) ((_c) == ':' || (_c) == '|')
5511 while (!(*chptr ==
'\0' ||
isSEP(*chptr))) chptr++;
5513 while (
isSEP(*chptr)) {
5514 if (chptr[1] ==
'\0' ||
isSEP(chptr[1])) {
5515 hsa->
errmsg =
_(
"empty tag format");
5520 {
char * te = chptr + 1;
5521 char * t = strchr(te,
'(');
5524 while (!(*te ==
'\0' ||
isSEP(*te))) {
5526 if (te[0] ==
'\\' && te[1] !=
'\0') te++;
5530 c = *te; *te =
'\0';
5534 if (te <= t || te[-1] !=
')') {
5535 hsa->
errmsg =
_(
"malformed parameter list");
5545 fprintf(stderr,
"\tformat \"%s\" params \"%s\"\n", chptr, (t ? t :
""));
5555 if (*start ==
'\0') {
5556 hsa->
errmsg =
_(
"empty tag name");
5562 token->
type = PTOK_TAG;
5564 if (
findTag(hsa, token, start)) {
5565 hsa->
errmsg =
_(
"unknown tag");
5573 fprintf(stderr,
"\tdst = start = next %p\n", dst);
5580 fprintf(stderr,
"\t%s => %s *%p = NUL\n", pstates[(state & 0x3)], pstates[
PARSER_IN_ARRAY], start);
5583 token = format + numTokens++;
5587 &token->
u.
array.numTokens,
5588 &start, PARSER_IN_ARRAY))
5595 hsa->
errmsg =
_(
"] expected at end of array");
5603 fprintf(stderr,
"\tdst = start %p\n", dst);
5606 token->
type = PTOK_ARRAY;
5611 if (state != PARSER_IN_ARRAY) {
5612 hsa->
errmsg =
_(
"unexpected ]");
5619 fprintf(stderr,
"\t<= %s %p[-1] = NUL\n", pstates[(state & 0x3)], start);
5621 if (endPtr) *endPtr = start;
5627 hsa->
errmsg =
_(
"unexpected }");
5634 fprintf(stderr,
"\t<= %s %p[-1] = NUL\n", pstates[(state & 0x3)], start);
5636 if (endPtr) *endPtr = start;
5641 if (token == NULL || token->
type != PTOK_STRING) {
5642 token = format + numTokens++;
5643 token->
type = PTOK_STRING;
5645 dst = token->
u.
string.string = start;
5651 fprintf(stderr,
"\t*%p = *%p \"%.30s\"\n", dst, start, start);
5653 if (start[0] ==
'\\' && start[1] !=
'\0') {
5662 if (dst < start) *dst =
'\0';
5671 for (i = 0; i < (unsigned) numTokens; i++) {
5673 switch(token->
type) {
5682 if (numTokensPtr != NULL)
5683 *numTokensPtr = numTokens;
5684 if (formatPtr != NULL)
5685 *formatPtr = format;
5691 char * str,
char ** endPtr)
5698 fprintf(stderr,
"--> parseExpression(%p, %p, \"%.20s...\", %p)\n", hsa, token, str, endPtr);
5703 while (*chptr && *chptr !=
'?') chptr++;
5705 if (*chptr !=
'?') {
5706 hsa->
errmsg =
_(
"? expected in expression");
5712 if (*chptr !=
'{') {
5713 hsa->
errmsg =
_(
"{ expected after ? in expression");
5724 if (!(end && *end)) {
5725 hsa->
errmsg =
_(
"} expected in expression");
5726 token->
u.
cond.ifFormat =
5732 if (*chptr !=
':' && *chptr !=
'|') {
5733 hsa->
errmsg =
_(
": expected following ? subexpression");
5734 token->
u.
cond.ifFormat =
5739 if (*chptr ==
'|') {
5743 token->
u.
cond.ifFormat =
5750 if (*chptr !=
'{') {
5751 hsa->
errmsg =
_(
"{ expected after : in expression");
5752 token->
u.
cond.ifFormat =
5764 if (!(end && *end)) {
5765 hsa->
errmsg =
_(
"} expected in expression");
5766 token->
u.
cond.ifFormat =
5772 if (*chptr !=
'|') {
5773 hsa->
errmsg =
_(
"| expected at end of expression");
5774 token->
u.
cond.ifFormat =
5776 token->
u.
cond.elseFormat =
5786 token->
type = PTOK_COND;
5788 (void)
findTag(hsa, token, str);
5808 rc = fn(hsa->
h, he);
5832 HE_t vhe = memset(
alloca(
sizeof(*vhe)), 0,
sizeof(*vhe));
5872 val =
xstrdup(
"(unknown type)");
5873 need = strlen(val) + 1;
5907 ival = he->
p.
ui64p[element];
5913 vhe->
ix = (he->
c > 1 ? 0 : -1);
5930 for (i = 0; tag->
av[i] != NULL; i++) {
5931 headerTagFormatFunction fmt;
5933 if ((fmt = tag->
fmtfuncs[i]) == NULL)
5936 if (val != NULL && *tag->
av[i] ==
'|') {
5950 nval = fmt(vhe, av);
5954 fprintf(stderr,
"\t%s(%s) %p(%p,%p) ret \"%s\"\n", tag->
av[i], (tag->
params ? tag->
params[i] : NULL), (
void *)fmt, (
void *)vhe, (
void *)(av ? av : NULL), (val ? val :
"(null)"));
5959 val =
xstrdup((nval ? nval :
""));
5963 val =
rpmExpand(val, (*val !=
'\0' ?
" | " :
""), nval, NULL);
5973 assert(val != NULL);
5975 need = strlen(val) + 1;
5978 if (val && need > 0) {
5981 nb = strlen(tag->
format) +
sizeof(
"%s");
5984 nb = tag->
pad + strlen(val) + 1;
6020 sprintfTag tag = NULL;
6022 size_t condNumFormats;
6028 switch (token->
type) {
6034 if (need == 0)
break;
6051 if (token->
u.
cond.tag.ext
6054 spft = token->
u.
cond.ifFormat;
6055 condNumFormats = token->
u.
cond.numIfTokens;
6057 spft = token->
u.
cond.elseFormat;
6058 condNumFormats = token->
u.
cond.numElseTokens;
6061 need = condNumFormats * 20;
6062 if (spft == NULL || need == 0)
break;
6065 for (i = 0; i < condNumFormats; i++, spft++) {
6076 spft = token->
u.
array.format;
6077 for (i = 0; i < token->
u.
array.numTokens; i++, spft++)
6099 if (numElements == 0) {
6100 numElements = he->
c;
6103 if ((
size_t)he->
c == numElements)
6106 _(
"array iterator used with different sized arrays");
6112 if (numElements == 0)
6117 spft = token->
u.
array.format;
6119 if (numElements == 0) {
6121 need =
sizeof(
"(none)\n") - 1;
6123 te =
stpcpy(t,
"(none)\n");
6130 need = numElements * token->
u.
array.numTokens;
6131 if (need == 0)
break;
6136 isxml = (spft->
type == PTOK_TAG && tag->
av != NULL &&
6137 tag->
av[0] != NULL && !strcmp(tag->
av[0]+1,
"xml"));
6138 isyaml = (spft->
type == PTOK_TAG && tag->
av != NULL &&
6139 tag->
av[0] != NULL && !strcmp(tag->
av[0]+1,
"yaml"));
6144 if (tag->
tagno != NULL && tag->
tagno[0] & 0x40000000) {
6148 assert(tagN != NULL);
6149 need =
sizeof(
" <rpmTag name=\"\">\n") + strlen(tagN);
6158 if (tag->
tagno != NULL && tag->
tagno[0] & 0x40000000) {
6160 tagT = numElements > 1
6164 assert(tagN != NULL);
6165 need =
sizeof(
" : - ") + strlen(tagN);
6177 need = numElements * token->
u.
array.numTokens * 10;
6179 for (j = 0; j < numElements; j++) {
6180 spft = token->
u.
array.format;
6181 for (i = 0; i < token->
u.
array.numTokens; i++, spft++) {
6191 need =
sizeof(
" </rpmTag>\n") - 1;
6193 te =
stpcpy(te,
" </rpmTag>\n");
6198 need =
sizeof(
"\n") - 1;
6227 for (ext = exts, extNum = 0; ext != NULL && ext->type != HEADER_EXT_LAST;
6228 ext = (ext->type == HEADER_EXT_MORE ? *ext->u.more : ext+1), extNum++)
6234 ec =
xcalloc(extNum+1,
sizeof(*ec));
6251 for (ext = exts, extNum = 0; ext != NULL && ext->type != HEADER_EXT_LAST;
6252 ext = (ext->type == HEADER_EXT_MORE ? *ext->u.more : ext+1), extNum++)
6266 headerSprintfArgs hsa = memset(
alloca(
sizeof(*hsa)), 0,
sizeof(*hsa));
6267 sprintfToken nextfmt;
6276 fprintf(stderr,
"==> headerSprintf(%p, \"%s\", %p, %p, %p)\n", h, fmt, tags, exts, errmsg);
6311 isxml = (tag != NULL && tag->
tagno != NULL && tag->
tagno[0] == (
rpmTag)-2 && tag->
av != NULL
6312 && tag->
av[0] != NULL && !strcmp(tag->
av[0]+1,
"xml"));
6313 isyaml = (tag != NULL && tag->
tagno != NULL && tag->
tagno[0] == (
rpmTag)-2 && tag->
av != NULL
6314 && tag->
av[0] != NULL && !strcmp(tag->
av[0]+1,
"yaml"));
6317 need =
sizeof(
"<rpmHeader>\n") - 1;
6319 te =
stpcpy(t,
"<rpmHeader>\n");
6323 need =
sizeof(
"- !!omap\n") - 1;
6325 te =
stpcpy(t,
"- !!omap\n");
6330 while ((nextfmt =
hsaNext(hsa)) != NULL) {
6342 need =
sizeof(
"</rpmHeader>\n") - 1;
6344 te =
stpcpy(t,
"</rpmHeader>\n");
6348 need =
sizeof(
"\n") - 1;