]> 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 3256369d6d189eab13cc7790bc02e32ac1528103..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;
@@ -178,6 +190,12 @@ static void add_client(struct tevent_context *ev,
                tevent_fd_set_flags(oserver->fde, 0);
 }
 
+static void clear_clients(struct oserver *oserver)
+{
+       memset(oserver->clients, 0,
+              ARRAY_SIZE(oserver->clients) * sizeof(oserver->clients[0]));
+}
+
 static int destroy_oserver(struct oserver *oserver)
 {
        close(oserver->fd);
@@ -194,12 +212,13 @@ struct oserver *oserver_setup(struct tevent_context *ev, unsigned short port)
        } u;
 
        oserver = talloc(ev, struct oserver);
-
+       clear_clients(oserver);
        oserver->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (oserver->fd < 0) {
                talloc_free(oserver);
                return NULL;
        }
+       
        talloc_set_destructor(oserver, destroy_oserver);
 
        if (setsockopt(oserver->fd, SOL_SOCKET, SO_REUSEADDR,