VMM: Make new virtio implementation work with new vmm 2LS
[akaros.git] / tests / epoll_server.c
index 6200562..b3b71e9 100644 (file)
@@ -9,7 +9,7 @@
  * #define for PLAN9NET. */
 
 /* Comment this out for BSD sockets */
-#define PLAN9NET
+//#define PLAN9NET
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -46,7 +46,6 @@ int main()
        char adir[40], ldir[40];
        int n;
        char buf[256];
-       char debugbuf[256];
        /* We'll use this to see if we actually did epoll_waits instead of blocking
         * calls.  It's not 100%, but with a human on the other end, it should be
         * fine. */
@@ -59,7 +58,7 @@ int main()
         * writes "announce [addr]" into ctl.  This "announce" command often has a
         * "bind" in it too.  plan9 bind just sets the local addr/port.  TCP
         * announce also does this.  Returns the ctlfd. */
-       afd = announce9("tcp!*!23", adir, O_NONBLOCK);
+       afd = announce9("tcp!*!23", adir, 0);
 
        if (afd < 0) {
                perror("Announce failure");
@@ -120,6 +119,11 @@ int main()
                perror("listen fd");
                return -1;
        }
+       /* This is a little subtle.  We're putting a tap on the listen file /
+        * listen_fd.  When this fires, we get an event because of that listen_fd.
+        * But we don't actually listen or do anything to that listen_fd.  It's
+        * solely for monitoring.  We open a path, below, and we'll reattempt to do
+        * *that* operation when someone tells us that our listen tap fires. */
        ep_ev.data.fd = listen_fd;
        if (epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &ep_ev)) {
                perror("epoll_ctl_add listen");
@@ -133,7 +137,7 @@ int main()
                 * out the conv number (the line) for this new conv.  listen() returns
                 * the ctl for this new conv.
                 *
-                * Non-block is for the new connection.  Not the act of listening. */
+                * Non-block is for the act of listening, and applies to lcfd. */
                lcfd = listen9(adir, ldir, O_NONBLOCK);
                if (lcfd >= 0)
                        break;
@@ -195,12 +199,6 @@ int main()
        }
        printf("Accepted and got dfd %d\n", dfd);
        assert(has_epolled);
-       /* In lieu of accept4, we set the new socket's nonblock status manually */
-       ret = fcntl(dfd, F_SETFL, O_NONBLOCK);
-       if (ret < 0) {
-               perror("setfl dfd");
-               exit(-1);
-       }
        if (epoll_ctl(epfd, EPOLL_CTL_DEL, srv_socket, &ep_ev)) {
                perror("epoll_ctl_del");
                while (1);
@@ -209,6 +207,13 @@ int main()
 
 #endif
 
+       /* In lieu of accept4, we set the new socket's nonblock status manually.
+        * Both OSs do this.  */
+       ret = fcntl(dfd, F_SETFL, O_NONBLOCK);
+       if (ret < 0) {
+               perror("setfl dfd");
+               exit(-1);
+       }
        ep_ev.data.fd = dfd;
        if (epoll_ctl(epfd, EPOLL_CTL_ADD, dfd, &ep_ev)) {
                perror("epoll_ctl_add dvd");
@@ -216,10 +221,11 @@ int main()
        }
        /* echo until EOF */
        has_epolled = FALSE;
+       printf("Server read: ");
        while (1) {
                while ((n = read(dfd, buf, sizeof(buf))) > 0) {
-                       snprintf(debugbuf, n, "%s", buf);
-                       printf("Server read: %s", debugbuf);
+                       for (int i = 0; i < n; i++)
+                               printf("%c", buf[i]);
                        fflush(stdout);
                        /* Should epoll on this direction too. */
                        if (write(dfd, buf, n) < 0) {