net: Fixup iplib based on the O_NONBLOCK rules
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 30 Mar 2016 22:42:19 +0000 (18:42 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 5 Apr 2016 19:42:18 +0000 (15:42 -0400)
Previously, we could open the CTL with O_NONBLOCK, and that would set the
entire conversation non-blocking.  O_NONBLOCK is now a per-chan thing.  Now
there's no reason to open the CTLs non-blocking when making a conversation,
but we do need to open the DATAs O_NONBLOCK.  We still need to open the
LISTENs O_NONBLOCK (which returns a CTL fd...).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tests/epoll_server.c
tests/select_server.c
user/iplib/announce.c
user/iplib/dial.c

index 420f5d2..b3b71e9 100644 (file)
@@ -9,7 +9,7 @@
  * #define for PLAN9NET. */
 
 /* Comment this out for BSD sockets */
  * #define for PLAN9NET. */
 
 /* Comment this out for BSD sockets */
-#define PLAN9NET
+//#define PLAN9NET
 
 #include <stdlib.h>
 #include <stdio.h>
 
 #include <stdlib.h>
 #include <stdio.h>
@@ -58,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. */
         * 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");
 
        if (afd < 0) {
                perror("Announce failure");
@@ -119,6 +119,11 @@ int main()
                perror("listen fd");
                return -1;
        }
                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");
        ep_ev.data.fd = listen_fd;
        if (epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &ep_ev)) {
                perror("epoll_ctl_add listen");
@@ -132,7 +137,7 @@ int main()
                 * out the conv number (the line) for this new conv.  listen() returns
                 * the ctl for this new conv.
                 *
                 * 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;
                lcfd = listen9(adir, ldir, O_NONBLOCK);
                if (lcfd >= 0)
                        break;
@@ -194,12 +199,6 @@ int main()
        }
        printf("Accepted and got dfd %d\n", dfd);
        assert(has_epolled);
        }
        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);
        if (epoll_ctl(epfd, EPOLL_CTL_DEL, srv_socket, &ep_ev)) {
                perror("epoll_ctl_del");
                while (1);
@@ -208,6 +207,13 @@ int main()
 
 #endif
 
 
 #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");
        ep_ev.data.fd = dfd;
        if (epoll_ctl(epfd, EPOLL_CTL_ADD, dfd, &ep_ev)) {
                perror("epoll_ctl_add dvd");
index be3f22e..0ef5e57 100644 (file)
@@ -63,7 +63,7 @@ int main(void)
         * 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. */
         * 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");
 
        if (afd < 0) {
                perror("Announce failure");
@@ -116,6 +116,11 @@ int main(void)
                perror("listen fd");
                return -1;
        }
                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. */
        FD_ZERO(&rfds);
        FD_SET(listen_fd, &rfds);
        has_selected = FALSE;
        FD_ZERO(&rfds);
        FD_SET(listen_fd, &rfds);
        has_selected = FALSE;
@@ -126,7 +131,7 @@ int main(void)
                 * out the conv number (the line) for this new conv.  listen() returns
                 * the ctl for this new conv.
                 *
                 * 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;
                lcfd = listen9(adir, ldir, O_NONBLOCK);
                if (lcfd >= 0)
                        break;
@@ -177,15 +182,16 @@ int main(void)
        }
        printf("Accepted and got dfd %d\n", dfd);
        assert(has_selected);
        }
        printf("Accepted and got dfd %d\n", dfd);
        assert(has_selected);
-       /* In lieu of accept4, we set the new socket's nonblock status manually */
+
+#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);
        }
        ret = fcntl(dfd, F_SETFL, O_NONBLOCK);
        if (ret < 0) {
                perror("setfl dfd");
                exit(-1);
        }
-
-#endif
-
        FD_SET(dfd, &rfds);
        /* echo until EOF */
        has_selected = FALSE;
        FD_SET(dfd, &rfds);
        /* echo until EOF */
        has_selected = FALSE;
index ddf99a0..e261585 100755 (executable)
@@ -43,7 +43,7 @@ int announce9(char *addr, char *dir, int flags)
        /*
         * get a control channel
         */
        /*
         * get a control channel
         */
-       ctl = open(netdir, O_RDWR | (flags & O_NONBLOCK));
+       ctl = open(netdir, O_RDWR);
        if(ctl<0){
                fprintf(stderr,"announce opening %s: %r\n", netdir);
                return -1;
        if(ctl<0){
                fprintf(stderr,"announce opening %s: %r\n", netdir);
                return -1;
index 11792bc..9eff05d 100755 (executable)
@@ -27,7 +27,7 @@ static int call(char *clone, char *dest, int *cfdp, char *dir, char *local,
        char data[3*NAMELEN+10];
        char *p;
 
        char data[3*NAMELEN+10];
        char *p;
 
-       cfd = open(clone, O_RDWR | (flags & O_NONBLOCK));
+       cfd = open(clone, O_RDWR);
        if(cfd < 0)
                return -1;
 
        if(cfd < 0)
                return -1;
 
@@ -56,7 +56,7 @@ static int call(char *clone, char *dest, int *cfdp, char *dir, char *local,
        }
 
        /* open data connection */
        }
 
        /* open data connection */
-       fd = open(data, O_RDWR);
+       fd = open(data, O_RDWR | (flags & O_NONBLOCK));
        if(fd < 0){
                close(cfd);
                return -1;
        if(fd < 0){
                close(cfd);
                return -1;