Committer  : entrope
CVSROOT    : /cvsroot/undernet-ircu
Module     : ircu2.10
Branch tags: u2_10_12_branch
Commit time: 2006-02-16 03:22:38 UTC

Modified files:
  Tag: u2_10_12_branch
     ircd/os_generic.c include/ircd_osdep.h ChangeLog

Log message:

Add os_socketpair() function; clean up blocking tests.

---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.710.2.67 ircu2.10/ChangeLog:1.710.2.68
--- ircu2.10/ChangeLog:1.710.2.67       Wed Feb 15 19:16:19 2006
+++ ircu2.10/ChangeLog  Wed Feb 15 19:22:28 2006
@@ -1,5 +1,13 @@
 2006-02-15  Michael Poole <[EMAIL PROTECTED]>
 
+       * include/ircd_osdep.h (os_socketpair): Declare.
+
+       * ircd/os_generic.c (is_blocked): New local function.
+       (os_*): Use is_blocked() instead of cut-and-pasted code.
+       (os_socketpair): New function.
+
+2006-02-15  Michael Poole <[EMAIL PROTECTED]>
+
        * ircd/match.c (match): Fix backtracking bug after an escape
        (reported by Michael, I think).
 
Index: ircu2.10/include/ircd_osdep.h
diff -u ircu2.10/include/ircd_osdep.h:1.7 ircu2.10/include/ircd_osdep.h:1.7.2.1
--- ircu2.10/include/ircd_osdep.h:1.7   Wed Sep 29 20:18:15 2004
+++ ircu2.10/include/ircd_osdep.h       Wed Feb 15 19:22:28 2006
@@ -1,6 +1,6 @@
 /** @file ircd_osdep.h
  * @brief Public definitions and APIs for OS-dependent operations.
- * @version $Id: ircd_osdep.h,v 1.7 2004/09/30 03:18:15 entrope Exp $
+ * @version $Id: ircd_osdep.h,v 1.7.2.1 2006/02/16 03:22:28 entrope Exp $
  */
 #ifndef INCLUDED_ircd_osdep_h
 #define INCLUDED_ircd_osdep_h
@@ -53,6 +53,7 @@
 extern int os_set_reuseaddr(int fd);
 extern int os_set_sockbufs(int fd, unsigned int ssize, unsigned int rsize);
 extern int os_set_tos(int fd,int tos);
+extern int os_socketpair(int sv[2]);
 
 #endif /* INCLUDED_ircd_osdep_h */
 
Index: ircu2.10/ircd/os_generic.c
diff -u ircu2.10/ircd/os_generic.c:1.23.2.2 ircu2.10/ircd/os_generic.c:1.23.2.3
--- ircu2.10/ircd/os_generic.c:1.23.2.2 Tue Dec 13 19:01:38 2005
+++ ircu2.10/ircd/os_generic.c  Wed Feb 15 19:22:28 2006
@@ -18,7 +18,7 @@
  */
 /** @file
  * @brief Implementation of OS-dependent operations.
- * @version $Id: os_generic.c,v 1.23.2.2 2005/12/14 03:01:38 entrope Exp $
+ * @version $Id: os_generic.c,v 1.23.2.3 2006/02/16 03:22:28 entrope Exp $
  */
 #include "config.h"
 
@@ -81,6 +81,17 @@
 #define getrusage(a,b) syscall(SYS_GETRUSAGE, a, b)
 #endif
 
+static int is_blocked(int error)
+{
+  return EWOULDBLOCK == error
+#ifdef ENOMEM
+    || ENOMEM == error
+#endif
+#ifdef ENOBUFS
+    || ENOBUFS == error
+#endif
+    || EAGAIN == error;
+}
 
 static void sockaddr_in_to_irc(const struct sockaddr_in *v4,
                                struct irc_sockaddr *irc)
@@ -428,31 +439,14 @@
   int res;
   assert(0 != buf);
   assert(0 != count_out);
-  *count_out = 0;
-  errno = 0;
 
   if (0 < (res = recv(fd, buf, length, 0))) {
     *count_out = (unsigned) res;
     return IO_SUCCESS;
+  } else {
+    *count_out = 0;
+    return (res < 0) && is_blocked(errno) ? IO_BLOCKED : IO_FAILURE;
   }
