]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filters: write access to dynamic attributes should actually work. It
authorPavel Machek <pavel@ucw.cz>
Wed, 24 Nov 1999 12:04:32 +0000 (12:04 +0000)
committerPavel Machek <pavel@ucw.cz>
Wed, 24 Nov 1999 12:04:32 +0000 (12:04 +0000)
would be nice to find method of testing such beasts.

filter/config.Y
filter/filter.c
filter/test.conf

index a24b15752140e4554e0727fbc595106d12b1ffe9..aaea74f7a44f46640f00e3bb33f6553ceea17887 100644 (file)
@@ -364,7 +364,9 @@ cmd:
    }
  | UNSET '(' RTA '.' any_dynamic ')' ';' {
      $$ = $5;
-     $$->code = 'eD';
+     $$->aux = T_VOID;
+     $$->code = 'eS';
+     $$->a1.p = NULL;
    }
  | break_command print_list ';' { $$ = f_new_inst(); $$->code = 'p,'; $$->a1.p = $2; $$->a2.i = $1; }
  | SYM '(' var_list ')' ';' {
index 36830bd156c6b7082955b098a176836ab347307e..19e5e45de1e136b3a914ca885904e6b8ad44875b 100644 (file)
@@ -158,7 +158,7 @@ val_print(struct f_val v)
   printf( buf );
 }
 
-static struct rte **f_rte;
+static struct rte **f_rte, *f_rte_old;
 static struct linpool *f_pool;
 
 static struct f_val interpret(struct f_inst *what);
@@ -338,7 +338,6 @@ interpret(struct f_inst *what)
     if (v1.type != what->aux)
       runtime("Wrong type when setting dynamic attribute\n");
 
-    /* This willl only work if it is not already there! */
     {
       struct ea_list *l = lp_alloc(f_pool, sizeof(struct ea_list) + sizeof(eattr));
 
@@ -352,13 +351,17 @@ interpret(struct f_inst *what)
        l->attrs[0].type = EAF_TYPE_INT | EAF_INLINE;
        l->attrs[0].u.data = v1.val.i;
        break;
+      case T_VOID:
+       l->attrs[0].type = EAF_TYPE_UNDEF | EAF_INLINE;
+       l->attrs[0].u.data = 0;
+       break;
       }
-      /* FIXME: need to do copy on write of rte + rta + insert at the beggining */
+      *f_rte = rte_do_cow(*f_rte);
+      l->next = *f_rte->attrs->eattrs;
+      *f_rte->attrs->eattrs = l;
     }
-
-  case 'eD':    /*FIXME: unset:  implement me */
-    die("Implement me!!!" );
     break;
+
   case 'cp':   /* Convert prefix to ... */
     ONEARG;
     if (v1.type != T_PREFIX)
@@ -419,6 +422,7 @@ f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struc
   debug( "Running filter `%s'...", filter->name );
 
   f_rte = rte;
+  f_rte_old = *rte;
   f_pool = tmp_pool;
   inst = filter->root;
   res = interpret(inst);
index 837c423dfae077b2212b3e1902610f18eab96da8..7a1c07b0ddeaa80cef6972a64fbb0283edd586ae 100644 (file)
@@ -73,6 +73,8 @@ int j;
        if rta.rip_metric > 15 then {
                reject "RIP Metric is more than infinity";
        }
+       rta.rip_metric = 14;
+       unset(rta.rip_metric);
                
        accept "ok I take that";
 }