- c->answer = talloc_steal(c, c->oserver->last_answer);
- c->oserver->last_answer
- = talloc_steal(c->oserver, c->question);
- set_state(c, SENDING_ANSWER_PREFIX);
+ /* Look for someone to be oracle to. */
+ if (get_subclient(c)) {
+ set_state(c, SENDING_OTHER_QUESTION_PREFIX);
+ } else {
+ /* We sit here until someone find_oracles us */
+ set_state(c, AWAITING_A_SUBCLIENT);
+ }
+
+ /* Look for an oracle for ourselves. */
+ if (get_oracle(c)) {
+ assert(c->oracle->state
+ == AWAITING_A_SUBCLIENT);
+ set_state(c->oracle,
+ SENDING_OTHER_QUESTION_PREFIX);
+ }
+ }
+ break;
+ case SENDING_OTHER_QUESTION_PREFIX:
+ if (!send_string(c, "While the Oracle ponders,"
+ " please answer the following question:\n"))
+ goto fail;
+ break;
+ case SENDING_OTHER_QUESTION:
+ if (!send_string(c, c->subclient->question))
+ goto fail;
+ break;
+ case RECEIVING_OTHER_ANSWER:
+ len = read_string(c->fd, &c->subclient->answer);
+ if (len <= 0)
+ goto fail;
+ if (input_finished(c->subclient->answer)) {
+ /* Did our oracle answer for us already? */
+ if (input_finished(c->answer))
+ set_state(c, SENDING_ANSWER_PREFIX);
+ else
+ set_state(c, AWAITING_OUR_ORACLE);
+
+ /* If they were waiting for an answer, move them. */
+ if (c->subclient->state == AWAITING_OUR_ORACLE)
+ set_state(c->subclient, SENDING_ANSWER_PREFIX);