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)
55 if (p !=
NULL) free((
void *)p);
69 #define _RPMLUA_INTERNAL
73 #define _RPMAUG_INTERNAL
80 #define _RPMNIX_INTERNAL
97 #define _MACRO_INTERNAL
103 #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)
104 static int _globalI = 0x80000000;
107 #if defined(__LCLINT__)
109 extern const unsigned short int **__ctype_b_loc (
void) ;
148 #define SAVECHAR(_mb, _c) { *(_mb)->t = (char) (_c), (_mb)->t++, (_mb)->nb--; }
152 #define _MAX_MACRO_DEPTH 16
156 #define _PRINT_MACRO_TRACE 0
160 #define _PRINT_EXPAND_TRACE 0
164 #define _MAX_LOAD_DEPTH 2
169 #define MACRO_CHUNK_SIZE 16
193 compareMacroName(
const void * ap,
const void * bp)
205 return strcmp(ame->name, bme->name);
216 if (mc->macroTable ==
NULL) {
219 xmalloc(
sizeof(*mc->macroTable) * mc->macrosAllocated);
224 xrealloc(mc->macroTable,
sizeof(*mc->macroTable) *
225 mc->macrosAllocated);
240 if (mc ==
NULL || mc->macroTable ==
NULL)
243 qsort(mc->macroTable, mc->firstFree,
sizeof(mc->macroTable[0]),
247 for (i = 0; i < mc->firstFree; i++) {
248 if (mc->macroTable[i] !=
NULL)
255 #if !defined(DEBUG_MACROS)
264 nb = strlen(me->name) +
sizeof(
"%") - 1;
266 nb += strlen(me->opts) +
sizeof(
"()") - 1;
268 nb += strlen(me->body) +
sizeof(
"\t") - 1;
291 if (fp ==
NULL) fp = stderr;
293 fprintf(fp,
"========================\n");
294 if (mc->macroTable !=
NULL) {
296 for (i = 0; i < mc->firstFree; i++) {
298 if ((me = mc->macroTable[i]) ==
NULL) {
303 fprintf(fp,
"%3d%c %s", me->level,
304 (me->used > 0 ?
'=' :
':'), me->name);
305 if (me->opts && *me->opts)
307 if (me->body && *me->body)
313 fprintf(fp,
_(
"======================== active %d empty %d\n"),
317 #if !defined(DEBUG_MACROS)
333 return mc->firstFree;
335 av = (
const char **)
xcalloc( (mc->firstFree+1),
sizeof(mc->macroTable[0]));
336 if (mc->macroTable !=
NULL)
337 for (i = 0; i < mc->firstFree; i++) {
339 me = mc->macroTable[
i];
340 if (used > 0 && me->used < used)
342 if (used == 0 && me->used != 0)
344 #if !defined(DEBUG_MACROS)
351 *avp = av = (
const char **)
xrealloc(av, (ac+1) *
sizeof(*av));
374 if (mc->macroTable ==
NULL || mc->firstFree == 0)
385 key->name = (
char *)name;
387 ret = (
MacroEntry *) bsearch(&key, mc->macroTable, mc->firstFree,
388 sizeof(*(mc->macroTable)), compareMacroName);
418 if (fgets(q, (
int)size, f) ==
NULL)
422 for (q += nb - 1; nb > 0 &&
iseol(*q); q--)
424 for (; p <=
q; p++) {
436 case '{': p++,
bc++;
break;
437 case '(': p++, pc++;
break;
438 case '%': p++;
break;
441 case '{':
if (
bc > 0)
bc++;
break;
442 case '}':
if (
bc > 0)
bc--;
break;
443 case '(':
if (pc > 0) pc++;
break;
444 case ')':
if (pc > 0) pc--;
break;
447 if (nb == 0 || (*q !=
'\\' && !
bc && !pc) || *(q+1) ==
'\0') {
456 return (nread > 0 ? buf :
NULL);
468 matchchar(
const char * p,
char pl,
char pr)
474 while ((c = *p++) !=
'\0') {
480 if (--lvl <= 0)
return --
p;
494 printMacro(
MacroBuf mb,
const char *
s,
const char *
se)
504 (2 * mb->
depth + 1),
"");
512 for (senl = se; *senl && !
iseol(*senl); senl++)
516 choplen = 61 - (2 * mb->
depth);
525 (2 * mb->
depth + 1),
"", (
int)(se - s), s);
526 if (se[1] !=
'\0' && (senl - (se+1)) > 0)
527 fprintf(stderr,
"%-.*s%s", (
int)(senl - (se+1)), se+1, ellipsis);
551 while (te > t &&
iseol(te[-1]))
558 while ((tenl = strchr(t,
'\n')) && tenl < te)
562 choplen = 61 - (2 * mb->
depth);
571 fprintf(stderr,
"%.*s%s", (
int)(te - t), t, ellipsis);
575 #define SKIPBLANK(_s, _c) \
577 while (((_c) = (int) *(_s)) && isblank(_c)) \
581 #define SKIPNONBLANK(_s, _c) \
583 while (((_c) = (int) *(_s)) && !(isblank(_c) || iseol(_c))) \
587 #define COPYNAME(_ne, _s, _c) \
588 { SKIPBLANK(_s,_c); \
589 while(((_c) = (int) *(_s)) && (xisalnum(_c) || (_c) == (int) '_')) \
590 *(_ne)++ = *(_s)++; \
594 #define COPYOPTS(_oe, _s, _c) \
595 { while(((_c) = (int) *(_s)) && (_c) != (int) ')') \
596 *(_oe)++ = *(_s)++; \
608 expandT(
MacroBuf mb,
const char * f,
size_t flen)
613 const char *s = mb->
s;
617 memset(sbuf, 0, (flen + 1));
640 const char *t = mb->
t;
665 const char *s = mb->
s;
671 tbuf = (
char *)
alloca(ulen + 1);
672 memset(tbuf, 0, (ulen + 1));
698 doShellEscape(
MacroBuf mb,
const char * cmd,
size_t clen)
714 if ((shf = popen(buf,
"r")) ==
NULL)
716 while(mb->
nb > 0 && (c = fgetc(shf)) != EOF)
737 doDefine(
MacroBuf mb,
const char * se,
int level,
int expandbody)
743 char *buf = (
char *)
alloca(bufn);
772 if (c == (
int)
'{') {
773 if ((se = matchchar(s, (
char) c,
'}')) ==
NULL) {
775 _(
"Macro %%%s has unterminated body\n"), n);
787 while (*s && (bc || pc || !
iseol(*s))) {
797 case '{': *be++ = *s++; bc++;
break;
798 case '(': *be++ = *s++; pc++;
break;
799 case '%': *be++ = *s++;
break;
802 case '{':
if (bc > 0) bc++;
break;
803 case '}':
if (bc > 0) bc--;
break;
804 case '(':
if (pc > 0) pc++;
break;
805 case ')':
if (pc > 0) pc--;
break;
813 _(
"Macro %%%s has unterminated body\n"), n);
820 while (--be >= b && (c = (
int) *be) && (
isblank(c) ||
iseol(c)))
832 if (!((c = (
int) *n) && (
xisalpha(c) || c == (
int)
'_') && (ne - n) > 2)) {
834 _(
"Macro %%%s has illegal name (%%define)\n"), n);
839 if (o && oc != (
int)
')') {
850 if (expandbody &&
expandU(mb, b, (&buf[bufn] - b))) {
878 char *n =
buf, *ne =
n;
889 if (!((c = (
int) *n) && (
xisalpha(c) || c == (
int)
'_') && (ne - n) > 2)) {
891 _(
"Macro %%%s has illegal name (%%undefine)\n"), n);
913 char *n =
buf, *ne =
n;
924 if (!((c = *n) && (
xisalpha(c) || c ==
'_') && (ne - n) > 2)) {
926 _(
"Macro %%%s has illegal name (%%unglobal)\n"), n);
943 fprintf(stderr,
"\tme %p", me);
945 fprintf(stderr,
"\tname %p(%s) prev %p",
946 me->name, me->name, me->prev);
961 const char * b,
int level)
966 const char *name =
n;
976 me->name = (prev ? prev->name :
xstrdup(name));
978 me->body =
xstrdup(b ? b :
"");
981 me->flags = (name !=
n);
1003 if ((*mep = me->prev) ==
NULL)
1004 me->name =
_free(me->name);
1005 me->opts =
_free(me->opts);
1006 me->body =
_free(me->body);
1025 if (mc ==
NULL || mc->macroTable ==
NULL)
1029 for (i = 0; i < mc->firstFree; i++) {
1032 mep = &mc->macroTable[
i];
1037 if (me->level < mb->
depth)
1039 if (strlen(me->name) == 1 && strchr(
"#*0", *me->name)) {
1040 if (*me->name ==
'*' && me->used > 0)
1042 }
else if (!skiptest && me->used <= 0) {
1045 _(
"Macro %%%s (%s) was not used below level %d\n"),
1046 me->name, me->body, me->level);
1075 struct poptOption *optTbl;
1077 char *buf = (
char *)
alloca(bufn);
1084 unsigned int popt_flags;
1088 b = be =
stpcpy(buf, me->name);
1096 while ((c = (
int) *se++) != (
int)
'\0' && (se-1) != lastc) {
1110 if (c == (
int)
'\0') se--;
1133 argv = (
const char **)
alloca((argc + 1) *
sizeof(*argv));
1138 for (c = 0; c < argc; c++) {
1149 popt_flags = POPT_CONTEXT_NO_EXEC;
1150 #if defined(RPM_VENDOR_OPENPKG)
1151 popt_flags |= POPT_CONTEXT_POSIXMEHARDER;
1153 if (me->opts[0] ==
'+') popt_flags |= POPT_CONTEXT_POSIXMEHARDER;
1157 if (*opts ==
'+') opts++;
1158 for (c = 0; *opts !=
'\0'; opts++)
1159 if (*opts !=
':') c++;
1162 optTbl = (
struct poptOption *)
xcalloc(
sizeof(*optTbl), (c + 1));
1164 if (*opts ==
'+') opts++;
1165 for (c = 0; *opts !=
'\0'; opts++) {
1166 if (*opts ==
':')
continue;
1167 optTbl[
c].shortName = opts[0];
1168 optTbl[
c].val = (
int) opts[0];
1170 optTbl[
c].argInfo = POPT_ARG_STRING;
1176 optCon = poptGetContext(argv[0], argc, argv, optTbl, popt_flags);
1178 while ((c = poptGetNextOpt(optCon)) > 0) {
1179 const char * optArg = poptGetOptArg(optCon);
1182 if (optArg !=
NULL) {
1187 aname[0] =
'-'; aname[1] = (char)c; aname[2] =
'\0';
1189 if (optArg !=
NULL) {
1190 aname[0] =
'-'; aname[1] = (char)c; aname[2] =
'*'; aname[3] =
'\0';
1195 optArg =
_free(optArg);
1201 poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(c));
1205 argv = poptGetArgs(optCon);
1208 for (c = 0; argv[
c] !=
NULL; c++)
1219 for (c = 0; c < argc; c++) {
1220 sprintf(aname,
"%d", (c + 1));
1222 if (be != b) *be++ =
' ';
1223 be =
stpcpy(be, argv[c]);
1231 optCon = poptFreeContext(optCon);
1232 if (optTbl) free(optTbl);
1245 doOutput(
MacroBuf mb,
int waserror,
const char * msg,
size_t msglen)
1250 char *buf = (
char *)
alloca(bufn);
1272 const char *
g,
size_t gn)
1277 char * buf = (
char *)
alloca(bufn);
1288 if (fn > 5 &&
STREQ(
"patch", f, 5) &&
xisdigit((
int)f[5])) {
1290 for (c = 5; c < (
int)(fn-1) && f[
c] ==
'0' &&
xisdigit((
int)f[c+1]);)
1296 if (
STREQ(
"basename", f, fn)) {
1297 if ((b = strrchr(buf,
'/')) ==
NULL)
1301 }
else if (
STREQ(
"dirname", f, fn)) {
1302 if ((b = strrchr(buf,
'/')) !=
NULL)
1305 #if !defined(__LCLINT__)
1306 }
else if (
STREQ(
"realpath", f, fn)) {
1312 if ((
size_t)(l+1) <= bufn) {
1313 memcpy(buf, cp, l+1);
1318 }
else if (
STREQ(
"getenv", f, fn)) {
1322 }
else if (
STREQ(
"shrink", f, fn)) {
1327 int i,
j,
k, was_space = 0;
1328 for (i = 0, j = 0, k = (
int)strlen(buf); i <
k; ) {
1334 else if (was_space) {
1340 buf[j++] = buf[i++];
1344 }
else if (
STREQ(
"suffix", f, fn)) {
1345 if ((b = strrchr(buf,
'.')) !=
NULL)
1347 }
else if (
STREQ(
"expand", f, fn)) {
1349 }
else if (
STREQ(
"verbose", f, fn)) {
1350 #if defined(RPMLOG_MASK)
1357 b = (
negate) ? NULL : buf;
1359 }
else if (
STREQ(
"url2path", f, fn) ||
STREQ(
"u2p", f, fn)) {
1360 int ut =
urlPath(buf, (
const char **)&b);
1362 if (*b ==
'\0') b = (
char *)
"/";
1363 }
else if (
STREQ(
"uncompress", f, fn)) {
1374 switch(compressed) {
1380 sprintf(be,
"%%__gzip -dc '%s'", b);
1383 sprintf(be,
"%%__bzip2 -dc '%s'", b);
1386 sprintf(be,
"%%__unzip -qq '%s'", b);
1389 sprintf(be,
"%%__lzop -dc '%s'", b);
1392 sprintf(be,
"%%__lzma -dc '%s'", b);
1395 sprintf(be,
"%%__xz -dc '%s'", b);
1398 sprintf(be,
"%%__lrzip -dqo- %s", b);
1401 sprintf(be,
"%%__lzip -dc %s", b);
1404 sprintf(be,
"%%__7zip x %s", b);
1408 }
else if (
STREQ(
"mkstemp", f, fn)) {
1416 #if defined(HAVE_MKSTEMP)
1418 (
void) close(mkstemp(b));
1423 }
else if (
STREQ(
"mkdtemp", f, fn)) {
1431 #if defined(HAVE_MKDTEMP) && !defined(__LCLINT__)
1432 if (mkdtemp(b) ==
NULL)
1435 if ((b = tmpnam(b)) !=
NULL)
1436 (
void) mkdir(b, 0700);
1438 }
else if (
STREQ(
"uuid", f, fn)) {
1441 const char *uuid_data;
1449 if ((n = strspn(cp,
" \t\n")) > 0)
1451 if ((n = strcspn(cp,
" \t\n")) > 0) {
1452 uuid_version = (
int)strtol(cp, (
char **)
NULL, 10);
1454 if ((n = strspn(cp,
" \t\n")) > 0)
1456 if ((n = strcspn(cp,
" \t\n")) > 0) {
1460 if ((n = strspn(cp,
" \t\n")) > 0)
1462 if ((n = strcspn(cp,
" \t\n")) > 0) {
1475 }
else if (
STREQ(
"S", f, fn)) {
1480 sprintf(b,
"%%SOURCE%s", buf);
1483 }
else if (
STREQ(
"P", f, fn)) {
1491 }
else if (
STREQ(
"F", f, fn)) {
1492 b = buf + strlen(buf) + 1;
1493 sprintf(b,
"file%s.file", buf);
1497 (
void) expandT(mb, b, strlen(b));
1510 rc = expandT(mb, g, gn);
1512 rc = expandT(mb, me->body, strlen(me->body));
1517 #if !defined(DEBUG_MACROS)
1521 #define POPT_ERROR_NOARG -10
1522 #define POPT_ERROR_BADQUOTE -15
1523 #define POPT_ERROR_MALLOC -21
1525 #define POPT_ARGV_ARRAY_GROW_DELTA 5
1528 int * argcPtr,
char *** argvPtr)
1531 size_t nb = (argc + 1) *
sizeof(*argv);
1536 if (argc <= 0 || argv ==
NULL)
1538 for (i = 0; i < argc; i++) {
1539 if (argv[i] ==
NULL)
1541 nb += strlen(argv[i]) + 1;
1547 argv2 = (
char **) dst;
1548 dst += (argc + 1) *
sizeof(*argv);
1550 for (i = 0; i < argc; i++) {
1552 dst += strlen(strcpy(dst, argv[i])) + 1;
1573 char **
argv = (
char **)
xmalloc(
sizeof(*argv) * argvAlloced);
1575 size_t buflen = strlen(s) + 1;
1576 char * buf = (
char *)
memset(
alloca(buflen), 0, buflen);
1579 if (argv ==
NULL)
return rc;
1582 for (src = s; *src !=
'\0'; src++) {
1583 if (quote == *src) {
1585 }
else if (quote !=
'\0') {
1592 if (*src != quote) *buf++ =
'\\';
1595 }
else if (isspace(*src)) {
1596 if (*argv[argc] !=
'\0') {
1598 if (argc == argvAlloced) {
1600 argv = (
char **) realloc(argv,
sizeof(*argv) * argvAlloced);
1605 }
else switch (*src) {
1623 if (strlen(argv[argc])) {
1630 if (argv) free(argv);
1642 #if defined(WITH_AUGEAS) || defined(WITH_FICL) || defined(WITH_GPSEE) || defined(WITH_PERLEMBED) || defined(WITH_PYTHONEMBED) || defined(WITH_RUBYEMBED) || defined(WITH_SQLITE) || defined(WITH_SQUIRREL) || defined(WITH_TCL)
1643 static char * parseEmbedded(
const char * s,
size_t nb,
char *** avp)
1646 char * script =
NULL;
1650 for (se = s + 1; se < (s+
nb); se++)
1652 default:
continue;
break;
1653 case ':':
goto bingo;
break;
1657 {
size_t na = (size_t)(se-s-1);
1662 args = (
char *) memcpy(
xmalloc(na+1), s+1, na);
1671 nb -= (nb >= (
sizeof(
"{:}")-1) ? (
sizeof(
"{:}")-1) :
nb);
1672 script = (
char *) memcpy(
xmalloc(nb+1), se+1, nb+1);
1695 const char *s = mb->
s, *
se;
1709 _(
"Recursion depth(%d) greater than max(%d)\n"),
1716 while (rc == 0 && mb->
nb > 0 && (c = (
int)*s) != (
int)
'\0') {
1738 stackarray = chkexist = negate = 0;
1740 switch ((c = (
int) *s)) {
1742 while (*s !=
'\0' && strchr(
"!?@", *s) !=
NULL) {
1745 stackarray = ((stackarray + 1) % 2);
1748 negate = ((negate + 1) % 2);
1764 if (*se ==
'*') se++;
1776 if ((lastc = strchr(fe,
'\n')) ==
NULL)
1777 lastc = strchr(fe,
'\0');
1781 if ((se = matchchar(s, (
char)c,
')')) ==
NULL) {
1783 _(
"Unterminated %c: %s\n"), (
char)c, s);
1788 printMacro(mb, s, se+1);
1791 rc = doShellEscape(mb, s, (se - s));
1798 if ((se = matchchar(s, (
char)c,
'}')) ==
NULL) {
1800 _(
"Unterminated %c: %s\n"), (
char)c, s);
1806 while (strchr(
"!?@", *f) !=
NULL) {
1809 stackarray = ((stackarray + 1) % 2);
1812 negate = ((negate + 1) % 2);
1820 for (fe = f; (c = (
int) *fe) && !strchr(
" :}", c);)
1839 if ((fe - f) <= 0) {
1845 _(
"A %% is followed by an unparseable macro\n"));
1852 printMacro(mb, s, se);
1855 if (
STREQ(
"load", f, fn)) {
1862 if (xx != 0 && chkexist == negate)
1868 if (
STREQ(
"global", f, fn)) {
1872 if (
STREQ(
"define", f, fn)) {
1873 s = doDefine(mb, se, mb->
depth, 0);
1876 if (
STREQ(
"undefine", f, fn)) {
1877 s = doUndefine(mb->
mc, se);
1880 if (
STREQ(
"unglobal", f, fn)) {
1881 s = doUnglobal(mb->
mc, se);
1885 if (
STREQ(
"echo", f, fn) ||
1886 STREQ(
"warn", f, fn) ||
1887 STREQ(
"error", f, fn)) {
1889 if (
STREQ(
"error", f, fn))
1890 waserror = 1, rc = 1;
1891 if (g !=
NULL && g < ge)
1892 doOutput(mb, waserror, g, gn);
1894 doOutput(mb, waserror, f, fn);
1899 if (
STREQ(
"trace", f, fn)) {
1902 if (mb->
depth == 1) {
1910 if (
STREQ(
"dump", f, fn)) {
1919 if (
STREQ(
"lua", f, fn)) {
1922 char *scriptbuf = (
char *)
xmalloc(gn);
1923 const char *printbuf;
1926 lua->storeprint = 1;
1927 lua->printbuf =
NULL;
1928 lua->printbufsize = 0;
1929 lua->printbufused = 0;
1931 if (g !=
NULL && gn > 0)
1932 memcpy(scriptbuf, g, gn);
1933 scriptbuf[
gn] =
'\0';
1938 size_t len = strlen(printbuf);
1941 memcpy(mb->
t, printbuf, len);
1947 lua->storeprint = olua->storeprint;
1948 lua->printbuf = olua->printbuf;
1949 lua->printbufsize = olua->printbufsize;
1950 lua->printbufused = olua->printbufused;
1959 if (
STREQ(
"augeas", f, fn)) {
1963 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
1965 char * script = strndup(g, (
size_t)(se-g-1));
1967 rpmaug aug = (_globalI ?
NULL
1968 : rpmaugNew(_rpmaugRoot, _rpmaugLoadpath, _rpmaugFlags));
1971 if (rpmaugRun(aug, script, &result) !=
RPMRC_OK)
1974 if (result ==
NULL) result =
"FIXME";
1975 if (result !=
NULL && *result !=
'\0') {
1976 size_t len = strlen(result);
1979 memcpy(mb->
t, result, len);
1984 aug = rpmaugFree(aug);
1988 script =
_free(script);
1995 if (
STREQ(
"ficl", f, fn)) {
1997 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
1998 rpmficl ficl = rpmficlNew(av, _globalI);
2001 if (rpmficlRun(ficl, script, &result) !=
RPMRC_OK)
2004 if (result ==
NULL) result =
"FIXME";
2005 if (result !=
NULL && *result !=
'\0') {
2006 size_t len = strlen(result);
2009 memcpy(mb->
t, result, len);
2014 ficl = rpmficlFree(ficl);
2016 script =
_free(script);
2023 if (
STREQ(
"git", f, fn)) {
2025 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2026 rpmgit git = rpmgitNew(av, _globalI,
NULL);
2029 if (rpmgitRun(git, script, &result) !=
RPMRC_OK)
2032 if (result ==
NULL) result =
"FIXME";
2033 if (result !=
NULL && *result !=
'\0') {
2034 size_t len = strlen(result);
2037 memcpy(mb->
t, result, len);
2042 git = rpmgitFree(git);
2044 script =
_free(script);
2051 if (
STREQ(
"js", f, fn)) {
2053 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2060 if (result ==
NULL) result =
"FIXME";
2061 if (result !=
NULL && *result !=
'\0') {
2062 size_t len = strlen(result);
2065 memcpy(mb->
t, result, len);
2072 script =
_free(script);
2079 if (
STREQ(
"nix", f, fn)) {
2081 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2082 int (*_vec) (rpmnix nix) = rpmnixEcho;
2083 uint32_t _flags = RPMNIX_FLAGS_NONE;
2089 || !
strcmp(av[0],
"echo"))
2093 if (!
strcmp(av[1],
"build")) {
2095 _flags = RPMNIX_FLAGS_NOOUTLINK;
2097 if (!
strcmp(av[1],
"channel")) {
2098 _vec = rpmnixChannel;
2100 if (!
strcmp(av[1],
"collect-garbage")) {
2101 _vec = rpmnixCollectGarbage;
2103 if (!
strcmp(av[1],
"copy-closure")) {
2104 _vec = rpmnixCopyClosure;
2106 if (!
strcmp(av[1],
"env")) {
2109 if (!
strcmp(av[1],
"hash")) {
2112 if (!
strcmp(av[1],
"install-package")) {
2113 _vec = rpmnixInstallPackage;
2114 _flags = RPMNIX_FLAGS_INTERACTIVE;
2116 if (!
strcmp(av[1],
"instantiate")) {
2117 _vec = rpmnixInstantiate;
2119 if (!
strcmp(av[1],
"prefetch-url")) {
2120 _vec = rpmnixPrefetchURL;
2122 if (!
strcmp(av[1],
"push")) {
2125 if (!
strcmp(av[1],
"pull")) {
2128 if (!
strcmp(av[1],
"store")) {
2131 if (!
strcmp(av[1],
"worker")) {
2132 _vec = rpmnixWorker;
2136 nix = rpmnixNew(av, _flags,
NULL);
2139 if (rpmnixRun(nix, script, &result) !=
RPMRC_OK)
2142 if (result ==
NULL) result =
"FIXME";
2143 if (result !=
NULL && *result !=
'\0') {
2144 size_t len = strlen(result);
2147 memcpy(mb->
t, result, len);
2157 nix = rpmnixFree(nix);
2159 script =
_free(script);
2165 #ifdef WITH_PERLEMBED
2166 if (
STREQ(
"perl", f, fn)) {
2168 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2175 if (result ==
NULL) result =
"FIXME";
2176 if (result !=
NULL && *result !=
'\0') {
2177 size_t len = strlen(result);
2180 memcpy(mb->
t, result, len);
2187 script =
_free(script);
2193 #ifdef WITH_PYTHONEMBED
2194 if (
STREQ(
"python", f, fn)) {
2196 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2203 if (result ==
NULL) result =
"FIXME";
2204 if (result !=
NULL && *result !=
'\0') {
2205 size_t len = strlen(result);
2208 memcpy(mb->
t, result, len);
2215 script =
_free(script);
2221 #ifdef WITH_RUBYEMBED
2222 if (
STREQ(
"ruby", f, fn)) {
2224 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2231 if (result ==
NULL) result =
"FIXME";
2232 if (result !=
NULL && *result !=
'\0') {
2233 size_t len = strlen(result);
2236 memcpy(mb->
t, result, len);
2243 script =
_free(script);
2249 #ifdef WITH_SEMANAGE
2250 if (
STREQ(
"spook", f, fn)) {
2254 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2257 char * script = strndup(g, (
size_t)(se-g-1));
2260 static const char * _rpmsmStore =
"targeted";
2261 static unsigned int _rpmsmFlags = 0;
2263 rpmsm sm = (_globalI ?
NULL
2264 : rpmsmNew(_rpmsmStore, _rpmsmFlags));
2270 if (rpmsmRun(sm, av, &result) !=
RPMRC_OK)
2273 if (result ==
NULL) result =
"FIXME";
2274 if (result !=
NULL && *result !=
'\0') {
2275 size_t len = strlen(result);
2278 memcpy(mb->
t, result, len);
2287 script =
_free(script);
2294 if (
STREQ(
"sql", f, fn)) {
2296 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2303 if (result ==
NULL) result =
"FIXME";
2304 if (result !=
NULL && *result !=
'\0') {
2305 size_t len = strlen(result);
2308 memcpy(mb->
t, result, len);
2315 script =
_free(script);
2321 #ifdef WITH_SQUIRREL
2322 if (
STREQ(
"squirrel", f, fn)) {
2324 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2331 if (result ==
NULL) result =
"FIXME";
2332 if (result !=
NULL && *result !=
'\0') {
2333 size_t len = strlen(result);
2336 memcpy(mb->
t, result, len);
2343 script =
_free(script);
2350 if (
STREQ(
"tcl", f, fn)) {
2352 char * script = parseEmbedded(s, (
size_t)(se-s), &av);
2358 else if (result !=
NULL && *result !=
'\0') {
2359 size_t len = strlen(result);
2362 memcpy(mb->
t, result, len);
2368 script =
_free(script);
2375 if (lastc && fn > 5 &&
STREQ(
"patch", f, 5) &&
xisdigit((
int)f[5])) {
2377 doFoo(mb, negate, f, (lastc - f),
NULL, 0);
2384 if (
STREQ(
"basename", f, fn) ||
2385 STREQ(
"dirname", f, fn) ||
2386 STREQ(
"realpath", f, fn) ||
2387 STREQ(
"getenv", f, fn) ||
2388 STREQ(
"shrink", f, fn) ||
2389 STREQ(
"suffix", f, fn) ||
2390 STREQ(
"expand", f, fn) ||
2391 STREQ(
"verbose", f, fn) ||
2392 STREQ(
"uncompress", f, fn) ||
2393 STREQ(
"mkstemp", f, fn) ||
2394 STREQ(
"mkdtemp", f, fn) ||
2395 STREQ(
"uuid", f, fn) ||
2396 STREQ(
"url2path", f, fn) ||
2397 STREQ(
"u2p", f, fn) ||
2398 STREQ(
"S", f, fn) ||
2399 STREQ(
"P", f, fn) ||
2400 STREQ(
"F", f, fn)) {
2402 doFoo(mb, negate, f, fn, g, gn);
2410 me = (mep ? *mep :
NULL);
2416 if ((me ==
NULL && !negate) ||
2423 rc = expandT(mb, g, gn);
2425 if (me && me->body && *me->body) {
2426 rc = expandT(mb, me->body, strlen(me->body));
2434 if ((me ==
NULL && !negate) ||
2435 (me !=
NULL && negate)) {
2440 rc = expandT(mb, g, gn);
2442 if (me && me->body && *me->body) {
2443 rc = expandT(mb, me->body, strlen(me->body));
2450 #if !defined(RPM_VENDOR_WINDRIVER_DEBUG)
2453 if (fn == 1 && *f ==
'*') {
2462 if (!strncmp(f,
"if", fn) ||
2463 !strncmp(f,
"else", fn) ||
2464 !strncmp(f,
"endif", fn)) {
2469 _(
"Macro %%%.*s not found, skipping\n"), fn, f);
2478 if (!(g && g < ge)) {
2488 if (me && me->opts !=
NULL) {
2489 if (lastc !=
NULL) {
2500 if (me->body && *me->body) {
2508 if (me->opts !=
NULL)
2522 #if defined(RPM_VENDOR_OPENPKG) || \
2523 !defined(POPT_ERROR_BADCONFIG)
2529 if (stat(filename, &sb) == -1)
2532 if (sb.st_uid != uid)
2534 if (!S_ISREG(sb.st_mode))
2536 if (sb.st_mode & (S_IWGRP|S_IWOTH))
2542 #if !defined(DEBUG_MACROS)
2553 char * globRoot =
NULL;
2555 const char * old_collate =
NULL;
2556 const char * old_ctype =
NULL;
2579 for (j = 0; j <
ac; j++) {
2580 const char * globURL;
2582 int ut =
urlPath(av[j], &path);
2586 argv = (
const char **)
xrealloc(argv, (argc+2) *
sizeof(*argv));
2589 fprintf(stderr,
"*** rpmGlob argv[%d] \"%s\"\n", argc, argv[argc]);
2602 for (i = 0; i < gl.
gl_pathc; i++) {
2603 if ((nb = strlen(&(gl.
gl_pathv[i][0]))) > maxb)
2610 globURL = globRoot = (
char *)
xmalloc(maxb);
2629 fprintf(stderr,
"*** GLOB maxb %d diskURL %d %*s globURL %p %s\n", (
int)maxb, (
int)nb, (
int)nb, av[j], globURL, globURL);
2631 argv = (
const char **)
xrealloc(argv, (argc+gl.
gl_pathc+1) *
sizeof(*argv));
2634 for (i = 0; i < gl.
gl_pathc; i++) {
2635 const char * globFile = &(gl.
gl_pathv[
i][0]);
2636 if (globRoot > globURL && globRoot[-1] ==
'/')
2637 while (*globFile ==
'/') globFile++;
2638 strcpy(globRoot, globFile);
2640 fprintf(stderr,
"*** rpmGlob argv[%d] \"%s\"\n", argc, globURL);
2641 argv[argc++] =
xstrdup(globURL);
2646 globURL =
_free(globURL);
2649 if (argv !=
NULL && argc > 0) {
2664 old_collate =
_free(old_collate);
2668 old_ctype =
_free(old_ctype);
2672 if (rc || argvPtr ==
NULL) {
2675 for (j = 0; j < argc; j++)
2676 argv[j] =
_free(argv[j]);
2693 if (sbuf ==
NULL || slen == 0)
2697 tbuf = (
char *)
alloca(slen + 1);
2716 strncpy(sbuf, tbuf, (slen - mb->
nb + 1));
2723 const char * n,
const char * o,
const char * b,
int level)
2726 const char * name =
n;
2737 if (mc->firstFree == mc->macrosAllocated)
2738 expandMacroTable(mc);
2739 if (mc->macroTable !=
NULL)
2740 mep = mc->macroTable + mc->firstFree++;
2745 if (*mep && (*mep)->flags && !(n[0] ==
'.' && n[1] ==
'.')) {
2747 if (
strcmp((*mep)->name,
"buildroot"))
2755 if ((*mep)->prev ==
NULL)
2793 memset(mb, 0,
sizeof(*mb));
2796 (
void) doDefine(mb, macro, level, 0);
2817 if (mc->macroTable !=
NULL) {
2819 for (i = 0; i < mc->firstFree; i++) {
2821 mep = &mc->macroTable[
i];
2826 addMacro(
NULL, me->name, me->opts, me->body, (level - 1));
2831 #if defined(RPM_VENDOR_OPENPKG)
2832 static void expand_macrosfile_macro(
const char *file_name,
const char *buf,
size_t bufn)
2836 static const char *macro_name =
"%{macrosfile}";
2838 l = strlen(macro_name);
2839 k = strlen(file_name);
2840 while ((cp = strstr(buf, macro_name)) !=
NULL) {
2841 if (((strlen(buf) - l) + k) < bufn) {
2842 memmove(cp+k, cp+l, strlen(cp+l)+1);
2843 memcpy(cp, file_name, k);
2854 char *buf = (
char *)
alloca(bufn);
2861 fd =
Fopen(fn,
"r.fpio");
2873 while(rdcl(buf, bufn, fd) !=
NULL) {
2885 if (s[1] ==
'{' && !strncmp(s+2,
"load:",
sizeof(
"load:")-1)) {
2886 char * se = (
char *) matchchar(s,
'{',
'}');
2892 _(
"%s:%u Missing '}' in \"%s\", skipping.\n"),
2896 s +=
sizeof(
"%{load:") - 1;
2901 _(
"%s:%u load depth exceeded, \"%s\" ignored.\n"),
2906 rc =
rpmGlob(se, &argc, &argv);
2907 for(i = 0; i < argc; i++) {
2909 argv[
i] =
_free(argv[i]);
2916 #if defined(RPM_VENDOR_OPENPKG)
2917 expand_macrosfile_macro(fn, buf, bufn);
2932 char *mfiles, *
m, *
me;
2934 if (macrofiles ==
NULL)
2941 for (m = mfiles; m && *m !=
'\0'; m =
me) {
2946 for (me = m; (me = strchr(me,
':')) !=
NULL; me++) {
2948 if (!(me[1] ==
'/' && me[2] ==
'/'))
2952 if (me && *me ==
':')
2960 #if defined(DEBUG_MACROS)
2962 av =
xmalloc((ac + 1) *
sizeof(*av));
2973 for (i = 0; i <
ac; i++) {
2974 size_t slen = strlen(av[i]);
2975 const char *fn = av[
i];
2977 if (fn[0] ==
'@' ) {
2979 #if defined(RPM_VENDOR_OPENPKG) || \
2980 !defined(POPT_ERROR_BADCONFIG)
2983 if (!poptSaneFile(fn))
2986 rpmlog(
RPMLOG_WARNING,
"existing RPM macros file \"%s\" considered INSECURE -- not loaded\n", fn);
2992 #define _suffix(_s, _x) \
2993 (slen >= sizeof(_x) && !strcmp((_s)+slen-(sizeof(_x)-1), (_x)))
3006 mfiles =
_free(mfiles);
3021 if (mc->macroTable !=
NULL) {
3023 for (i = 0; i < mc->firstFree; i++) {
3025 while ((me = mc->macroTable[i]) !=
NULL) {
3028 if ((mc->macroTable[i] = me->prev) ==
NULL)
3029 me->name =
_free(me->name);
3031 me->opts =
_free(me->opts);
3032 me->body =
_free(me->body);
3037 free(mc->macroTable);
3038 mc->macroTable =
NULL;
3040 memset(mc, 0,
sizeof(*mc));
3050 unsigned char magic[13];
3051 #if defined(RPM_VENDOR_OPENPKG) || defined(RPM_VENDOR_FEDORA) || defined(RPM_VENDOR_MANDRIVA)
3056 #if defined(RPM_VENDOR_PLD)
3064 if ((strlen(file) > 6) && (strncasecmp(file,
"%PATCH", 6) == 0))
3068 #if defined(RPM_VENDOR_OPENPKG) || defined(RPM_VENDOR_FEDORA) || defined(RPM_VENDOR_MANDRIVA)
3069 file_len = strlen(file);
3070 if ((file_len > 4 && strcasecmp(file+file_len-4,
".tbz") == 0)
3071 || (file_len > 4 && strcasecmp(file+file_len-4,
".bz2") == 0)) {
3075 if (file_len > 4 && strcasecmp(file+file_len-4,
".zip") == 0) {
3079 if ((file_len > 4 && strcasecmp(file+file_len-4,
".tlz") == 0)
3080 || (file_len > 5 && strcasecmp(file+file_len-5,
".lzma") == 0)) {
3084 if (file_len > 4 && strcasecmp(file+file_len-3,
".xz") == 0) {
3088 if ((file_len > 4 && strcasecmp(file+file_len-4,
".tgz") == 0)
3089 || (file_len > 3 && strcasecmp(file+file_len-3,
".gz") == 0)
3090 || (file_len > 2 && strcasecmp(file+file_len-2,
".Z") == 0)) {
3094 if (file_len > 5 && strcasecmp(file+file_len-5,
".cpio") == 0) {
3098 if (file_len > 4 && strcasecmp(file+file_len-4,
".tar") == 0) {
3104 fd =
Fopen(file,
"r");
3111 nb =
Fread(magic,
sizeof(magic[0]),
sizeof(magic), fd);
3112 if (nb < (ssize_t)0) {
3115 }
else if (nb < (ssize_t)
sizeof(magic)) {
3117 file, (
unsigned)
sizeof(magic));
3126 if (magic[0] ==
'B' && magic[1] ==
'Z')
3129 if (magic[0] == (
unsigned char) 0120 && magic[1] == (
unsigned char) 0113
3130 && magic[2] == (
unsigned char) 0003 && magic[3] == (
unsigned char) 0004)
3133 if (magic[0] == (
unsigned char) 0x89 && magic[1] ==
'L'
3134 && magic[2] ==
'Z' && magic[3] ==
'O')
3137 #if !defined(RPM_VENDOR_OPENPKG) && !defined(RPM_VENDOR_FEDORA) && !defined(RPM_VENDOR_MANDRIVA)
3139 if (magic[ 9] == (
unsigned char) 0x00 && magic[10] == (
unsigned char) 0x00 &&
3140 magic[11] == (
unsigned char) 0x00 && magic[12] == (
unsigned char) 0x00)
3144 #if defined(RPM_VENDOR_OPENSUSE)
3145 if (magic[0] == 0135 && magic[1] == 0 && magic[2] == 0)
3149 if (magic[0] == (
unsigned char) 0xFD && magic[1] == 0x37 && magic[2] == 0x7A
3150 && magic[3] == 0x58 && magic[4] == 0x5A && magic[5] == 0x00)
3152 else if ((magic[0] ==
'L') && (magic[1] ==
'Z') &&
3153 (magic[2] ==
'I') && (magic[3] ==
'P'))
3155 else if ((magic[0] ==
'L') && (magic[1] ==
'R') &&
3156 (magic[2] ==
'Z') && (magic[3] ==
'I'))
3158 else if ((magic[0] ==
'7') && (magic[1] ==
'z') &&
3159 (magic[2] == 0xbc) && (magic[3] == 0xaf) &&
3160 (magic[4] == 0x27) && (magic[5] == 0x1c))
3163 if ((magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0213)
3164 || (magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0236)
3165 || (magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0036)
3166 || (magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0240)
3167 || (magic[0] == (
unsigned char) 0037 && magic[1] == (
unsigned char) 0235))
3191 t = (
char *)
xmalloc(bufn + strlen(arg) + 1);
3196 while ((s = va_arg(ap,
const char *)) !=
NULL) {
3199 t = (
char *)
xrealloc(t, tn + sn + bufn + 1);
3208 t[tn +
bufn] =
'\0';
3209 t = (
char *)
xrealloc(t, strlen(t) + 1);
3227 t = (
char *)
xmalloc(bufn + strlen(arg) + 1);
3232 while ((s = va_arg(ap,
const char *)) !=
NULL) {
3235 t = (
char *)
xrealloc(t, tn + sn + bufn + 1);
3244 t[tn +
bufn] =
'\0';
3245 t = (
char *)
xrealloc(t, strlen(t) + 1);
3261 if (!(val && *val !=
'%'))
3263 else if (*val ==
'Y' || *val ==
'y')
3265 else if (*val ==
'N' || *val ==
'n')
3269 rc = strtol(val, &end, 0);
3270 if (!(end && *end ==
'\0'))
3290 while (*s !=
'\0') {
3294 if (s[1] ==
'/' && s[2] ==
'/') {
3298 if (s[0] ==
'/') *t++ = *s++;
3306 for (se = te + 1; se < t && *se !=
'/'; se++)
3308 if (se < t && *se ==
'/') {
3314 while (t > te && t[-1] ==
'/')
3324 if (begin && s[1] ==
'.' && (s[2] ==
'/' || s[2] ==
'\0')) {
3330 if (begin && s[1] ==
'\0') {
3333 if (t > path && t[-1] ==
'/')
3336 case '\0': s++;
continue;
3340 if (!begin && t > path && t[-1] ==
'/' && s[1] ==
'.' && (s[2] ==
'/' || s[2] ==
'\0')) {
3344 for (--te; te > path && *te !=
'/'; te--)
3360 if (t > &path[1] && t[-1] ==
'/')
3374 char *buf = (
char *)
alloca(bufn);
3389 while ((s = va_arg(ap,
const char *)) !=
NULL) {
3391 slashed = (s[0] ==
'/' && s[1] ==
'\0');
3406 size_t nb = strlen(buf);
3407 if (buf[nb-1] !=
'/')
3417 const char *
rpmGenPath(
const char * urlroot,
const char * urlmdir,
3418 const char *urlfile)
3421 const char * root = xroot;
3423 const char * mdir = xmdir;
3425 const char *
file = xfile;
3427 const char * url =
NULL;
3432 if (_debug)
fprintf(stderr,
"*** RGP xroot %s xmdir %s xfile %s\n", xroot, xmdir, xfile);
3438 if (root >= url && root <= url+nurl)
3439 nurl -= strlen(root);
3441 if (_debug)
fprintf(stderr,
"*** RGP ut %d root %s nurl %u\n", ut, root, (
unsigned)nurl);
3444 if (root ==
NULL || *root ==
'\0') root =
"/";
3450 if (mdir >= url && mdir <= url+nurl)
3451 nurl -= strlen(mdir);
3453 if (_debug)
fprintf(stderr,
"*** RGP ut %d mdir %s nurl %u\n", ut, mdir, (
unsigned)nurl);
3456 if (mdir ==
NULL || *mdir ==
'\0') mdir =
"/";
3462 if (file >= url && file <= url+nurl)
3463 nurl -= strlen(file);
3465 if (_debug)
fprintf(stderr,
"*** RGP ut %d file %s nurl %u\n", ut, file, (
unsigned)nurl);
3469 if (url && nurl > 0) {
3478 xroot =
_free(xroot);
3479 xmdir =
_free(xmdir);
3480 xfile =
_free(xfile);
3482 if (_debug)
fprintf(stderr,
"*** RGP result %s\n", result);
3489 #if defined(DEBUG_MACROS)
3491 #if defined(EVAL_MACROS)
3500 extern char *optarg;
3503 while ((c = getopt(argc, argv,
"f:")) != EOF ) {
3506 rpmMacrofiles = optarg;
3514 if (errflg || optind >= argc) {
3515 fprintf(stderr,
"Usage: %s [-f macropath ] macro ...\n", argv[0]);
3521 for ( ; optind < argc; optind++) {
3526 fprintf(stdout,
"%s:\t%s\n", argv[optind], val);
3536 const char *rpmMacrofiles =
"../macros:./testmacros";
3537 const char *testfile =
"./test";
3540 main(
int argc,
char *argv[])
3543 char *buf = (
char *)
alloca(bufn);
3549 if ((fp = fopen(testfile,
"r")) !=
NULL) {
3550 while(rdcl(buf, bufn, fp)) {
3552 fprintf(stderr,
"%d->%s\n", x, buf);
3558 while(rdcl(buf, bufn, stdin)) {
3560 fprintf(stderr,
"%d->%s\n <-\n", x, buf);
void rpmInitMacros(MacroContext mc, const char *macrofiles)
Initialize macro context from set of macrofile(s).
qsort(mc->macroTable, mc->firstFree, sizeof(mc->macroTable[0]), compareMacroName)
int rpmuuidMake(int version, const char *ns, const char *data, char *buf_str, unsigned char *buf_bin)
Generate a Universally Unique Identifier (UUID).
rpmlog(RPMLOG_ERR,"%s\n", buf)
static void doFoo(MacroBuf mb, int negate, const char *f, size_t fn, const char *g, size_t gn)
Execute macro primitives.
int isCompressed(const char *file, rpmCompressedMagic *compressed)
Return type of compression used in file.
char * getenv(const char *name)
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.
static char *size_t nb
fgets(3) analogue that reads \ continuations.
MacroContext rpmCLIMacroContext
int main(int argc, const char **argv, char **envp)
static const char uuid_ns[]
rpmlua rpmluaGetGlobalState(void)
void Globfree(void *_pglob)
globfree(3) clone.
static void pushMacro(MacroEntry *mep, const char *n, const char *o, const char *b, int level)
Push new macro definition onto macro entry stack.
#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 int xisalpha(int c)
static size_t _macro_BUFSIZ
static int expandFIFO(MacroBuf mb, MacroEntry me, const char *g, size_t gn)
struct MacroBuf_s * MacroBuf
static int XpoptDupArgv(int argc, char **argv, int *argcPtr, char ***argvPtr)
static PyObject *char * mode
sprintf(t," (%u)",(unsigned) dig->nbytes)
rpmsql rpmsqlNew(char **av, uint32_t flags)
Create and load a sql interpreter.
rpmpython rpmpythonFree(rpmpython python)
Destroy a python interpreter.
Yet Another syslog(3) API clone.
#define DRD_xstrdup(_str)
static char * dupMacroEntry(MacroEntry me)
memset(_r, 0, sizeof(*_r))
static void
Enlarge macro table.
int rpmGlob(const char *patterns, int *argcPtr, const char ***argvPtr)
Return URL path(s) from a (URL prefixed) pattern glob.
const char * Fstrerror(FD_t fd)
strerror(3) clone.
void * xcalloc(size_t nmemb, size_t size)
assert(key->size==sizeof(hdrNum))
MacroContext rpmGlobalMacroContext
const char * rpmMacrofiles
List of macro files to read when configuring rpm.
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.
fprintf(stderr,"--> %s(%p,%p,%p) sig %p sigp %p\n", __FUNCTION__, dig, t, rsactx, sig, sigp)
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)
printExpansion(mb, t, mb->t)
struct rpmperl_s * rpmperl
#define setlocale(Category, Locale)
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
#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 * 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.
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).
Embedded Ruby interpreter.
size_t Fread(void *buf, size_t size, size_t nmemb, FD_t fd)
fread(3) clone.
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)
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)
static const char *char c
Return text between pl and matching pr characters.
rpmruby rpmrubyFree(rpmruby ruby)
Destroys a Ruby interpreter instance.
struct rpmsquirrel_s * rpmsquirrel
int Ferror(FD_t fd)
ferror(3) clone.
rpmsql rpmsqlFree(rpmsql sql)
Destroy a sql interpreter.
return strcmp(ame->name, bme->name)
enum rpmCompressedMagic_e rpmCompressedMagic
static int xisdigit(int c)
urltype urlPath(const char *url, const char **pathp)
Return path component of URL.
char * stpcpy(char *dest, const char *src)
struct MacroContext_s * MacroContext
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)
rpmtcl rpmtclFree(rpmtcl tcl)
Destroy a tcl interpreter.
void expandU(mb, buf, bufn)
int expandMacros(void *spec, MacroContext mc, char *sbuf, size_t slen)
Expand macro into buffer.
static const char *size_t bufn
Parse (and execute) new macro definition.
rpmRC rpmrubyRun(rpmruby ruby, const char *str, const char **resultp)
Evaluates Ruby code stored in a string.
char * buf
Parse (and execute) macro undefinition.
int
Save source and expand field into target.
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.
static rpmuint32_t uuid_version
rpmsquirrel rpmsquirrelNew(char **av, uint32_t flags)
rpmperl rpmperlFree(rpmperl perl)
Destroy a perl interpreter.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
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.