9 #define isblank(_c) ((char)(_c) == ' ' || (char)(_c) == '\t')
11 #define iseol(_c) ((char)(_c) == '\n' || (char)(_c) == '\r')
13 #define STREQ(_t, _f, _fn) ((_fn) == (sizeof(_t)-1) && !strncmp((_t), (_f), (_fn)))
17 #include <sys/types.h>
27 #define rpmlog fprintf
28 #define RPMLOG_ERR stderr
29 #define RPMLOG_WARNING stderr
33 #define vmefail(_nb) (exit(1), NULL)
36 #define urlPath(_xr, _r) (*(_r) = (_xr), URL_IS_PATH)
37 #define xisalnum(_c) isalnum(_c)
38 #define xisalpha(_c) isalpha(_c)
39 #define xisdigit(_c) isdigit(_c)
40 #define xisspace(_c) isspace(_c)
43 #define Fopen(_path, _fmode) fopen(_path, "r");
45 #define Fstrerror(_fd) strerror(errno)
49 #define fdGetFILE(_fd) (_fd)
52 _free(
const void * p)
55 if (p != NULL) free((
void *)p);
69 #define _RPMLUA_INTERNAL
73 #define _RPMAUG_INTERNAL
80 #define _RPMNIX_INTERNAL
99 #define _MACRO_INTERNAL
105 #if defined(WITH_AUGEAS) || defined(WITH_FICL) || defined(WITH_GPSEE) || defined(WITH_NIX) || defined(WITH_PERLEMBED) || defined(WITH_PYTHONEMBED) || defined(WITH_RUBYEMBED) || defined(WITH_SQLITE) || defined(WITH_SQUIRREL) || defined(WITH_TCL) || defined(WITH_SEMANAGE)
106 static int _globalI = 0x80000000;
109 #if defined(__LCLINT__)
111 extern const unsigned short int **__ctype_b_loc (
void) ;
150 #define SAVECHAR(_mb, _c) { *(_mb)->t = (char) (_c), (_mb)->t++, (_mb)->nb--; }
154 #define _MAX_MACRO_DEPTH 16
158 #define _PRINT_MACRO_TRACE 0
162 #define _PRINT_EXPAND_TRACE 0
166 #define _MAX_LOAD_DEPTH 2
171 #define MACRO_CHUNK_SIZE 16
201 if (ame == NULL && bme == NULL)
207 return strcmp(ame->name, bme->name);
218 if (mc->macroTable == NULL) {
221 xmalloc(
sizeof(*mc->macroTable) * mc->macrosAllocated);
226 xrealloc(mc->macroTable,
sizeof(*mc->macroTable) *
227 mc->macrosAllocated);
229 memset(&mc->macroTable[mc->firstFree], 0,
MACRO_CHUNK_SIZE *
sizeof(*(mc->macroTable)));
242 if (mc == NULL || mc->macroTable == NULL)
245 qsort(mc->macroTable, mc->firstFree,
sizeof(mc->macroTable[0]),
249 for (i = 0; i < mc->firstFree; i++) {
250 if (mc->macroTable[i] != NULL)
257 #if !defined(DEBUG_MACROS)
266 nb = strlen(me->name) +
sizeof(
"%") - 1;
268 nb += strlen(me->opts) +
sizeof(
"()") - 1;
270 nb += strlen(me->body) +
sizeof(
"\t") - 1;
293 if (fp == NULL) fp = stderr;
295 fprintf(fp,
"========================\n");
296 if (mc->macroTable != NULL) {
298 for (i = 0; i < mc->firstFree; i++) {
300 if ((me = mc->macroTable[i]) == NULL) {
305 fprintf(fp,
"%3d%c %s", me->level,
306 (me->used > 0 ?
'=' :
':'), me->name);
307 if (me->opts && *me->opts)
308 fprintf(fp,
"(%s)", me->opts);
309 if (me->body && *me->body)
310 fprintf(fp,
"\t%s", me->body);
315 fprintf(fp,
_(
"======================== active %d empty %d\n"),
319 #if !defined(DEBUG_MACROS)
335 return mc->firstFree;
337 av = (
const char **)
xcalloc( (mc->firstFree+1),
sizeof(mc->macroTable[0]));
338 if (mc->macroTable != NULL)
339 for (i = 0; i < mc->firstFree; i++) {
341 me = mc->macroTable[
i];
342 if (used > 0 && me->used < used)
344 if (used == 0 && me->used != 0)
346 #if !defined(DEBUG_MACROS)
347 if (mire != NULL &&
mireRegexec(mire, me->name, 0) < 0)
353 *avp = av = (
const char **)
xrealloc(av, (ac+1) *
sizeof(*av));
376 if (mc->macroTable == NULL || mc->firstFree == 0)
380 char * t = strncpy((
char *)
alloca(namelen + 1), name, namelen);
387 key->name = (
char *)name;
389 ret = (
MacroEntry *) bsearch(&key, mc->macroTable, mc->firstFree,
420 if (fgets(q, (
int)size, f) == NULL)
424 for (q += nb - 1; nb > 0 &&
iseol(*q); q--)
426 for (; p <= q; p++) {
438 case '{': p++, bc++;
break;
439 case '(': p++, pc++;
break;
440 case '%': p++;
break;
443 case '{':
if (bc > 0) bc++;
break;
444 case '}':
if (bc > 0) bc--;
break;
445 case '(':
if (pc > 0) pc++;
break;
446 case ')':
if (pc > 0) pc--;
break;
449 if (nb == 0 || (*q !=
'\\' && !bc && !pc) || *(q+1) ==
'\0') {
458 return (nread > 0 ? buf : NULL);
476 while ((c = *p++) !=
'\0') {
482 if (--lvl <= 0)
return --p;
486 return (
const char *)NULL;
501 const char *ellipsis;
505 fprintf(stderr,
_(
"%3d>%*s(empty)"), mb->
depth,
506 (2 * mb->
depth + 1),
"");
514 for (senl = se; *senl && !
iseol(*senl); senl++)
518 choplen = 61 - (2 * mb->
depth);
519 if ((senl - s) > choplen) {
526 fprintf(stderr,
"%3d>%*s%%%.*s^", mb->
depth,
527 (2 * mb->
depth + 1),
"", (
int)(se - s), s);
528 if (se[1] !=
'\0' && (senl - (se+1)) > 0)
529 fprintf(stderr,
"%-.*s%s", (
int)(senl - (se+1)), se+1, ellipsis);
530 fprintf(stderr,
"\n");
544 const char *ellipsis;
548 fprintf(stderr,
_(
"%3d<%*s(empty)\n"), mb->
depth, (2 * mb->
depth + 1),
"");
553 while (te > t &&
iseol(te[-1]))
560 while ((tenl = strchr(t,
'\n')) && tenl < te)
564 choplen = 61 - (2 * mb->
depth);
565 if ((te - t) > choplen) {
571 fprintf(stderr,
"%3d<%*s", mb->
depth, (2 * mb->
depth + 1),
"");
573 fprintf(stderr,
"%.*s%s", (
int)(te - t), t, ellipsis);
574 fprintf(stderr,
"\n");
577 #define SKIPBLANK(_s, _c) \
579 while (((_c) = (int) *(_s)) && isblank(_c)) \
583 #define SKIPNONBLANK(_s, _c) \
585 while (((_c) = (int) *(_s)) && !(isblank(_c) || iseol(_c))) \
589 #define COPYNAME(_ne, _s, _c) \
590 { SKIPBLANK(_s,_c); \
591 while(((_c) = (int) *(_s)) && (xisalnum(_c) || (_c) == (int) '_')) \
592 *(_ne)++ = *(_s)++; \
596 #define COPYOPTS(_oe, _s, _c) \
597 { while(((_c) = (int) *(_s)) && (_c) != (int) ')') \
598 *(_oe)++ = *(_s)++; \
615 const char *s = mb->
s;
618 sbuf = (
char *)
alloca(flen + 1);
619 memset(sbuf, 0, (flen + 1));
621 strncpy(sbuf, f, flen);
638 expandS(
MacroBuf mb,
char * tbuf,
size_t tbuflen)
642 const char *t = mb->
t;
667 const char *s = mb->
s;
673 tbuf = (
char *)
alloca(ulen + 1);
674 memset(tbuf, 0, (ulen + 1));
683 strncpy(u, tbuf, (ulen - mb->
nb + 1));
705 char * buf = (
char *)
alloca(bufn);
712 strncpy(buf, cmd, clen);
718 if ((shf = popen(buf,
"r")) == NULL)
720 while(mb->
nb > 0 && (c = fgetc(shf)) != EOF)
725 while (mb->
t > start &&
iseol(mb->
t[-1])) {
747 char *buf = (
char *)
alloca(bufn);
782 if (c == (
int)
'{') {
783 if ((se =
matchchar(s, (
char) c,
'}')) == NULL) {
785 _(
"Macro %%%s has unterminated body\n"), n);
790 strncpy(b, s, (se - s));
797 while (*s && (bc || pc || !
iseol(*s))) {
807 case '{': *be++ = *s++; bc++;
break;
808 case '(': *be++ = *s++; pc++;
break;
809 case '%': *be++ = *s++;
break;
812 case '{':
if (bc > 0) bc++;
break;
813 case '}':
if (bc > 0) bc--;
break;
814 case '(':
if (pc > 0) pc++;
break;
815 case ')':
if (pc > 0) pc--;
break;
823 _(
"Macro %%%s has unterminated body\n"), n);
830 while (--be >= b && (c = (
int) *be) && (
isblank(c) ||
iseol(c)))
842 if (!((c = (
int) *n) && (
xisalpha(c) || c == (
int)
'_') && (ne - n) > 2)) {
844 _(
"Macro %%%s has illegal name (%%define)\n"), n);
854 if (expandbody &&
expandU(mb, b, (&buf[bufn] - b))) {
884 char *n = buf, *ne = n;
895 if (!((c = (
int) *n) && (
xisalpha(c) || c == (
int)
'_') && (ne - n) > 2)) {
897 _(
"Macro %%%s has illegal name (%%undefine)\n"), n);
919 char *n = buf, *ne = n;
930 if (!((c = *n) && (
xisalpha(c) || c ==
'_') && (ne - n) > 2)) {
932 _(
"Macro %%%s has illegal name (%%unglobal)\n"), n);
948 fprintf(stderr,
"%s", msg);
949 fprintf(stderr,
"\tme %p", me);
951 fprintf(stderr,
"\tname %p(%s) prev %p",
952 me->name, me->name, me->prev);
953 fprintf(stderr,
"\n");
967 const char *
b,
int level)
970 MacroEntry prev = (mep && *mep ? *mep : NULL);
972 const char *
name = n;
982 me->name = (prev ? prev->name :
xstrdup(name));
983 me->opts = (o ?
xstrdup(o) : NULL);
984 me->body =
xstrdup(b ? b :
"");
987 me->flags = (name != n);
1009 if ((*mep = me->prev) == NULL)
1010 me->name =
_free(me->name);
1011 me->opts =
_free(me->opts);
1012 me->body =
_free(me->body);
1031 if (mc == NULL || mc->macroTable == NULL)
1035 for (i = 0; i < mc->firstFree; i++) {
1038 mep = &mc->macroTable[
i];
1043 if (me->level < mb->
depth)
1045 if (strlen(me->name) == 1 && strchr(
"#*0", *me->name)) {
1046 if (*me->name ==
'*' && me->used > 0)
1048 }
else if (!skiptest && me->used <= 0) {
1051 _(
"Macro %%%s (%s) was not used below level %d\n"),
1052 me->name, me->body, me->level);
1081 struct poptOption *optTbl;
1083 char *buf = (
char *)
alloca(bufn);
1090 unsigned int popt_flags;
1094 b = be =
stpcpy(buf, me->name);
1102 while ((c = (
int) *se++) != (
int)
'\0' && (se-1) != lastc) {
1116 if (c == (
int)
'\0') se--;
1139 argv = (
const char **)
alloca((argc + 1) *
sizeof(*argv));
1144 for (c = 0; c < argc; c++) {
1155 popt_flags = POPT_CONTEXT_NO_EXEC;
1156 #if defined(RPM_VENDOR_OPENPKG)
1157 popt_flags |= POPT_CONTEXT_POSIXMEHARDER;
1159 if (me->opts[0] ==
'+') popt_flags |= POPT_CONTEXT_POSIXMEHARDER;
1163 if (*opts ==
'+') opts++;
1164 for (c = 0; *opts !=
'\0'; opts++)
1165 if (*opts !=
':') c++;
1168 optTbl = (
struct poptOption *)
xcalloc(
sizeof(*optTbl), (c + 1));
1170 if (*opts ==
'+') opts++;
1171 for (c = 0; *opts !=
'\0'; opts++) {
1172 if (*opts ==
':')
continue;
1173 optTbl[c].shortName = opts[0];
1174 optTbl[c].val = (int) opts[0];
1176 optTbl[c].argInfo = POPT_ARG_STRING;
1182 optCon = poptGetContext(argv[0], argc, argv, optTbl, popt_flags);
1184 while ((c = poptGetNextOpt(optCon)) > 0) {
1185 const char * optArg = poptGetOptArg(optCon);
1188 if (optArg != NULL) {
1193 aname[0] =
'-'; aname[1] = (char)c; aname[2] =
'\0';
1195 if (optArg != NULL) {
1196 aname[0] =
'-'; aname[1] = (char)c; aname[2] =
'*'; aname[3] =
'\0';
1201 optArg =
_free(optArg);
1207 poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(c));
1211 argv = poptGetArgs(optCon);
1214 for (c = 0; argv[c] != NULL; c++)
1218 sprintf(aname,
"%d", argc);
1225 for (c = 0; c < argc; c++) {
1226 sprintf(aname,
"%d", (c + 1));
1228 if (be != b) *be++ =
' ';
1229 be =
stpcpy(be, argv[c]);
1237 optCon = poptFreeContext(optCon);
1238 if (optTbl) free(optTbl);
1256 char *buf = (
char *)
alloca(bufn);
1258 strncpy(buf, msg, msglen);
1260 (void)
expandU(mb, buf, bufn);
1264 fprintf(stderr,
"%s", buf);
1278 const char * g,
size_t gn)
1283 char * buf = (
char *)
alloca(bufn);
1284 char *
b = NULL, *be;
1290 strncpy(buf, g, gn);
1292 (void)
expandU(mb, buf, bufn);
1294 if (fn > 5 &&
STREQ(
"patch", f, 5) &&
xisdigit((
int)f[5])) {
1296 for (c = 5; c < (int)(fn-1) && f[c] ==
'0' &&
xisdigit((
int)f[c+1]);)
1302 if (
STREQ(
"basename", f, fn)) {
1303 if ((b = strrchr(buf,
'/')) == NULL)
1307 }
else if (
STREQ(
"dirname", f, fn)) {
1308 if ((b = strrchr(buf,
'/')) != NULL)
1311 #if !defined(__LCLINT__)
1312 }
else if (
STREQ(
"realpath", f, fn)) {
1316 if ((cp =
realpath(buf, rp)) != NULL) {
1318 if ((
size_t)(l+1) <= bufn) {
1319 memcpy(buf, cp, l+1);
1324 }
else if (
STREQ(
"getenv", f, fn)) {
1326 if ((cp =
getenv(buf)) != NULL)
1328 }
else if (
STREQ(
"shrink", f, fn)) {
1333 int i,
j, k, was_space = 0;
1334 for (i = 0, j = 0, k = (
int)strlen(buf); i < k; ) {
1340 else if (was_space) {
1346 buf[j++] = buf[i++];
1350 }
else if (
STREQ(
"suffix", f, fn)) {
1351 if ((b = strrchr(buf,
'.')) != NULL)
1353 }
else if (
STREQ(
"expand", f, fn)) {
1355 }
else if (
STREQ(
"verbose", f, fn)) {
1356 #if defined(RPMLOG_MASK)
1363 b = (negate) ? NULL : buf;
1365 }
else if (
STREQ(
"url2path", f, fn) ||
STREQ(
"u2p", f, fn)) {
1366 int ut =
urlPath(buf, (
const char **)&b);
1368 if (*b ==
'\0') b = (
char *)
"/";
1369 }
else if (
STREQ(
"uncompress", f, fn)) {
1372 for (b = buf; (c = (int)*b) &&
isblank(c);)
1375 for (be = b; (c = (int)*be) && !
isblank(c);)
1380 switch(compressed) {
1383 sprintf(be,
"%%__cat %s", b);
1386 sprintf(be,
"%%__gzip -dc '%s'", b);
1389 sprintf(be,
"%%__bzip2 -dc '%s'", b);
1392 sprintf(be,
"%%__unzip -qq '%s'", b);
1395 sprintf(be,
"%%__lzop -dc '%s'", b);
1398 sprintf(be,
"%%__lzma -dc '%s'", b);
1401 sprintf(be,
"%%__xz -dc '%s'", b);
1404 sprintf(be,
"%%__lrzip -dqo- %s", b);
1407 sprintf(be,
"%%__lzip -dc %s", b);
1410 sprintf(be,
"%%__7zip x %s", b);
1414 }
else if (
STREQ(
"mkstemp", f, fn)) {
1416 for (b = buf; (c = (int)*b) &&
isblank(c);)
1419 for (be = b; (c = (int)*be) && !
isblank(c);)
1422 #if defined(HAVE_MKSTEMP)
1424 (void) close(mkstemp(b));
1429 }
else if (
STREQ(
"mkdtemp", f, fn)) {
1431 for (b = buf; (c = (int)*b) &&
isblank(c);)
1434 for (be = b; (c = (int)*be) && !
isblank(c);)
1437 #if defined(HAVE_MKDTEMP) && !defined(__LCLINT__)
1438 if (mkdtemp(b) == NULL)
1441 if ((b = tmpnam(b)) != NULL)
1442 (
void) mkdir(b, 0700);
1444 }
else if (
STREQ(
"uuid", f, fn)) {
1447 const char *uuid_data;
1455 if ((n = strspn(cp,
" \t\n")) > 0)
1457 if ((n = strcspn(cp,
" \t\n")) > 0) {
1458 uuid_version = (int)strtol(cp, (
char **)NULL, 10);
1460 if ((n = strspn(cp,
" \t\n")) > 0)
1462 if ((n = strcspn(cp,
" \t\n")) > 0) {
1466 if ((n = strspn(cp,
" \t\n")) > 0)
1468 if ((n = strcspn(cp,
" \t\n")) > 0) {
1476 if (
rpmuuidMake(uuid_version, uuid_ns, uuid_data, buf, NULL))
1481 }
else if (
STREQ(
"S", f, fn)) {
1482 for (b = buf; (c = (int)*b) &&
xisdigit(c);)
1486 sprintf(b,
"%%SOURCE%s", buf);
1489 }
else if (
STREQ(
"P", f, fn)) {
1490 for (b = buf; (c = (int) *b) &&
xisdigit(c);)
1494 sprintf(b,
"%%PATCH%s", buf);
1497 }
else if (
STREQ(
"F", f, fn)) {
1498 b = buf + strlen(buf) + 1;
1499 sprintf(b,
"file%s.file", buf);
1503 (void)
expandT(mb, b, strlen(b));
1518 rc =
expandT(mb, me->body, strlen(me->body));
1523 #if !defined(DEBUG_MACROS)
1527 #define POPT_ERROR_NOARG -10
1528 #define POPT_ERROR_BADQUOTE -15
1529 #define POPT_ERROR_MALLOC -21
1531 #define POPT_ARGV_ARRAY_GROW_DELTA 5
1534 int * argcPtr,
char *** argvPtr)
1537 size_t nb = (argc + 1) *
sizeof(*argv);
1542 if (argc <= 0 || argv == NULL)
1544 for (i = 0; i < argc; i++) {
1545 if (argv[i] == NULL)
1547 nb += strlen(argv[i]) + 1;
1553 argv2 = (
char **) dst;
1554 dst += (argc + 1) *
sizeof(*argv);
1556 for (i = 0; i < argc; i++) {
1558 dst += strlen(strcpy(dst, argv[i])) + 1;
1579 char ** argv = (
char **)
xmalloc(
sizeof(*argv) * argvAlloced);
1581 size_t buflen = strlen(s) + 1;
1582 char * buf = (
char *) memset(
alloca(buflen), 0, buflen);
1585 if (argv == NULL)
return rc;
1588 for (src = s; *src !=
'\0'; src++) {
1589 if (quote == *src) {
1591 }
else if (quote !=
'\0') {
1598 if (*src != quote) *buf++ =
'\\';
1601 }
else if (isspace(*src)) {
1602 if (*argv[argc] !=
'\0') {
1604 if (argc == argvAlloced) {
1606 argv = (
char **) realloc(argv,
sizeof(*argv) * argvAlloced);
1607 if (argv == NULL)
goto exit;
1611 }
else switch (*src) {
1629 if (strlen(argv[argc])) {
1636 if (argv) free(argv);
1648 #if defined(WITH_AUGEAS) || defined(WITH_FICL) || defined(WITH_GPSEE) || defined(WITH_JNIEMBED) || defined(WITH_PERLEMBED) || defined(WITH_PYTHONEMBED) || defined(WITH_RUBYEMBED) || defined(WITH_MRUBY_EMBED) || defined(WITH_SQLITE) || defined(WITH_SQUIRREL) || defined(WITH_TCL) || defined(WITH_SEMANAGE)
1649 static char _FIXME_embedded_interpreter_eval_returned_null[] =
1650 "FIXME: embedded interpreter eval returned null.";
1651 static char * parseEmbedded(
const char * s,
size_t nb,
char *** avp)
1654 char * script = NULL;
1658 for (se = s + 1; se < (s+nb); se++)
1660 default:
continue;
break;
1661 case ':':
goto bingo;
break;
1665 {
size_t na = (size_t)(se-s-1);
1670 args = (
char *) memcpy(
xmalloc(na+1), s+1, na);
1679 nb -= (nb >= (
sizeof(
"{:}")-1) ? (
sizeof(
"{:}")-1) : nb);
1680 script = (
char *) memcpy(
xmalloc(nb+1), se+1, nb+1);
1703 const char *s = mb->
s, *se;
1717 _(
"Recursion depth(%d) greater than max(%d)\n"),
1724 while (rc == 0 && mb->
nb > 0 && (c = (
int)*s) != (
int)
'\0') {
1746 stackarray = chkexist = negate = 0;
1748 switch ((c = (
int) *s)) {
1750 while (*s !=
'\0' && strchr(
"!?@", *s) != NULL) {
1753 stackarray = ((stackarray + 1) % 2);
1756 negate = ((negate + 1) % 2);
1766 while((c = (
int) *se) && (
xisalnum(c) || c == (int)
'_'))
1772 if (*se ==
'*') se++;
1783 if ((c = (
int) *fe) &&
isblank(c))
1784 if ((lastc = strchr(fe,
'\n')) == NULL)
1785 lastc = strchr(fe,
'\0');
1789 if ((se =
matchchar(s, (
char)c,
')')) == NULL) {
1791 _(
"Unterminated %c: %s\n"), (
char)c, s);
1806 if ((se =
matchchar(s, (
char)c,
'}')) == NULL) {
1808 _(
"Unterminated %c: %s\n"), (
char)c, s);
1814 while (strchr(
"!?@", *f) != NULL) {
1817 stackarray = ((stackarray + 1) % 2);
1820 negate = ((negate + 1) % 2);
1828 for (fe = f; (c = (int) *fe) && !strchr(
" :}", c);)
1847 if ((fe - f) <= 0) {
1853 _(
"A %% is followed by an unparseable macro\n"));
1863 if (
STREQ(
"load", f, fn)) {
1865 char * mfn = strncpy((
char *)
alloca(gn + 1), g, gn);
1870 if (xx != 0 && chkexist == negate)
1876 if (
STREQ(
"global", f, fn)) {
1880 if (
STREQ(
"define", f, fn)) {
1884 if (
STREQ(
"undefine", f, fn)) {
1888 if (
STREQ(
"unglobal", f, fn)) {
1893 if (
STREQ(
"echo", f, fn) ||
1894 STREQ(
"warn", f, fn) ||
1895 STREQ(
"error", f, fn)) {
1897 if (
STREQ(
"error", f, fn))
1898 waserror = 1, rc = 1;
1899 if (g != NULL && g < ge)
1907 if (
STREQ(
"trace", f, fn)) {
1910 if (mb->
depth == 1) {
1918 if (
STREQ(
"dump", f, fn)) {
1927 if (
STREQ(
"lua", f, fn)) {
1930 char *scriptbuf = (
char *)
xmalloc(gn);
1931 const char *printbuf;
1934 lua->storeprint = 1;
1935 lua->printbuf = NULL;
1936 lua->printbufsize = 0;
1937 lua->printbufused = 0;
1939 if (g != NULL && gn > 0)
1940 memcpy(scriptbuf, g, gn);
1941 scriptbuf[gn] =
'\0';
1946 size_t len = strlen(printbuf);
1949 memcpy(mb->
t, printbuf, len);
1955 lua->storeprint = olua->storeprint;
1956 lua->printbuf = olua->printbuf;
1957 lua->printbufsize = olua->printbufsize;
1958 lua->printbufused = olua->printbufused;
1967 if (
STREQ(
"augeas", f, fn)) {
1971 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
1973 char * script = strndup(g, (
size_t)(se-g-1));
1975 rpmaug aug = (_globalI ? NULL
1977 const char * result = NULL;
1982 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
1983 if (result != NULL && *result !=
'\0') {
1984 size_t len = strlen(result);
1987 memcpy(mb->
t, result, len);
1996 script =
_free(script);
2003 if (
STREQ(
"ficl", f, fn)) {
2005 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2007 const char * result = NULL;
2012 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2013 if (result != NULL && *result !=
'\0') {
2014 size_t len = strlen(result);
2017 memcpy(mb->
t, result, len);
2024 script =
_free(script);
2031 if (
STREQ(
"git", f, fn)) {
2033 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2035 const char * result = NULL;
2040 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2041 if (result != NULL && *result !=
'\0') {
2042 size_t len = strlen(result);
2045 memcpy(mb->
t, result, len);
2052 script =
_free(script);
2059 if (
STREQ(
"js", f, fn)) {
2061 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2063 const char * result = NULL;
2068 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2069 if (result != NULL && *result !=
'\0') {
2070 size_t len = strlen(result);
2073 memcpy(mb->
t, result, len);
2080 script =
_free(script);
2086 #ifdef WITH_JNIEMBED
2087 if (
STREQ(
"jni", f, fn) ||
STREQ(
"java", f, fn)) {
2089 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2090 rpmjni jni = rpmjniNew(av, _globalI);
2091 const char * result = NULL;
2093 if (rpmjniRun(jni, script, &result) !=
RPMRC_OK)
2096 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2097 if (result != NULL && *result !=
'\0') {
2098 size_t len = strlen(result);
2101 memcpy(mb->
t, result, len);
2106 jni = rpmjniFree(jni);
2108 script =
_free(script);
2114 #ifdef WITH_MRBEMBED
2115 if (
STREQ(
"mrb", f, fn) ||
STREQ(
"mruby", f, fn)) {
2117 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2118 rpmmrb mrb = rpmmrbNew(av, _globalI);
2119 const char * result = NULL;
2121 if (rpmmrbRun(mrb, script, &result) !=
RPMRC_OK)
2124 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2125 if (result != NULL && *result !=
'\0') {
2126 size_t len = strlen(result);
2129 memcpy(mb->
t, result, len);
2134 mrb = rpmmrbFree(mrb);
2136 script =
_free(script);
2143 if (
STREQ(
"nix", f, fn)) {
2145 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2146 int (*_vec) (rpmnix nix) = rpmnixEcho;
2147 uint32_t _flags = RPMNIX_FLAGS_NONE;
2149 const char * result = NULL;
2152 if (av == NULL || av[0] == NULL || av[1] == NULL
2153 || !strcmp(av[0],
"echo"))
2157 if (!strcmp(av[1],
"build")) {
2159 _flags = RPMNIX_FLAGS_NOOUTLINK;
2161 if (!strcmp(av[1],
"channel")) {
2162 _vec = rpmnixChannel;
2164 if (!strcmp(av[1],
"collect-garbage")) {
2165 _vec = rpmnixCollectGarbage;
2167 if (!strcmp(av[1],
"copy-closure")) {
2168 _vec = rpmnixCopyClosure;
2170 if (!strcmp(av[1],
"env")) {
2173 if (!strcmp(av[1],
"hash")) {
2176 if (!strcmp(av[1],
"install-package")) {
2177 _vec = rpmnixInstallPackage;
2178 _flags = RPMNIX_FLAGS_INTERACTIVE;
2180 if (!strcmp(av[1],
"instantiate")) {
2181 _vec = rpmnixInstantiate;
2183 if (!strcmp(av[1],
"prefetch-url")) {
2184 _vec = rpmnixPrefetchURL;
2186 if (!strcmp(av[1],
"push")) {
2189 if (!strcmp(av[1],
"pull")) {
2192 if (!strcmp(av[1],
"store")) {
2195 if (!strcmp(av[1],
"worker")) {
2196 _vec = rpmnixWorker;
2200 nix = rpmnixNew(av, _flags, NULL);
2203 if (rpmnixRun(nix, script, &result) !=
RPMRC_OK)
2206 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2207 if (result != NULL && *result !=
'\0') {
2208 size_t len = strlen(result);
2211 memcpy(mb->
t, result, len);
2221 nix = rpmnixFree(nix);
2223 script =
_free(script);
2229 #ifdef WITH_PERLEMBED
2230 if (
STREQ(
"perl", f, fn)) {
2232 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2234 const char * result = NULL;
2239 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2240 if (result != NULL && *result !=
'\0') {
2241 size_t len = strlen(result);
2244 memcpy(mb->
t, result, len);
2251 script =
_free(script);
2257 #ifdef WITH_PYTHONEMBED
2258 if (
STREQ(
"python", f, fn)) {
2260 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2262 const char * result = NULL;
2267 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2268 if (result != NULL && *result !=
'\0') {
2269 size_t len = strlen(result);
2272 memcpy(mb->
t, result, len);
2279 script =
_free(script);
2285 #ifdef WITH_RUBYEMBED
2286 if (
STREQ(
"ruby", f, fn)) {
2288 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2290 const char * result = NULL;
2295 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2296 if (result != NULL && *result !=
'\0') {
2297 size_t len = strlen(result);
2300 memcpy(mb->
t, result, len);
2307 script =
_free(script);
2313 #ifdef WITH_SEMANAGE
2314 if (
STREQ(
"spook", f, fn)) {
2318 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2321 char * script = strndup(g, (
size_t)(se-g-1));
2324 static const char * _rpmsmStore =
"targeted";
2325 static unsigned int _rpmsmFlags = 0;
2327 rpmsm sm = (_globalI ? NULL
2328 :
rpmsmNew(_rpmsmStore, _rpmsmFlags));
2329 const char * result = NULL;
2337 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2338 if (result != NULL && *result !=
'\0') {
2339 size_t len = strlen(result);
2342 memcpy(mb->
t, result, len);
2351 script =
_free(script);
2358 if (
STREQ(
"sql", f, fn)) {
2360 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2362 const char * result = NULL;
2367 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2368 if (result != NULL && *result !=
'\0') {
2369 size_t len = strlen(result);
2372 memcpy(mb->
t, result, len);
2379 script =
_free(script);
2385 #ifdef WITH_SQUIRREL
2386 if (
STREQ(
"squirrel", f, fn)) {
2388 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2390 const char * result = NULL;
2395 if (result == NULL) result = _FIXME_embedded_interpreter_eval_returned_null;
2396 if (result != NULL && *result !=
'\0') {
2397 size_t len = strlen(result);
2400 memcpy(mb->
t, result, len);
2407 script =
_free(script);
2414 if (
STREQ(
"tcl", f, fn)) {
2416 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2418 const char * result = NULL;
2422 else if (result != NULL && *result !=
'\0') {
2423 size_t len = strlen(result);
2426 memcpy(mb->
t, result, len);
2432 script =
_free(script);
2439 if (lastc && fn > 5 &&
STREQ(
"patch", f, 5) &&
xisdigit((
int)f[5])) {
2441 doFoo(mb, negate, f, (lastc - f), NULL, 0);
2448 if (
STREQ(
"basename", f, fn) ||
2449 STREQ(
"dirname", f, fn) ||
2450 STREQ(
"realpath", f, fn) ||
2451 STREQ(
"getenv", f, fn) ||
2452 STREQ(
"shrink", f, fn) ||
2453 STREQ(
"suffix", f, fn) ||
2454 STREQ(
"expand", f, fn) ||
2455 STREQ(
"verbose", f, fn) ||
2456 STREQ(
"uncompress", f, fn) ||
2457 STREQ(
"mkstemp", f, fn) ||
2458 STREQ(
"mkdtemp", f, fn) ||
2459 STREQ(
"uuid", f, fn) ||
2460 STREQ(
"url2path", f, fn) ||
2461 STREQ(
"u2p", f, fn) ||
2462 STREQ(
"S", f, fn) ||
2463 STREQ(
"P", f, fn) ||
2464 STREQ(
"F", f, fn)) {
2466 doFoo(mb, negate, f, fn, g, gn);
2474 me = (mep ? *mep : NULL);
2480 if ((me == NULL && !negate) ||
2481 (me != NULL && negate)) {
2489 if (me && me->body && *me->body) {
2490 rc =
expandT(mb, me->body, strlen(me->body));
2498 if ((me == NULL && !negate) ||
2499 (me != NULL && negate)) {
2506 if (me && me->body && *me->body) {
2507 rc =
expandT(mb, me->body, strlen(me->body));
2514 #if !defined(RPM_VENDOR_WINDRIVER_DEBUG)
2517 if (fn == 1 && *f ==
'*') {
2526 if (!strncmp(f,
"if", fn) ||
2527 !strncmp(f,
"else", fn) ||
2528 !strncmp(f,
"endif", fn)) {
2533 _(
"Macro %%%.*s not found, skipping\n"), fn, f);
2542 if (!(g && g < ge)) {
2552 if (me && me->opts != NULL) {
2553 if (lastc != NULL) {
2564 if (me->body && *me->body) {
2572 if (me->opts != NULL)
2586 #if defined(RPM_VENDOR_OPENPKG) || \
2587 !defined(POPT_ERROR_BADCONFIG)
2593 if (stat(filename, &sb) == -1)
2596 if (sb.st_uid != uid)
2598 if (!S_ISREG(sb.st_mode))
2600 if (sb.st_mode & (S_IWGRP|S_IWOTH))
2606 #if !defined(DEBUG_MACROS)
2616 const char ** argv = NULL;
2617 char * globRoot = NULL;
2619 const char * old_collate = NULL;
2620 const char * old_ctype = NULL;
2643 for (j = 0; j < ac; j++) {
2644 const char * globURL;
2646 int ut =
urlPath(av[j], &path);
2650 argv = (
const char **)
xrealloc(argv, (argc+2) *
sizeof(*argv));
2653 fprintf(stderr,
"*** rpmGlob argv[%d] \"%s\"\n", argc, argv[argc]);
2666 for (i = 0; i < gl.
gl_pathc; i++) {
2667 if ((nb = strlen(&(gl.
gl_pathv[i][0]))) > maxb)
2674 globURL = globRoot = (
char *)
xmalloc(maxb);
2679 strncpy(globRoot, av[j], nb);
2693 fprintf(stderr,
"*** GLOB maxb %d diskURL %d %*s globURL %p %s\n", (
int)maxb, (
int)nb, (
int)nb, av[j], globURL, globURL);
2695 argv = (
const char **)
xrealloc(argv, (argc+gl.
gl_pathc+1) *
sizeof(*argv));
2698 for (i = 0; i < gl.
gl_pathc; i++) {
2699 const char * globFile = &(gl.
gl_pathv[
i][0]);
2700 if (globRoot > globURL && globRoot[-1] ==
'/')
2701 while (*globFile ==
'/') globFile++;
2702 strcpy(globRoot, globFile);
2704 fprintf(stderr,
"*** rpmGlob argv[%d] \"%s\"\n", argc, globURL);
2705 argv[argc++] =
xstrdup(globURL);
2710 globURL =
_free(globURL);
2713 if (argv != NULL && argc > 0) {
2727 (void)
setlocale(LC_COLLATE, old_collate);
2728 old_collate =
_free(old_collate);
2732 old_ctype =
_free(old_ctype);
2736 if (rc || argvPtr == NULL) {
2739 for (j = 0; j < argc; j++)
2740 argv[j] =
_free(argv[j]);
2757 if (sbuf == NULL || slen == 0)
2761 tbuf = (
char *)
alloca(slen + 1);
2780 strncpy(sbuf, tbuf, (slen - mb->
nb + 1));
2787 const char * n,
const char * o,
const char *
b,
int level)
2790 const char *
name = n;
2800 if ((mep =
findEntry(mc, name, 0)) == NULL) {
2801 if (mc->firstFree == mc->macrosAllocated)
2803 if (mc->macroTable != NULL)
2804 mep = mc->macroTable + mc->firstFree++;
2809 if (*mep && (*mep)->flags && !(n[0] ==
'.' && n[1] ==
'.')) {
2811 if (strcmp((*mep)->name,
"buildroot"))
2819 if ((*mep)->prev == NULL)
2831 if ((mep =
findEntry(mc, n, 0)) != NULL) {
2846 while ((mep =
findEntry(mc, n, 0)) != NULL) {
2857 memset(mb, 0,
sizeof(*mb));
2860 (void)
doDefine(mb, macro, level, 0);
2881 if (mc->macroTable != NULL) {
2883 for (i = 0; i < mc->firstFree; i++) {
2885 mep = &mc->macroTable[
i];
2890 addMacro(NULL, me->name, me->opts, me->body, (level - 1));
2895 #if defined(RPM_VENDOR_OPENPKG)
2896 static void expand_macrosfile_macro(
const char *file_name,
const char *buf,
size_t bufn)
2900 static const char *macro_name =
"%{macrosfile}";
2902 l = strlen(macro_name);
2903 k = strlen(file_name);
2904 while ((cp = strstr(buf, macro_name)) != NULL) {
2905 if (((strlen(buf) - l) + k) < bufn) {
2906 memmove(cp+k, cp+l, strlen(cp+l)+1);
2907 memcpy(cp, file_name, k);
2918 char *buf = (
char *)
alloca(bufn);
2925 fd =
Fopen(fn,
"r.fpio");
2926 if (fd == NULL ||
Ferror(fd)) {
2927 if (fd) (void)
Fclose(fd);
2937 while(
rdcl(buf, bufn, fd) != NULL) {
2949 if (s[1] ==
'{' && !strncmp(s+2,
"load:",
sizeof(
"load:")-1)) {
2950 char * se = (
char *)
matchchar(s,
'{',
'}');
2951 const char ** argv = NULL;
2956 _(
"%s:%u Missing '}' in \"%s\", skipping.\n"),
2960 s +=
sizeof(
"%{load:") - 1;
2965 _(
"%s:%u load depth exceeded, \"%s\" ignored.\n"),
2970 rc =
rpmGlob(se, &argc, &argv);
2971 for(i = 0; i < argc; i++) {
2973 #define _suffix(_s, _x) \
2974 (strlen(_s) >= sizeof(_x) && !strcmp((_s)+strlen(_s)-(sizeof(_x)-1), (_x)))
2976 ||
_suffix(argv[i],
".rpmnew")
2977 ||
_suffix(argv[i],
".rpmorig")
2978 ||
_suffix(argv[i],
".rpmsave"))
2983 argv[
i] =
_free(argv[i]);
2990 #if defined(RPM_VENDOR_OPENPKG)
2991 expand_macrosfile_macro(fn, buf, bufn);
3006 char *mfiles, *m, *me;
3008 if (macrofiles == NULL)
3015 for (m = mfiles; m && *m !=
'\0'; m = me) {
3020 for (me = m; (me = strchr(me,
':')) != NULL; me++) {
3022 if (!(me[1] ==
'/' && me[2] ==
'/'))
3026 if (me && *me ==
':')
3034 #if defined(DEBUG_MACROS)
3036 av =
xmalloc((ac + 1) *
sizeof(*av));
3047 for (i = 0; i < ac; i++) {
3048 size_t slen = strlen(av[i]);
3049 const char *fn = av[
i];
3051 if (fn[0] ==
'@' ) {
3053 #if defined(RPM_VENDOR_OPENPKG) || \
3054 !defined(POPT_ERROR_BADCONFIG)
3057 if (!poptSaneFile(fn))
3060 rpmlog(
RPMLOG_WARNING,
"existing RPM macros file \"%s\" considered INSECURE -- not loaded\n", fn);
3066 #define _suffix(_s, _x) \
3067 (slen >= sizeof(_x) && !strcmp((_s)+slen-(sizeof(_x)-1), (_x)))
3080 mfiles =
_free(mfiles);
3095 if (mc->macroTable != NULL) {
3097 for (i = 0; i < mc->firstFree; i++) {
3099 while ((me = mc->macroTable[i]) != NULL) {
3102 if ((mc->macroTable[i] = me->prev) == NULL)
3103 me->name =
_free(me->name);
3105 me->opts =
_free(me->opts);
3106 me->body =
_free(me->body);
3111 free(mc->macroTable);
3112 mc->macroTable = NULL;
3114 memset(mc, 0,
sizeof(*mc));
3124 unsigned char magic[13];
3125 #if defined(RPM_VENDOR_OPENPKG) || defined(RPM_VENDOR_FEDORA) || defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_PLD)
3130 #if defined(RPM_VENDOR_PLD)
3138 if ((strlen(file) > 6) && (strncasecmp(file,
"%PATCH", 6) == 0))
3142 #if defined(RPM_VENDOR_OPENPKG) || defined(RPM_VENDOR_FEDORA) || defined(RPM_VENDOR_MANDRIVA) || defined(RPM_VENDOR_PLD)
3143 file_len = strlen(file);
3144 if ((file_len > 4 && strcasecmp(file+file_len-4,
".tbz") == 0)
3145 || (file_len > 4 && strcasecmp(file+file_len-4,
".bz2") == 0)) {
3149 if (file_len > 4 && strcasecmp(file+file_len-4,
".zip") == 0) {
3153 if ((file_len > 4 && strcasecmp(file+file_len-4,
".tlz") == 0)
3154 || (file_len > 5 && strcasecmp(file+file_len-5,
".lzma") == 0)) {
3158 if (file_len > 4 && strcasecmp(file+file_len-3,
".xz") == 0) {
3162 if ((file_len > 4 && strcasecmp(file+file_len-4,
".tgz") == 0)
3163 || (file_len > 3 && strcasecmp(file+file_len-3,
".gz") == 0)
3164 || (file_len > 2 && strcasecmp(file+file_len-2,
".Z") == 0)) {
3168 if (file_len > 5 && strcasecmp(file+file_len-5,
".cpio") == 0) {
3172 if (file_len > 4 && strcasecmp(file+file_len-4,
".tar") == 0) {
3178 fd =
Fopen(file,
"r");
3179 if (fd == NULL ||
Ferror(fd)) {
3182 if (fd) (void)
Fclose(fd);
3185 nb =
Fread(magic,
sizeof(magic[0]),
sizeof(magic), fd);
3186 if (nb < (ssize_t)0) {
3189 }
else if (nb < (ssize_t)
sizeof(magic)) {
3191 file, (
unsigned)
sizeof(magic));
3200 if (magic[0] ==
'B' && magic[1] ==
'Z')
3203 if (magic[0] == (
unsigned char) 0120 && magic[1] == (
unsigned char) 0113
3204 && magic[2] == (
unsigned char) 0003 && magic[3] == (
unsigned char) 0004)
3207 if (magic[0] == (
unsigned char) 0x89 && magic[1] ==
'L'
3208 && magic[2] ==
'Z' && magic[3] ==
'O')
3211 #if !defined(RPM_VENDOR_OPENPKG) && !defined(RPM_VENDOR_FEDORA) && !defined(RPM_VENDOR_MANDRIVA) && !defined(RPM_VENDOR_PLD)
3213 if (magic[ 9] == (
unsigned char) 0x00 && magic[10] == (
unsigned char) 0x00 &&
3214 magic[11] == (
unsigned char) 0x00 && magic[12] == (
unsigned char) 0x00)
3218 #if defined(RPM_VENDOR_OPENSUSE)
3219 if (magic[0] == 0135 && magic[1] == 0 && magic[2] == 0)
3223 if (magic[0] == (
unsigned char) 0xFD && magic[1] == 0x37 && magic[2] == 0x7A
3224 && magic[3] == 0x58 && magic[4] == 0x5A && magic[5] == 0x00)
3226 else if ((magic[0] ==
'L') && (magic[1] ==
'Z') &&
3227 (magic[2] ==
'I') && (magic[3] ==
'P'))
3229 else if ((magic[0] ==
'L') && (magic[1] ==
'R') &&
3230 (magic[2] ==
'Z') && (magic[3] ==
'I'))
3232 else if ((magic[0] ==
'7') && (magic[1] ==
'z') &&
3233 (magic[2] == 0xbc) && (magic[3] == 0xaf) &&
3234 (magic[4] == 0x27) && (magic[5] == 0x1c))
3237 if ((magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0213)
3238 || (magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0236)
3239 || (magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0036)
3240 || (magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0240)
3241 || (magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0235))
3265 t = (
char *)
xmalloc(bufn + strlen(arg) + 1);
3270 while ((s = va_arg(ap,
const char *)) != NULL) {
3273 t = (
char *)
xrealloc(t, tn + sn + bufn + 1);
3282 t[tn + bufn] =
'\0';
3283 t = (
char *)
xrealloc(t, strlen(t) + 1);
3301 t = (
char *)
xmalloc(bufn + strlen(arg) + 1);
3306 while ((s = va_arg(ap,
const char *)) != NULL) {
3309 t = (
char *)
xrealloc(t, tn + sn + bufn + 1);
3318 t[tn + bufn] =
'\0';
3319 t = (
char *)
xrealloc(t, strlen(t) + 1);
3335 if (!(val && *val !=
'%'))
3337 else if (*val ==
'Y' || *val ==
'y')
3339 else if (*val ==
'N' || *val ==
'n')
3343 rc = strtol(val, &end, 0);
3344 if (!(end && *end ==
'\0'))
3364 while (*s !=
'\0') {
3368 if (s[1] ==
'/' && s[2] ==
'/') {
3372 if (s[0] ==
'/') *t++ = *s++;
3380 for (se = te + 1; se < t && *se !=
'/'; se++)
3382 if (se < t && *se ==
'/') {
3388 while (t > te && t[-1] ==
'/')
3398 if (begin && s[1] ==
'.' && (s[2] ==
'/' || s[2] ==
'\0')) {
3404 if (begin && s[1] ==
'\0') {
3407 if (t > path && t[-1] ==
'/')
3410 case '\0': s++;
continue;
3414 if (!begin && t > path && t[-1] ==
'/' && s[1] ==
'.' && (s[2] ==
'/' || s[2] ==
'\0')) {
3418 for (--te; te > path && *te !=
'/'; te--)
3434 if (t > &path[1] && t[-1] ==
'/')
3448 char *buf = (
char *)
alloca(bufn);
3463 while ((s = va_arg(ap,
const char *)) != NULL) {
3465 slashed = (s[0] ==
'/' && s[1] ==
'\0');
3480 size_t nb = strlen(buf);
3481 if (buf[nb-1] !=
'/')
3491 const char *
rpmGenPath(
const char * urlroot,
const char * urlmdir,
3492 const char *urlfile)
3494 const char * xroot =
rpmGetPath(urlroot, NULL);
3495 const char * root = xroot;
3496 const char * xmdir =
rpmGetPath(urlmdir, NULL);
3497 const char * mdir = xmdir;
3498 const char * xfile =
rpmGetPath(urlfile, NULL);
3499 const char *
file = xfile;
3500 const char * result;
3501 const char * url = NULL;
3506 if (_debug) fprintf(stderr,
"*** RGP xroot %s xmdir %s xfile %s\n", xroot, xmdir, xfile);
3512 if (root >= url && root <= url+nurl)
3513 nurl -= strlen(root);
3515 if (_debug) fprintf(stderr,
"*** RGP ut %d root %s nurl %u\n", ut, root, (
unsigned)nurl);
3518 if (root == NULL || *root ==
'\0') root =
"/";
3524 if (mdir >= url && mdir <= url+nurl)
3525 nurl -= strlen(mdir);
3527 if (_debug) fprintf(stderr,
"*** RGP ut %d mdir %s nurl %u\n", ut, mdir, (
unsigned)nurl);
3530 if (mdir == NULL || *mdir ==
'\0') mdir =
"/";
3536 if (file >= url && file <= url+nurl)
3537 nurl -= strlen(file);
3539 if (_debug) fprintf(stderr,
"*** RGP ut %d file %s nurl %u\n", ut, file, (
unsigned)nurl);
3543 if (url && nurl > 0) {
3544 char *t = strncpy((
char *)
alloca(nurl+1), url, nurl);
3550 result =
rpmGetPath(url, root,
"/", mdir,
"/", file, NULL);
3552 xroot =
_free(xroot);
3553 xmdir =
_free(xmdir);
3554 xfile =
_free(xfile);
3556 if (_debug) fprintf(stderr,
"*** RGP result %s\n", result);
3563 #if defined(DEBUG_MACROS)
3565 #if defined(EVAL_MACROS)
3570 main(
int argc,
char *argv[])
3574 extern char *optarg;
3577 while ((c = getopt(argc, argv,
"f:")) != EOF ) {
3580 rpmMacrofiles = optarg;
3588 if (errflg || optind >= argc) {
3589 fprintf(stderr,
"Usage: %s [-f macropath ] macro ...\n", argv[0]);
3595 for ( ; optind < argc; optind++) {
3600 fprintf(stdout,
"%s:\t%s\n", argv[optind], val);
3610 const char *rpmMacrofiles =
"../macros:./testmacros";
3611 const char *testfile =
"./test";
3614 main(
int argc,
char *argv[])
3617 char *buf = (
char *)
alloca(bufn);
3623 if ((fp = fopen(testfile,
"r")) != NULL) {
3624 while(
rdcl(buf, bufn, fp)) {
3626 fprintf(stderr,
"%d->%s\n", x, buf);
3627 memset(buf, 0, bufn);
3632 while(
rdcl(buf, bufn, stdin)) {
3634 fprintf(stderr,
"%d->%s\n <-\n", x, buf);
3635 memset(buf, 0, bufn);
void rpmInitMacros(MacroContext mc, const char *macrofiles)
Initialize macro context from set of macrofile(s).
void rpmFreeMacros(MacroContext mc)
Destroy macro context.
static void printMacro(MacroBuf mb, const char *s, const char *se)
Pre-print macro expression to be expanded.
int rpmuuidMake(int version, const char *ns, const char *data, char *buf_str, unsigned char *buf_bin)
Generate a Universally Unique Identifier (UUID).
rpmsm rpmsmFree(rpmsm sm)
Destroy a semanage wrapper.
const char * _rpmaugLoadpath
static void doFoo(MacroBuf mb, int negate, const char *f, size_t fn, const char *g, size_t gn)
Execute macro primitives.
const char const char size_t len
int isCompressed(const char *file, rpmCompressedMagic *compressed)
Return type of compression used in file.
char * getenv(const char *name)
static const char * doUnglobal(MacroContext mc, const char *se)
Parse (and execute) macro undefinition.
const char const char * cmd
rpmsquirrel rpmsquirrelFree(rpmsquirrel squirrel)
Destroy a squirrel interpreter.
static int xisalnum(int c)
char * xstrdup(const char *str)
char * rpmCleanPath(char *path)
Canonicalize file path.
int Glob_error(const char *epath, int eerrno)
glob_error(3) clone.
FD_t Fopen(const char *path, const char *_fmode)
fopen(3) clone.
rpmjs rpmjsFree(rpmjs js)
Destroy a js interpreter.
char * rpmGetPath(const char *path,...)
Return (malloc'ed) expanded, canonicalized, file path.
void rpmLoadMacros(MacroContext mc, int level)
Load macros from specific context into global context.
int Access(const char *path, int amode)
access(2) clone.
MacroContext rpmCLIMacroContext
int main(int argc, const char **argv, char **envp)
static const char uuid_ns[]
rpmlua rpmluaGetGlobalState(void)
static const char * matchchar(const char *p, char pl, char pr)
Return text between pl and matching pr characters.
rpmficl rpmficlNew(char **av, uint32_t flags)
Create and load a ficl interpreter.
void Globfree(void *_pglob)
globfree(3) clone.
void delMacroAll(MacroContext mc, const char *n)
static void pushMacro(MacroEntry *mep, const char *n, const char *o, const char *b, int level)
Push new macro definition onto macro entry stack.
static const char * doUndefine(MacroContext mc, const char *se)
Parse (and execute) macro undefinition.
#define POPT_ARGV_ARRAY_GROW_DELTA
void addMacro(MacroContext mc, const char *n, const char *o, const char *b, int level)
Add macro to context.
static void printExpansion(MacroBuf mb, const char *t, const char *te)
Post-print expanded macro expression.
static int xisalpha(int c)
static void rpmlog(int code, const char *fmt,...)
static size_t _macro_BUFSIZ
static int expandFIFO(MacroBuf mb, MacroEntry me, const char *g, size_t gn)
rpmRC rpmaugRun(rpmaug aug, const char *str, const char **resultp)
Run augeas commands from a buffer.
struct MacroBuf_s * MacroBuf
static void popMacro(MacroEntry *mep)
Pop macro definition from macro entry stack.
unsigned int _rpmaugFlags
static int XpoptDupArgv(int argc, char **argv, int *argcPtr, char ***argvPtr)
rpmsql rpmsqlNew(char **av, uint32_t flags)
Create and load a sql interpreter.
rpmpython rpmpythonFree(rpmpython python)
Destroy a python interpreter.
static void sortMacroTable(MacroContext mc)
Sort entries in macro table.
Yet Another syslog(3) API clone.
#define DRD_xstrdup(_str)
static char * dupMacroEntry(MacroEntry me)
int rpmGlob(const char *patterns, int *argcPtr, const char ***argvPtr)
Return URL path(s) from a (URL prefixed) pattern glob.
static int expandT(MacroBuf mb, const char *f, size_t flen)
Save source and expand field into target.
void delMacro(MacroContext mc, const char *n)
Delete macro from context.
const char * Fstrerror(FD_t fd)
strerror(3) clone.
void * xcalloc(size_t nmemb, size_t size)
static void expandMacroTable(MacroContext mc)
Enlarge macro table.
MacroContext rpmGlobalMacroContext
rpmgit rpmgitFree(rpmgit git)
Destroy a git wrapper.
int Glob(const char *pattern, int flags, int errfunc(const char *epath, int eerrno), void *_pglob)
glob(3) clone.
rpmruby rpmrubyNew(char **av, uint32_t flags)
Creates and initializes a Ruby interpreter.
rpmRC rpmpythonRun(rpmpython python, const char *str, const char **resultp)
Execute python string.
char * realpath(const char *path, char resolved_path[])
int rpmGetMacroEntries(MacroContext mc, void *_mire, int used, const char ***avp)
Return macro entries as string array.
char * stpncpy(char *dest, const char *src, size_t n)
#define SKIPBLANK(_s, _c)
static int xisspace(int c)
struct rpmperl_s * rpmperl
#define setlocale(Category, Locale)
rpmRC rpmficlRun(rpmficl ficl, const char *str, const char **resultp)
Execute ficl string.
const char * rpmluaGetPrintBuffer(rpmlua _lua)
rpmperl rpmperlNew(char **av, uint32_t flags)
Create and load a perl interpreter.
rpmjs rpmjsNew(char **av, uint32_t flags)
Create and load a js interpreter.
int rpmDefineMacro(MacroContext mc, const char *macro, int level)
Define macro in context.
struct rpmpython_s * rpmpython
rpmRC rpmsmRun(rpmsm sm, char **av, const char **resultp)
Run semanage commands.
#define SAVECHAR(_mb, _c)
#define POPT_ERROR_BADQUOTE
int Glob_pattern_p(const char *pattern, int quote)
glob_pattern_p(3) clone.
#define _PRINT_MACRO_TRACE
rpmpython rpmpythonNew(char **av, uint32_t flags)
Create and load a python interpreter.
#define STREQ(_t, _f, _fn)
The FD_t File Handle data structure.
const char * rpmMacrofiles
List of macro files to read when configuring rpm.
const char * rpmGenPath(const char *urlroot, const char *urlmdir, const char *urlfile)
Merge 3 args into path, any or all of which may be a url.
void rpmDumpMacroTable(MacroContext mc, FILE *fp)
Print macros to file stream.
int mireRegexec(miRE mire, const char *val, size_t vallen)
Execute pattern match.
static char * rdcl(char *buf, size_t size, FD_t fd)
fgets(3) analogue that reads \ continuations.
rpmRC rpmsquirrelRun(rpmsquirrel squirrel, const char *str, const char **resultp)
Execute squirrel string.
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
rpmaug rpmaugFree(rpmaug aug)
Destroy a augeas wrapper.
Embedded Ruby interpreter.
size_t Fread(void *buf, size_t size, size_t nmemb, FD_t fd)
fread(3) clone.
const char const char int arg
static int XpoptParseArgvString(const char *s, int *argcPtr, char ***argvPtr)
static const char * grabArgs(MacroBuf mb, const MacroEntry me, const char *se, const char *lastc)
Parse arguments (to next new line) for parameterized macro.
static int expandMacro(MacroBuf mb)
Parse args and string for PHP like %{foo
: } syntax.
static int expandU(MacroBuf mb, char *u, size_t ulen)
Save source/target and expand macro in u.
int Fclose(FD_t fd)
fclose(3) clone.
struct rpmruby_s * rpmruby
#define _PRINT_EXPAND_TRACE
#define POPT_ERROR_MALLOC
#define COPYOPTS(_oe, _s, _c)
rpmruby rpmrubyFree(rpmruby ruby)
Destroys a Ruby interpreter instance.
struct rpmsquirrel_s * rpmsquirrel
rpmsm rpmsmNew(const char *fn, unsigned int flags)
Create and load a semanage wrapper.
int Ferror(FD_t fd)
ferror(3) clone.
rpmsql rpmsqlFree(rpmsql sql)
Destroy a sql interpreter.
const char const char const char * opts
enum rpmCompressedMagic_e rpmCompressedMagic
static int xisdigit(int c)
urltype urlPath(const char *url, const char **pathp)
Return path component of URL.
const char const bson * key
static const char * doDefine(MacroBuf mb, const char *se, int level, int expandbody)
Parse (and execute) new macro definition.
char * stpcpy(char *dest, const char *src)
const char const char size_t size
struct MacroContext_s * MacroContext
static int compareMacroName(const void *ap, const void *bp)
Compare macro entries by name (qsort/bsearch).
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static void doOutput(MacroBuf mb, int waserror, const char *msg, size_t msglen)
Perform macro message output.
static void freeArgs(MacroBuf mb)
Free parsed arguments for parameterized macro.
rpmRC rpmgitRun(rpmgit git, const char *str, const char **resultp)
Execute git string.
int rpmSecuritySaneFile(const char *filename)
Check whether configuration file is moderately secure to load.
static struct MacroContext_s rpmCLIMacroContext_s
rpmRC rpmsqlRun(rpmsql sql, const char *str, const char **resultp)
Execute sql from STRING | FILE | STDIN | INTERACTIVE.
static struct MacroContext_s rpmGlobalMacroContext_s
#define COPYNAME(_ne, _s, _c)
static MacroEntry * findEntry(MacroContext mc, const char *name, size_t namelen)
Find entry in macro table.
rpmtcl rpmtclFree(rpmtcl tcl)
Destroy a tcl interpreter.
int expandMacros(void *spec, MacroContext mc, char *sbuf, size_t slen)
Expand macro into buffer.
struct rpmficl_s * rpmficl
rpmRC rpmrubyRun(rpmruby ruby, const char *str, const char **resultp)
Evaluates Ruby code stored in a string.
rpmaug rpmaugNew(const char *root, const char *loadpath, unsigned int flags)
Create and load a augeas wrapper.
rpmficl rpmficlFree(rpmficl ficl)
Destroy a ficl interpreter.
static int doShellEscape(MacroBuf mb, const char *cmd, size_t clen)
Expand output of shell command into target buffer.
int rpmLoadMacroFile(MacroContext mc, const char *fn, int nesting)
Load macro context from a macro file.
struct MacroEntry_s * MacroEntry
rpmRC rpmjsRun(rpmjs js, const char *str, const char **resultp)
Execute js string.
int rpmlogSetMask(int mask)
Set the log mask level.
rpmgit rpmgitNew(char **av, uint32_t flags, void *_opts)
Create and load a git wrapper.
static rpmuint32_t uuid_version
rpmsquirrel rpmsquirrelNew(char **av, uint32_t flags)
rpmperl rpmperlFree(rpmperl perl)
Destroy a perl interpreter.
rpmtcl rpmtclNew(char **av, uint32_t flags)
Create and load a tcl interpreter.
rpmRC rpmperlRun(rpmperl perl, const char *str, const char **resultp)
Execute perl string.
int rpmExpandNumeric(const char *arg)
Return macro expansion as a numeric value.
int rpmluaRunScript(rpmlua _lua, const char *script, const char *name)
int rpmUndefineMacro(MacroContext mc, const char *macro)
Undefine macro in context.
rpmRC rpmtclRun(rpmtcl tcl, const char *str, const char **resultp)
Execute tcl string.
char * rpmMCExpand(MacroContext mc, const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s) in a context.