summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2017-08-08 19:13:06 -0400
committerJune McEnroe <june@causal.agency>2017-08-08 19:13:06 -0400
commit8606c88ea4c2c3740a7e59e7def591e3c4eeced7 (patch)
tree1fa2f9387e26e1be54b1a172e5fc0a13ba49a4a2
parentTurn off SIGPIPE at the socket level (diff)
downloadtorus-8606c88ea4c2c3740a7e59e7def591e3c4eeced7.tar.gz
torus-8606c88ea4c2c3740a7e59e7def591e3c4eeced7.zip
Reverse order of main loop
-rwxr-xr-xserver.c90
1 files changed, 42 insertions, 48 deletions
diff --git a/server.c b/server.c
index 8ad47ba..64e4e18 100755
--- a/server.c
+++ b/server.c
@@ -297,62 +297,56 @@ int main() {
         if (nevents < 0) err(EX_IOERR, "kevent");
         if (!nevents) continue;
 
-        if (!event.udata) {
-            int fd = accept(server, NULL, NULL);
-            if (fd < 0) err(EX_IOERR, "accept");
-            fcntl(fd, F_SETFL, O_NONBLOCK);
-
-            int on = 1;
-            error = setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on));
-            if (error) err(EX_IOERR, "setsockopt");
-
-            struct Client *client = clientAdd(fd);
-
-            struct kevent event = {
-                .ident = fd,
-                .filter = EVFILT_READ,
-                .flags = EV_ADD,
-                .fflags = 0,
-                .data = 0,
-                .udata = client,
-            };
-            nevents = kevent(kq, &event, 1, NULL, 0, NULL);
-            if (nevents < 0) err(EX_OSERR, "kevent");
-
-            struct ServerMessage msg = { .type = SERVER_TILE };
-            if (
-                !clientSend(client, &msg) ||
-                !clientMove(client, 0, 0) ||
-                !clientCursors(client)
-            ) {
+        if (event.udata) {
+            struct Client *client = event.udata;
+            if (event.flags & EV_EOF) {
                 clientRemove(client);
+                continue;
             }
 
-            continue;
-        }
+            struct ClientMessage msg;
+            ssize_t len = recv(client->fd, &msg, sizeof(msg), 0);
+            if (len != sizeof(msg)) {
+                clientRemove(client);
+                continue;
+            }
 
-        struct Client *client = event.udata;
-        if (event.flags & EV_EOF) {
-            clientRemove(client);
-            continue;
-        }
+            bool success = false;
+            if (msg.type == CLIENT_MOVE) {
+                success = clientMove(client, msg.data.m.dx, msg.data.m.dy);
+            } else if (msg.type == CLIENT_PUT) {
+                success = clientPut(client, msg.data.p.color, msg.data.p.cell);
+            }
+            if (!success) clientRemove(client);
 
-        struct ClientMessage msg;
-        ssize_t len = recv(client->fd, &msg, sizeof(msg), 0);
-        if (len != sizeof(msg)) {
-            clientRemove(client);
             continue;
         }
 
-        bool success = false;
-        switch (msg.type) {
-            case CLIENT_MOVE:
-                success = clientMove(client, msg.data.m.dx, msg.data.m.dy);
-                break;
-            case CLIENT_PUT:
-                success = clientPut(client, msg.data.p.color, msg.data.p.cell);
-                break;
-        }
+        int fd = accept(server, NULL, NULL);
+        if (fd < 0) err(EX_IOERR, "accept");
+        fcntl(fd, F_SETFL, O_NONBLOCK);
+
+        int on = 1;
+        error = setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on));
+        if (error) err(EX_IOERR, "setsockopt");
+
+        struct Client *client = clientAdd(fd);
+
+        struct kevent event = {
+            .ident = fd,
+            .filter = EVFILT_READ,
+            .flags = EV_ADD,
+            .fflags = 0,
+            .data = 0,
+            .udata = client,
+        };
+        nevents = kevent(kq, &event, 1, NULL, 0, NULL);
+        if (nevents < 0) err(EX_OSERR, "kevent");
+
+        struct ServerMessage msg = { .type = SERVER_TILE };
+        bool success = clientSend(client, &msg)
+            && clientMove(client, 0, 0)
+            && clientCursors(client);
         if (!success) clientRemove(client);
     }
 }