[git commit] Make unix (local) sockets work without IPv6 enabled

Denys Vlasenko vda.linux at googlemail.com
Thu Feb 9 14:14:33 UTC 2012


commit: http://git.busybox.net/busybox/commit/?id=9106107a509cfb23806e46765ea2704cdd130654
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

The xsocket_type() function had an optional "family" argument
that was enabled only if IPv6 is enabled. In the case of the
function was called with a valid AF_UNIX argument, and IPv6 is
disabled, this argument was silently ignored.

This patch makes the "family" argument mandatory, while keeping
the old behavior i.e., if AF_UNSPEC is passed, we try first IPv6
(if it's enabled) and fallback to IPv4.

Also I changed all callers of xsocket_type() to reflect its new
interface.

Signed-off-by: Jonh Wendell <jonh.wendell at vexcorp.com>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 include/libbb.h  |    5 -----
 libbb/xconnect.c |   16 +++++++++-------
 2 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index 4975b97..f743bdf 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -568,12 +568,7 @@ enum {
  * and if kernel doesn't support it, fall back to IPv4.
  * This is useful if you plan to bind to resulting local lsa.
  */
-#if ENABLE_FEATURE_IPV6
 int xsocket_type(len_and_sockaddr **lsap, int af, int sock_type) FAST_FUNC;
-#else
-int xsocket_type(len_and_sockaddr **lsap, int sock_type) FAST_FUNC;
-#define xsocket_type(lsap, af, sock_type) xsocket_type((lsap), (sock_type))
-#endif
 int xsocket_stream(len_and_sockaddr **lsap) FAST_FUNC;
 /* Create server socket bound to bindaddr:port. bindaddr can be NULL,
  * numeric IP ("N.N.N.N") or numeric IPv6 address,
diff --git a/libbb/xconnect.c b/libbb/xconnect.c
index 4b7c110..1c8bb2b 100644
--- a/libbb/xconnect.c
+++ b/libbb/xconnect.c
@@ -322,26 +322,28 @@ len_and_sockaddr* FAST_FUNC xdotted2sockaddr(const char *host, int port)
 	return str2sockaddr(host, port, AF_UNSPEC, AI_NUMERICHOST | DIE_ON_ERROR);
 }
 
-#undef xsocket_type
-int FAST_FUNC xsocket_type(len_and_sockaddr **lsap, IF_FEATURE_IPV6(int family,) int sock_type)
+int FAST_FUNC xsocket_type(len_and_sockaddr **lsap, int family, int sock_type)
 {
-	IF_NOT_FEATURE_IPV6(enum { family = AF_INET };)
 	len_and_sockaddr *lsa;
 	int fd;
 	int len;
 
-#if ENABLE_FEATURE_IPV6
 	if (family == AF_UNSPEC) {
+#if ENABLE_FEATURE_IPV6
 		fd = socket(AF_INET6, sock_type, 0);
 		if (fd >= 0) {
 			family = AF_INET6;
 			goto done;
 		}
+#endif
 		family = AF_INET;
 	}
-#endif
+
 	fd = xsocket(family, sock_type, 0);
+
 	len = sizeof(struct sockaddr_in);
+	if (family == AF_UNIX)
+		len = sizeof(struct sockaddr_un);
 #if ENABLE_FEATURE_IPV6
 	if (family == AF_INET6) {
  done:
@@ -357,7 +359,7 @@ int FAST_FUNC xsocket_type(len_and_sockaddr **lsap, IF_FEATURE_IPV6(int family,)
 
 int FAST_FUNC xsocket_stream(len_and_sockaddr **lsap)
 {
-	return xsocket_type(lsap, IF_FEATURE_IPV6(AF_UNSPEC,) SOCK_STREAM);
+	return xsocket_type(lsap, AF_UNSPEC, SOCK_STREAM);
 }
 
 static int create_and_bind_or_die(const char *bindaddr, int port, int sock_type)
@@ -370,7 +372,7 @@ static int create_and_bind_or_die(const char *bindaddr, int port, int sock_type)
 		/* user specified bind addr dictates family */
 		fd = xsocket(lsa->u.sa.sa_family, sock_type, 0);
 	} else {
-		fd = xsocket_type(&lsa, IF_FEATURE_IPV6(AF_UNSPEC,) sock_type);
+		fd = xsocket_type(&lsa, AF_UNSPEC, sock_type);
 		set_nport(&lsa->u.sa, htons(port));
 	}
 	setsockopt_reuseaddr(fd);


More information about the busybox-cvs mailing list