summaryrefslogtreecommitdiffstats
path: root/filter/filter.c
diff options
context:
space:
mode:
authorPavel Machek <pavel@ucw.cz>2000-03-29 11:02:00 +0200
committerPavel Machek <pavel@ucw.cz>2000-03-29 11:02:00 +0200
commit0a06a9b8b3dbd59c850303c49eea97c12e1ac0ff (patch)
tree12b400d160861aaee231becc25eb81f49d4372f4 /filter/filter.c
parent8d2e3eba92e339f0635e0cb2fbfb49482b26295a (diff)
downloadbird-0a06a9b8b3dbd59c850303c49eea97c12e1ac0ff.tar
bird-0a06a9b8b3dbd59c850303c49eea97c12e1ac0ff.zip
f_run gets one more parameter to distinguish between in and out modes.
Diffstat (limited to 'filter/filter.c')
-rw-r--r--filter/filter.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/filter/filter.c b/filter/filter.c
index 5faabfe..6a59072 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -145,6 +145,7 @@ val_print(struct f_val v)
static struct rte **f_rte, *f_rte_old;
static struct linpool *f_pool;
static struct ea_list **f_tmp_attrs;
+static int f_flags;
#define runtime(x) do { \
log( L_ERR x ); \
@@ -329,9 +330,14 @@ interpret(struct f_inst *what)
break;
case P('e','a'): /* Access to extended attributes */
{
- eattr *e = ea_find( (*f_rte)->attrs->eattrs, what->a2.i );
+ eattr *e = NULL;
+ if (!(f_flags & FF_OUTGOING))
+ e = ea_find( (*f_rte)->attrs->eattrs, what->a2.i );
if (!e)
e = ea_find( (*f_tmp_attrs), what->a2.i );
+ if ((!e) && (f_flags & FF_OUTGOING))
+ e = ea_find( (*f_rte)->attrs->eattrs, what->a2.i );
+
if (!e) {
res.type = T_VOID;
break;
@@ -371,7 +377,7 @@ interpret(struct f_inst *what)
break;
}
- if (!(what->aux & EAF_TEMP)) {
+ if (!(what->aux & EAF_TEMP) && (!(f_flags & FF_OUTGOING))) {
*f_rte = rte_do_cow(*f_rte);
l->next = (*f_rte)->attrs->eattrs;
(*f_rte)->attrs->eattrs = l;
@@ -523,12 +529,13 @@ i_same(struct f_inst *f1, struct f_inst *f2)
}
int
-f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool)
+f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool, int flags)
{
struct f_inst *inst;
struct f_val res;
DBG( "Running filter `%s'...", filter->name );
+ f_flags = flags;
f_tmp_attrs = tmp_attrs;
f_rte = rte;
f_rte_old = *rte;