iplib: Support O_NONBLOCK in helper functions
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 22 Jul 2015 12:06:48 +0000 (08:06 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 24 Jul 2015 07:39:31 +0000 (03:39 -0400)
Applications can now use the iplib helpers and get non-blocking
conversations.

dial9(), announce9(), and listen9() all take a flags parameter.  For
now, O_NONBLOCK in that flags parameter will be passed directly to the
underlying open calls that create new conversations.  For dial9 and
announce9, those calls are to open a clone.  For listen9, that call is
opening a listen.

user/iplib/announce.c
user/iplib/dial.c

index 24b9dde..ddf99a0 100755 (executable)
@@ -43,7 +43,7 @@ int announce9(char *addr, char *dir, int flags)
        /*
         * get a control channel
         */
-       ctl = open(netdir, O_RDWR);
+       ctl = open(netdir, O_RDWR | (flags & O_NONBLOCK));
        if(ctl<0){
                fprintf(stderr,"announce opening %s: %r\n", netdir);
                return -1;
@@ -101,7 +101,7 @@ int listen9(char *dir, char *newdir, int flags)
         *  open listen, wait for a call
         */
        snprintf(buf, sizeof(buf), "%s/listen", dir);
-       ctl = open(buf, O_RDWR);
+       ctl = open(buf, O_RDWR | (flags & O_NONBLOCK));
        if(ctl < 0){
                if ((errno != EAGAIN) && (errno != EWOULDBLOCK))
                        fprintf(stderr,"listen opening %s: %r\n", buf);
index 865b47a..11792bc 100755 (executable)
@@ -18,8 +18,8 @@
 #define NETPATHLEN 40
 static int isdigit(int c) {return ((c >= '0' && c <= '9'));}
 
-static int
-call(char *clone, char *dest, int *cfdp, char *dir, char *local)
+static int call(char *clone, char *dest, int *cfdp, char *dir, char *local,
+                int flags)
 {
        int fd, cfd;
        int n;
@@ -27,7 +27,7 @@ call(char *clone, char *dest, int *cfdp, char *dir, char *local)
        char data[3*NAMELEN+10];
        char *p;
 
-       cfd = open(clone, O_RDWR);
+       cfd = open(clone, O_RDWR | (flags & O_NONBLOCK));
        if(cfd < 0)
                return -1;
 
@@ -106,7 +106,7 @@ int dial9(char *dest, char *local, char *dir, int *cfdp, int flags)
                if (q && isdigit(q[1])) {
                        *p++ = 0;
                        sprintf(clone, "%s/%s/clone", netdir, net);
-                       return call(clone, p, cfdp, dir, local);
+                       return call(clone, p, cfdp, dir, local, flags);
                }
        }
        /* call the connection server */
@@ -117,7 +117,7 @@ int dial9(char *dest, char *local, char *dir, int *cfdp, int flags)
                p = strchr(net, '!');
                *p++ = 0;
                sprintf(clone, "%s/%s/clone", netdir, net);
-               return call(clone, p, cfdp, dir, local);
+               return call(clone, p, cfdp, dir, local, flags);
        }
 
        /*
@@ -140,7 +140,7 @@ int dial9(char *dest, char *local, char *dir, int *cfdp, int flags)
                if(p == 0)
                        continue;
                *p++ = 0;
-               rv = call(net, p, cfdp, dir, local);
+               rv = call(net, p, cfdp, dir, local, flags);
                if(rv >= 0)
                        break;
        }