mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-17 08:38:42 +00:00
tmp_attrs fixed.
I do not know if it is right since mj ingores talk once started :-(.
This commit is contained in:
parent
4ebbbd4079
commit
31e79264a2
@ -424,7 +424,7 @@ cmd:
|
|||||||
}
|
}
|
||||||
| UNSET '(' rtadot dynamic_attr ')' ';' {
|
| UNSET '(' rtadot dynamic_attr ')' ';' {
|
||||||
$$ = $4;
|
$$ = $4;
|
||||||
$$->aux = T_VOID;
|
$$->aux = EAF_TYPE_UNDEF | EAF_INLINE;
|
||||||
$$->code = P('e','S');
|
$$->code = P('e','S');
|
||||||
$$->a1.p = NULL;
|
$$->a1.p = NULL;
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ struct f_inst *
|
|||||||
f_new_dynamic_attr(int code)
|
f_new_dynamic_attr(int code)
|
||||||
{
|
{
|
||||||
struct f_inst *f = f_new_inst();
|
struct f_inst *f = f_new_inst();
|
||||||
f->aux = T_INT;
|
f->aux = EAF_TYPE_INT | EAF_INLINE;
|
||||||
f->a2.i = code;
|
f->a2.i = code;
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
@ -142,6 +142,7 @@ val_print(struct f_val v)
|
|||||||
|
|
||||||
static struct rte **f_rte, *f_rte_old;
|
static struct rte **f_rte, *f_rte_old;
|
||||||
static struct linpool *f_pool;
|
static struct linpool *f_pool;
|
||||||
|
static struct ea_list **f_tmp_attrs;
|
||||||
|
|
||||||
#define runtime(x) do { \
|
#define runtime(x) do { \
|
||||||
log( L_ERR x ); \
|
log( L_ERR x ); \
|
||||||
@ -319,7 +320,8 @@ interpret(struct f_inst *what)
|
|||||||
case P('e','a'): /* Access to extended attributes */
|
case P('e','a'): /* Access to extended attributes */
|
||||||
{
|
{
|
||||||
eattr *e = ea_find( (*f_rte)->attrs->eattrs, what->a2.i );
|
eattr *e = ea_find( (*f_rte)->attrs->eattrs, what->a2.i );
|
||||||
/* FIXME: should I search in tmp_attrs, too, or what ? */
|
if (!e)
|
||||||
|
e = ea_find( (*f_tmp_attrs), what->a2.i );
|
||||||
if (!e) {
|
if (!e) {
|
||||||
res.type = T_VOID;
|
res.type = T_VOID;
|
||||||
break;
|
break;
|
||||||
@ -345,19 +347,28 @@ interpret(struct f_inst *what)
|
|||||||
l->count = 1;
|
l->count = 1;
|
||||||
l->attrs[0].id = what->a2.i;
|
l->attrs[0].id = what->a2.i;
|
||||||
l->attrs[0].flags = 0;
|
l->attrs[0].flags = 0;
|
||||||
switch (what->aux) {
|
l->attrs[0].type = what->aux;
|
||||||
case T_INT:
|
switch (what->aux & EAF_TYPE_MASK) {
|
||||||
l->attrs[0].type = EAF_TYPE_INT | EAF_INLINE;
|
case EAF_TYPE_INT:
|
||||||
|
if (v1.type != T_INT)
|
||||||
|
runtime( "Setting int attribute to non-int value" );
|
||||||
l->attrs[0].u.data = v1.val.i;
|
l->attrs[0].u.data = v1.val.i;
|
||||||
break;
|
break;
|
||||||
case T_VOID:
|
case EAF_TYPE_UNDEF:
|
||||||
l->attrs[0].type = EAF_TYPE_UNDEF | EAF_INLINE;
|
if (v1.type != T_VOID)
|
||||||
|
runtime( "Setting void attribute to non-void value" );
|
||||||
l->attrs[0].u.data = 0;
|
l->attrs[0].u.data = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*f_rte = rte_do_cow(*f_rte);
|
|
||||||
l->next = (*f_rte)->attrs->eattrs;
|
if (what->aux & EAF_INLINE) {
|
||||||
(*f_rte)->attrs->eattrs = l;
|
*f_rte = rte_do_cow(*f_rte);
|
||||||
|
l->next = (*f_rte)->attrs->eattrs;
|
||||||
|
(*f_rte)->attrs->eattrs = l;
|
||||||
|
} else {
|
||||||
|
l->next = (*f_tmp_attrs);
|
||||||
|
(*f_tmp_attrs) = l;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -494,8 +505,6 @@ i_same(struct f_inst *f1, struct f_inst *f2)
|
|||||||
return i_same(f1->next, f2->next);
|
return i_same(f1->next, f2->next);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: tmp_attrs is unreferenced. That can't be right.
|
|
||||||
Strange. look at eS how dynamic attrs are set. */
|
|
||||||
int
|
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)
|
||||||
{
|
{
|
||||||
@ -503,6 +512,7 @@ f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struc
|
|||||||
struct f_val res;
|
struct f_val res;
|
||||||
debug( "Running filter `%s'...", filter->name );
|
debug( "Running filter `%s'...", filter->name );
|
||||||
|
|
||||||
|
f_tmp_attrs = tmp_attrs;
|
||||||
f_rte = rte;
|
f_rte = rte;
|
||||||
f_rte_old = *rte;
|
f_rte_old = *rte;
|
||||||
f_pool = tmp_pool;
|
f_pool = tmp_pool;
|
||||||
|
Loading…
Reference in New Issue
Block a user