- state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE);
- slog(st,LOG_STATE,"entering state SENTMSG1");
- if (generate_msg1(st) && send_msg(st)) {
- st->state=SITE_SENTMSG1;
- return True;
- }
- slog(st,LOG_ERROR,"error entering state SENTMSG1");
- st->buffer.free=False; /* Can't tell which it was, but enter_state_wait()
- will do a BUF_FREE() */
- enter_state_wait(st);
- return False;
-}
-
-static bool_t enter_state_sentmsg2(struct site *st)
-{
- state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE ||
- st->state==SITE_SENTMSG1 || st->state==SITE_WAIT);
- slog(st,LOG_STATE,"entering state SENTMSG2");
- if (generate_msg2(st) && send_msg(st)) {
- st->state=SITE_SENTMSG2;
- return True;
- }
- slog(st,LOG_ERROR,"error entering state SENTMSG2");
- st->buffer.free=False;
- enter_state_wait(st);
- return False;
-}
-
-static bool_t enter_state_sentmsg3(struct site *st)
-{
- state_assert(st,st->state==SITE_SENTMSG1);
- slog(st,LOG_STATE,"entering state SENTMSG3");
- BUF_FREE(&st->buffer); /* Free message 1 */
- if (generate_msg3(st) && send_msg(st)) {
- st->state=SITE_SENTMSG3;
- return True;
+ bool_t (*gen)(struct site *st);
+ slog(st,LOG_STATE,"entering state %s",state_name(next));
+ switch(next) {
+ case SITE_SENTMSG1:
+ state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE);
+ gen=generate_msg1;
+ break;
+ case SITE_SENTMSG2:
+ state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE ||
+ st->state==SITE_SENTMSG1 || st->state==SITE_WAIT);
+ gen=generate_msg2;
+ break;
+ case SITE_SENTMSG3:
+ state_assert(st,st->state==SITE_SENTMSG1);
+ BUF_FREE(&st->buffer);
+ gen=generate_msg3;
+ break;
+ case SITE_SENTMSG4:
+ state_assert(st,st->state==SITE_SENTMSG2);
+ BUF_FREE(&st->buffer);
+ gen=generate_msg4;
+ break;
+ case SITE_SENTMSG5:
+ state_assert(st,st->state==SITE_SENTMSG3);
+ BUF_FREE(&st->buffer);
+ gen=generate_msg5;
+ break;
+ case SITE_RUN:
+ state_assert(st,st->state==SITE_SENTMSG4);
+ BUF_FREE(&st->buffer);
+ gen=generate_msg6;
+ break;
+ default:
+ gen=NULL;
+ fatal("enter_new_state(%s): invalid new state",state_name(next));
+ break;