]> git.ozlabs.org Git - ccan-lca-2011.git/blobdiff - ccan/oserver/oserver.c
lca2011: add greeting and prefix states.
[ccan-lca-2011.git] / ccan / oserver / oserver.c
index 076ba70b4c15930eeb7cfde0ffb6e2eed1a38a57..b8959035e1cadc8056f879892f541a74ea7c55d3 100644 (file)
 #include <signal.h>
 
 enum state {
+       SENDING_GREETING,
        RECEIVING_USER_QUESTION,
+       SENDING_ANSWER_PREFIX,
        SENDING_ANSWER,
        FINISHED
 };
 
 static uint16_t state_flag_map[] = {
+       [SENDING_GREETING]              = TEVENT_FD_WRITE,
        [RECEIVING_USER_QUESTION]       = TEVENT_FD_READ,
+       [SENDING_ANSWER_PREFIX]         = TEVENT_FD_WRITE,
        [SENDING_ANSWER]                = TEVENT_FD_WRITE,
        [FINISHED]                      = 0
 };
@@ -105,6 +109,10 @@ static void service_client(struct tevent_context *ev,
        ssize_t len;
 
        switch (c->state) {
+       case SENDING_GREETING:
+               if (!send_string(c, "Welcome.  Please ask your question.\n"))
+                       goto fail;
+               break;
        case RECEIVING_USER_QUESTION:
                len = read_string(c->fd, &c->question);
                if (len <= 0)
@@ -114,9 +122,13 @@ static void service_client(struct tevent_context *ev,
 
                        for (i = 0; c->question[i]; i++)
                                c->question[i] = toupper(c->question[i]);
-                       set_state(c, SENDING_ANSWER);
+                       set_state(c, SENDING_ANSWER_PREFIX);
                }
                break;
+       case SENDING_ANSWER_PREFIX:
+               if (!send_string(c, "Our answer is:\n"))
+                       goto fail;
+               break;
        case SENDING_ANSWER:
                if (!send_string(c, c->question))
                        goto fail;
@@ -159,7 +171,7 @@ static void add_client(struct tevent_context *ev,
        if (client->fd < 0)
                err(1, "Accepting client connection");
 
-       client->state = RECEIVING_USER_QUESTION;
+       client->state = SENDING_GREETING;
        client->bytes_sent = 0;
        client->question = talloc_strdup(client, "");
        client->oserver = oserver;