On Sun, Jan 01, 2006 at 01:50:58AM +0000, Karl O. Pinc wrote:
> man 5 ifstated.conf says:
> 
> "The init block is used
> to initialise the state and is executed each time the
> state is entered."
> 
> But this does not seem to be true if you use 'init-state'
> to enter the state.  Or maybe there's something else
> wrong with my config below, or with ifstated when there's
> no body.  Or something.

Hi,

the problem is that on state changes further set-state actions are
ignored.  The patch below should fix that.  The issue has already been
reported by Holger Mikolon, whose patch I slightly modified.

However, your config is way too complicated.
That here should do it:

--------------snip-------------
carp_up = "carp0.link.up"

if $carp_up
        run "touch /tmp/am_master"
if ! $carp_up
        run "rm /tmp/am_master"
--------------snip-------------

But feel free to test the patch as well :-)


Index: ifstated.c
===================================================================
RCS file: /cvs/src/usr.sbin/ifstated/ifstated.c,v
retrieving revision 1.22
diff -u -p -r1.22 ifstated.c
--- ifstated.c  28 Jul 2005 16:59:42 -0000      1.22
+++ ifstated.c  1 Jan 2006 19:10:09 -0000
@@ -69,7 +69,7 @@ void  fetch_state(void);
 void   usage(void);
 void   adjust_expressions(struct ifsd_expression_list *, int);
 void   eval_state(struct ifsd_state *);
-void   state_change(void);
+int    state_change(void);
 void   do_action(struct ifsd_action *);
 void   remove_action(struct ifsd_action *, struct ifsd_state *);
 void   remove_expression(struct ifsd_expression *, struct ifsd_state *);
@@ -494,14 +494,15 @@ eval_state(struct ifsd_state *state)
        if (external == NULL || external->lastexec >= state->entered ||
            external->lastexec == 0) {
                do_action(state->always);
-               state_change();
+               while (state_change())
+                       do_action(conf->curstate->always);
        }
 }
 
 /*
  *If a previous action included a state change, process it.
  */
-void
+int
 state_change(void)
 {
        if (conf->nextstate != NULL && conf->curstate != conf->nextstate) {
@@ -519,7 +520,9 @@ state_change(void)
                fetch_state();
                do_action(conf->curstate->init);
                fetch_state();
+               return (1);
        }
+       return (0);
 }
 
 /*

Reply via email to