-  else if (res < 0) {
-    if (EWOULDBLOCK == errno || EAGAIN == errno
-#ifdef ENOMEM
-       || ENOMEM == errno
-#endif
-#ifdef ENOBUFS
-       || ENOBUFS == errno
-#endif
-       )
-      return IO_BLOCKED;
-    else
-      return IO_FAILURE;
-  }
-  /*
-   * 0   == client closed the connection
-   * < 1 == error
-   */
-  return IO_FAILURE;
 }
 
 /** Attempt to read from a non-blocking UDP socket.
@@ -473,25 +467,16 @@
   assert(0 != buf);
   assert(0 != length_out);
   assert(0 != addr_out);
-  errno = 0;
-  *length_out = 0;
 
   res = recvfrom(fd, buf, length, 0, (struct sockaddr*) &addr, &len);
-  if (-1 == res) {
-    if (EWOULDBLOCK == errno || ENOMEM == errno
-#ifdef ENOMEM
-       || ENOMEM == errno
-#endif
-#ifdef ENOBUFS
-       || ENOBUFS == errno
-#endif
-       )
-      return IO_BLOCKED;
-    return IO_FAILURE;
+  if (-1 < res) {
+    sockaddr_to_irc(&addr, addr_out);
+    *length_out = res;
+    return IO_SUCCESS;
+  } else {
+    *length_out = 0;
+    return is_blocked(errno) ? IO_BLOCKED : IO_FAILURE;
   }
-  sockaddr_to_irc(&addr, addr_out);
-  *length_out = res;
-  return IO_SUCCESS;
 }
 
 /** Attempt to write on a non-blocking UDP socket.
@@ -510,9 +495,6 @@
   struct sockaddr_native addr;
   int res, size;
   assert(0 != buf);
-  if (count_out)
-    *count_out = 0;
-  errno = 0;
 
   size = sockaddr_from_irc(&addr, peer, fd);
   assert((addr.sn_family == AF_INET) == irc_in_addr_is_ipv4(&peer->addr));
@@ -520,17 +502,11 @@
     if (count_out)
       *count_out = (unsigned) res;
     return IO_SUCCESS;
+  } else {
+    if (count_out)
+      *count_out = 0;
+    return is_blocked(errno) ? IO_BLOCKED : IO_FAILURE;
   }
-  else if (EWOULDBLOCK == errno || EAGAIN == errno
-#ifdef ENOMEM
-          || ENOMEM == errno
-#endif
-#ifdef ENOBUFS
-          || ENOBUFS == errno
-#endif
-      )
-    return IO_BLOCKED;
-  return IO_FAILURE;
 }
 
 /** Attempt to write on a connected socket.
@@ -546,23 +522,14 @@
   int res;
   assert(0 != buf);
   assert(0 != count_out);
-  *count_out = 0;
-  errno = 0;
 
   if (-1 < (res = send(fd, buf, length, 0))) {
     *count_out = (unsigned) res;
     return IO_SUCCESS;
+  } else {
+    *count_out = 0;
+    return is_blocked(errno) ? IO_BLOCKED : IO_FAILURE;
   }
-  else if (EWOULDBLOCK == errno || EAGAIN == errno
-#ifdef ENOMEM
-          || ENOMEM == errno
-#endif
-#ifdef ENOBUFS
-          || ENOBUFS == errno
-#endif
-      )
-    return IO_BLOCKED;
-  return IO_FAILURE;
 }
 
 /** Attempt a vectored write on a connected socket.
@@ -584,26 +551,15 @@
   assert(0 != count_out);
 
   *count_in = 0;
-  *count_out = 0;
-  errno = 0;
-
   count = msgq_mapiov(buf, iov, IOV_MAX, count_in);
 
   if (-1 < (res = writev(fd, iov, count))) {
     *count_out = (unsigned) res;
     return IO_SUCCESS;
+  } else {
+    *count_out = 0;
+    return is_blocked(errno) ? IO_BLOCKED : IO_FAILURE;
   }
-  else if (EWOULDBLOCK == errno || EAGAIN == errno
-#ifdef ENOMEM
-          || ENOMEM == errno
-#endif
-#ifdef ENOBUFS
-          || ENOBUFS == errno
-#endif
-      )
-    return IO_BLOCKED;
-
-  return IO_FAILURE;
 }
 
 /** Open a TCP or UDP socket on a particular address.
@@ -680,9 +636,12 @@
   int size;
 
   size = sockaddr_from_irc(&addr, sin, fd);
-  if (connect(fd, (struct sockaddr*) &addr, size))
-    return (errno == EINPROGRESS) ? IO_BLOCKED : IO_FAILURE;
-  return IO_SUCCESS;
+  if (0 == connect(fd, (struct sockaddr*) &addr, size))
+    return IO_SUCCESS;
+  else if (errno == EINPROGRESS)
+    return IO_BLOCKED;
+  else
+    return IO_FAILURE;
 }
 
 /** Get local address of a socket.
@@ -728,3 +687,12 @@
 {
   return (0 == listen(fd, backlog));
 }
+
+/** Allocate a connected pair of local sockets.
+ * @param[out] sv Array of two file descriptors.
+ * @return Zero on success; non-zero number on error.
+ */
+int os_socketpair(int sv[2])
+{
+    return socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
+}
----------------------- End of diff -----------------------
_______________________________________________
Patches mailing list
[email protected]
http://undernet.sbg.org/mailman/listinfo/patches

Reply via email to