lib: Add xpipe_nonblocking helper
[sliver-openvswitch.git] / lib / socket-util.c
index 5fe9f98..f8b44cc 100644 (file)
@@ -30,6 +30,7 @@
 #include <sys/resource.h>
 #include <sys/socket.h>
 #include <sys/stat.h>
+#include <sys/uio.h>
 #include <sys/un.h>
 #include <unistd.h>
 #include "dynamic-string.h"
@@ -91,15 +92,17 @@ xset_nonblocking(int fd)
     }
 }
 
-static int
+int
 set_dscp(int fd, uint8_t dscp)
 {
+    int val;
+
     if (dscp > 63) {
         return EINVAL;
     }
 
-    dscp = dscp << 2;
-    if (setsockopt(fd, IPPROTO_IP, IP_TOS, &dscp, sizeof dscp)) {
+    val = dscp << 2;
+    if (setsockopt(fd, IPPROTO_IP, IP_TOS, &val, sizeof val)) {
         return errno;
     }
 
@@ -180,7 +183,7 @@ lookup_ipv6(const char *host_name, struct in6_addr *addr)
  * Most Open vSwitch code should not use this because it causes deadlocks:
  * gethostbyname() sends out a DNS request but that starts a new flow for which
  * OVS must set up a flow, but it can't because it's waiting for a DNS reply.
- * The synchronous lookup also delays other activty.  (Of course we can solve
+ * The synchronous lookup also delays other activity.  (Of course we can solve
  * this but it doesn't seem worthwhile quite yet.)  */
 int
 lookup_hostname(const char *host_name, struct in_addr *addr)
@@ -890,6 +893,14 @@ xpipe(int fds[2])
     }
 }
 
+void
+xpipe_nonblocking(int fds[2])
+{
+    xpipe(fds);
+    xset_nonblocking(fds[0]);
+    xset_nonblocking(fds[1]);
+}
+
 void
 xsocketpair(int domain, int type, int protocol, int fds[2])
 {