@@ -39,6 +39,7 @@ enum macroFlags_e {
39
39
ME_LITERAL = (1 << 2 ),
40
40
ME_PARSE = (1 << 3 ),
41
41
ME_FUNC = (1 << 4 ),
42
+ ME_ALIAS = (1 << 5 ),
42
43
};
43
44
44
45
typedef struct MacroBuf_s * MacroBuf ;
@@ -161,7 +162,7 @@ static rpmMacroContext rpmmctxRelease(rpmMacroContext mc)
161
162
* @param mc macro context
162
163
* @param name macro name
163
164
* @param namelen no. of bytes
164
- * @param pos found/insert position
165
+ * @retval pos found/insert position
165
166
* @return address of slot in macro table with name (or NULL)
166
167
*/
167
168
static rpmMacroEntry *
@@ -198,6 +199,30 @@ findEntry(rpmMacroContext mc, const char *name, size_t namelen, size_t *pos)
198
199
return NULL ;
199
200
}
200
201
202
+ static rpmMacroEntry *
203
+ findAlias (rpmMacroContext mc , const char * name , size_t namelen , size_t * pos )
204
+ {
205
+ const char * m = name ;
206
+ size_t mlen = namelen ;
207
+ rpmMacroEntry * mep = NULL ;
208
+ int depth = 0 ;
209
+
210
+ while ((mep = findEntry (mc , m , mlen , pos ))) {
211
+ if (!((* mep )-> flags & ME_ALIAS ))
212
+ break ;
213
+ /* XXX can't flag an error from here, just fail as not found */
214
+ if (++ depth > max_macro_depth ) {
215
+ mep = NULL ;
216
+ break ;
217
+ }
218
+ m = (* mep )-> body ;
219
+ mlen = strlen (m );
220
+
221
+ }
222
+
223
+ return mep ;
224
+ }
225
+
201
226
/**
202
227
* Create a new entry in the macro table.
203
228
* @param mc macro context
@@ -950,7 +975,7 @@ freeArgs(MacroBuf mb)
950
975
if (me -> level < mb -> level )
951
976
continue ;
952
977
/* Warn on defined but unused non-automatic, scoped macros */
953
- if (!(me -> flags & (ME_AUTO |ME_USED ))) {
978
+ if (!(me -> flags & (ME_AUTO |ME_USED | ME_ALIAS ))) {
954
979
mbErr (mb , 0 , _ ("Macro %%%s defined but not used within scope\n" ),
955
980
me -> name );
956
981
/* Only whine once */
@@ -1061,7 +1086,7 @@ grabArgs(MacroBuf mb, const rpmMacroEntry me, ARGV_t *argvp,
1061
1086
static void doBody (MacroBuf mb , rpmMacroEntry me , ARGV_t argv , size_t * parsed )
1062
1087
{
1063
1088
if (* argv [1 ]) {
1064
- rpmMacroEntry * mep = findEntry (mb -> mc , argv [1 ], 0 , NULL );
1089
+ rpmMacroEntry * mep = findAlias (mb -> mc , argv [1 ], 0 , NULL );
1065
1090
if (mep ) {
1066
1091
mbAppendStr (mb , (* mep )-> body );
1067
1092
} else {
@@ -1352,6 +1377,33 @@ static void doRpmver(MacroBuf mb, rpmMacroEntry me, ARGV_t argv, size_t *parsed)
1352
1377
mbAppendStr (mb , VERSION );
1353
1378
}
1354
1379
1380
+ static void doAlias (MacroBuf mb , rpmMacroEntry me , ARGV_t argv , size_t * parsed )
1381
+ {
1382
+ int ac = argvCount (argv );
1383
+ rpmMacroEntry * mep = NULL ;
1384
+ switch (ac ) {
1385
+ case 2 :
1386
+ mep = findAlias (mb -> mc , argv [1 ], 0 , NULL );
1387
+ if (mep && strcmp (argv [1 ], (* mep )-> name ))
1388
+ mbAppendStr (mb , (* mep )-> name );
1389
+ break ;
1390
+ case 3 :
1391
+ if (validName (mb , argv [1 ], 0 , "%alias" )) {
1392
+ mep = findAlias (mb -> mc , argv [2 ], 0 , NULL );
1393
+ if (mep && strcmp (argv [1 ], argv [2 ])) {
1394
+ /* Aliases are always on the level of the aliased macro */
1395
+ pushMacro (mb -> mc , argv [1 ], NULL , argv [2 ],
1396
+ (* mep )-> level , ME_ALIAS );
1397
+ } else {
1398
+ mbErr (mb , 1 , _ ("Invalid alias on %%%s\n" ), argv [2 ]);
1399
+ }
1400
+ }
1401
+ break ;
1402
+ default :
1403
+ mbErr (mb , 1 , _ ("invalid number of arguments for %%alias" ));
1404
+ }
1405
+ }
1406
+
1355
1407
static struct builtins_s {
1356
1408
const char * name ;
1357
1409
macroFunc func ;
@@ -1360,6 +1412,7 @@ static struct builtins_s {
1360
1412
} const builtinmacros [] = {
1361
1413
{ "P" , doSP , 1 , 0 },
1362
1414
{ "S" , doSP , 1 , 0 },
1415
+ { "alias" , doAlias , -1 , 0 },
1363
1416
{ "basename" , doFoo , 1 , 0 },
1364
1417
{ "define" , doDef , 1 , ME_PARSE },
1365
1418
{ "dirname" , doFoo , 1 , 0 },
@@ -1606,7 +1659,7 @@ expandMacro(MacroBuf mb, const char *src, size_t slen)
1606
1659
printMacro (mb , s , se );
1607
1660
1608
1661
/* Expand defined macros */
1609
- mep = findEntry (mb -> mc , f , fn , NULL );
1662
+ mep = findAlias (mb -> mc , f , fn , NULL );
1610
1663
me = (mep ? * mep : NULL );
1611
1664
1612
1665
if (me ) {
@@ -1926,7 +1979,7 @@ int rpmExpandThisMacro(rpmMacroContext mc, const char *n, ARGV_const_t args, ch
1926
1979
int rc = 1 ; /* assume failure */
1927
1980
1928
1981
mc = rpmmctxAcquire (mc );
1929
- mep = findEntry (mc , n , 0 , NULL );
1982
+ mep = findAlias (mc , n , 0 , NULL );
1930
1983
if (mep ) {
1931
1984
MacroBuf mb = mbCreate (mc , flags );
1932
1985
rc = expandThisMacro (mb , * mep , args , flags );
@@ -2005,7 +2058,7 @@ int rpmMacroIsDefined(rpmMacroContext mc, const char *n)
2005
2058
{
2006
2059
int defined = 0 ;
2007
2060
if ((mc = rpmmctxAcquire (mc )) != NULL ) {
2008
- if (findEntry (mc , n , 0 , NULL ))
2061
+ if (findAlias (mc , n , 0 , NULL ))
2009
2062
defined = 1 ;
2010
2063
rpmmctxRelease (mc );
2011
2064
}
@@ -2016,7 +2069,7 @@ int rpmMacroIsParametric(rpmMacroContext mc, const char *n)
2016
2069
{
2017
2070
int parametric = 0 ;
2018
2071
if ((mc = rpmmctxAcquire (mc )) != NULL ) {
2019
- rpmMacroEntry * mep = findEntry (mc , n , 0 , NULL );
2072
+ rpmMacroEntry * mep = findAlias (mc , n , 0 , NULL );
2020
2073
if (mep && (* mep )-> opts )
2021
2074
parametric = 1 ;
2022
2075
rpmmctxRelease (mc );
0 commit comments