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