[SCM] Samba Shared Repository - branch v3-3-test updated - release-3-2-0pre2-2803-geb8c37a

Stefan Metzmacher metze at samba.org
Tue Jun 10 10:03:24 GMT 2008


The branch, v3-3-test has been updated
       via  eb8c37a1ca97b41de00ec937a90bfdbe9cd21531 (commit)
       via  b03c2793548834a1dc0483b03081d872ab1e17f0 (commit)
       via  e4e015caac88f6e31ca6d8fcda5a97a11aee226d (commit)
       via  4d5bfcc731b44267e2c30fccdca72b6058b16bfb (commit)
       via  801ed0b79956133f2baa6b2db4a7dd5a68060edc (commit)
       via  66b9f6f3722defd0863b055916b302478715704b (commit)
       via  cf6d815ba82a25c1e1f1dfdb8548cc588d44d1aa (commit)
       via  8003f00a28bb7237ec1b1f4eb9687c542a86c2b2 (commit)
       via  d22701b196bded3294776b144a7a990de23741e9 (commit)
       via  3db8b246c8abfc4efed08d7630e61a81b9d8bf48 (commit)
      from  04e2470e2eeef34362f2893ec062ae16f74c28ed (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-3-test


- Log -----------------------------------------------------------------
commit eb8c37a1ca97b41de00ec937a90bfdbe9cd21531
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jun 10 08:33:24 2008 +0200

    socket_wrapper: truncate packets to a 1500 byte payload
    
    Truncate sendto(), recvfrom(), send() and recv() to 1500 bytes
    so that're getting a correctly formatted pcap file and the result
    look more like real network traffic.
    
    metze
    (cherry picked from commit 5b01206f1bb2e62c08bda34b45904ec4f83ac5de)

commit b03c2793548834a1dc0483b03081d872ab1e17f0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jun 10 09:21:05 2008 +0200

    socket_wrapper: sync missing stuff from v4-0-test
    
    metze

commit e4e015caac88f6e31ca6d8fcda5a97a11aee226d
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Tue Feb 19 23:53:04 2008 +0100

    Factor out IP marshalling into separate function.
    (cherry picked from commit 2548c2a1e7dab8abc00f8f49374a08cc0b427552)

commit 4d5bfcc731b44267e2c30fccdca72b6058b16bfb
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Nov 1 13:10:59 2007 +0100

    r25783: socket_wrapper: don't include "includes.h"
    
    metze
    (cherry picked from commit 47f865165e772540334dcbcf80cfc1999b0132fa)

commit 801ed0b79956133f2baa6b2db4a7dd5a68060edc
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jun 11 14:41:14 2007 +0000

    r23420: try to make the IBM checker happy
    
    metze
    (cherry picked from commit 96f1a0dfaa18a432fca4b5432d929d8daed0abb1)

commit 66b9f6f3722defd0863b055916b302478715704b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jun 10 09:00:37 2008 +0200

    r22236: Update to Heimdal's socket_wrapper, which supports IPv6.
    
    To make this pass, I needed to add support for 6 and 17 as valid
    protocol values to socket().
    
    Andrew Bartlett
    (partly cherry picked from commit 2254e61a1e5b29a64c5a24aac029ace193057e24)
    
    metze

commit cf6d815ba82a25c1e1f1dfdb8548cc588d44d1aa
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Tue Mar 6 23:03:34 2007 +0000

    r21729: Some more tests
    (cherry picked from commit d2baa8218cf504d6631d610f9fd393ad8c61574c)

commit 8003f00a28bb7237ec1b1f4eb9687c542a86c2b2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Jun 10 08:53:34 2008 +0200

    r21671: Add initial simple tests for socket wrapper
    (partly cherry picked from commit 872e2ad541478597191ca9e31872d5c8e2bbb832)
    
    metze

commit d22701b196bded3294776b144a7a990de23741e9
Author: Love Hörnquist Åstrand <lha at samba.org>
Date:   Thu Oct 19 04:56:21 2006 +0000

    r19409: Pull in <sys/time.h> for struct timeval for non samba build (don't
    depend on namespace pollution)
    (cherry picked from commit 5052d2d10693e67f1b7c6c71277c8d1bc9c8b612)

commit 3db8b246c8abfc4efed08d7630e61a81b9d8bf48
Author: Love Hörnquist Åstrand <lha at samba.org>
Date:   Tue Oct 17 09:35:45 2006 +0000

    r19367: Solaris needs <sys/filio.h> for FIONREAD.
    (cherry picked from commit e2866ce78851a84c937408c0781fcc1e7107f663)

-----------------------------------------------------------------------

Summary of changes:
 source/lib/socket_wrapper/config.m4        |    8 +-
 source/lib/socket_wrapper/config.mk        |    8 +
 source/lib/socket_wrapper/socket_wrapper.c |  654 +++++++++++++++++++---------
 source/lib/socket_wrapper/socket_wrapper.h |    3 +
 source/lib/socket_wrapper/testsuite.c      |  105 +++++
 5 files changed, 569 insertions(+), 209 deletions(-)
 create mode 100644 source/lib/socket_wrapper/config.mk
 create mode 100644 source/lib/socket_wrapper/testsuite.c


Changeset truncated at 500 lines:

diff --git a/source/lib/socket_wrapper/config.m4 b/source/lib/socket_wrapper/config.m4
index 42212ab..f3ffb89 100644
--- a/source/lib/socket_wrapper/config.m4
+++ b/source/lib/socket_wrapper/config.m4
@@ -1,22 +1,22 @@
 AC_ARG_ENABLE(socket-wrapper, 
 [  --enable-socket-wrapper         Turn on socket wrapper library (default=no)])
 
-DEFAULT_TEST_TARGET=test-noswrap
+DEFAULT_TEST_OPTIONS=
 HAVE_SOCKET_WRAPPER=no
 
 if eval "test x$developer = xyes"; then
 	enable_socket_wrapper=yes
 fi
-
+    
 if eval "test x$enable_socket_wrapper = xyes"; then
         AC_DEFINE(SOCKET_WRAPPER,1,[Use socket wrapper library])
-	DEFAULT_TEST_TARGET=test-swrap
+	DEFAULT_TEST_OPTIONS=--socket-wrapper
 	HAVE_SOCKET_WRAPPER=yes
 
 	# this is only used for samba3
 	SOCKET_WRAPPER_OBJS="lib/socket_wrapper/socket_wrapper.o"
 fi
 
-AC_SUBST(DEFAULT_TEST_TARGET)
+AC_SUBST(DEFAULT_TEST_OPTIONS)
 AC_SUBST(HAVE_SOCKET_WRAPPER)
 AC_SUBST(SOCKET_WRAPPER_OBJS)
diff --git a/source/lib/socket_wrapper/config.mk b/source/lib/socket_wrapper/config.mk
new file mode 100644
index 0000000..60cfb32
--- /dev/null
+++ b/source/lib/socket_wrapper/config.mk
@@ -0,0 +1,8 @@
+##############################
+# Start SUBSYSTEM SOCKET_WRAPPER
+[SUBSYSTEM::SOCKET_WRAPPER]
+PRIVATE_DEPENDENCIES = LIBREPLACE_NETWORK
+# End SUBSYSTEM SOCKET_WRAPPER
+##############################
+
+SOCKET_WRAPPER_OBJ_FILES = $(socketwrappersrcdir)/socket_wrapper.o
diff --git a/source/lib/socket_wrapper/socket_wrapper.c b/source/lib/socket_wrapper/socket_wrapper.c
index c0a7c16..336179d 100644
--- a/source/lib/socket_wrapper/socket_wrapper.c
+++ b/source/lib/socket_wrapper/socket_wrapper.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) Jelmer Vernooij 2005 <jelmer at samba.org>
+ * Copyright (C) Jelmer Vernooij 2005,2008 <jelmer at samba.org>
  * Copyright (C) Stefan Metzmacher 2006 <metze at samba.org>
  *
  * All rights reserved.
@@ -42,26 +42,19 @@
 #ifdef _SAMBA_BUILD_
 
 #define SOCKET_WRAPPER_NOT_REPLACE
-#include "includes.h"
+#include "lib/replace/replace.h"
 #include "system/network.h"
 #include "system/filesys.h"
-
-#ifdef malloc
-#undef malloc
-#endif
-#ifdef calloc
-#undef calloc
-#endif
-#ifdef strdup
-#undef strdup
-#endif
+#include "system/time.h"
 
 #else /* _SAMBA_BUILD_ */
 
 #include <sys/types.h>
+#include <sys/time.h>
 #include <sys/stat.h>
 #include <sys/socket.h>
 #include <sys/ioctl.h>
+#include <sys/filio.h>
 #include <errno.h>
 #include <sys/un.h>
 #include <netinet/in.h>
@@ -73,8 +66,10 @@
 #include <stdio.h>
 #include <stdint.h>
 
-#define _PUBLIC_
+#endif
 
+#ifndef _PUBLIC_
+#define _PUBLIC_
 #endif
 
 #define SWRAP_DLIST_ADD(list,item) do { \
@@ -145,9 +140,13 @@
 #define SOCKET_FORMAT "%c%02X%04X"
 #define SOCKET_TYPE_CHAR_TCP		'T'
 #define SOCKET_TYPE_CHAR_UDP		'U'
+#define SOCKET_TYPE_CHAR_TCP_V6		'X'
+#define SOCKET_TYPE_CHAR_UDP_V6		'Y'
 
 #define MAX_WRAPPED_INTERFACES 16
 
+#define SW_IPV6_ADDRESS 1
+
 static struct sockaddr *sockaddr_dup(const void *data, socklen_t len)
 {
 	struct sockaddr *ret = (struct sockaddr *)malloc(len);
@@ -155,6 +154,35 @@ static struct sockaddr *sockaddr_dup(const void *data, socklen_t len)
 	return ret;
 }
 
+static void set_port(int family, int prt, struct sockaddr *addr)
+{
+	switch (family) {
+	case AF_INET:
+		((struct sockaddr_in *)addr)->sin_port = htons(prt);
+		break;
+#ifdef HAVE_IPV6
+	case AF_INET6:
+		((struct sockaddr_in6 *)addr)->sin6_port = htons(prt);
+		break;
+#endif
+	}
+}
+
+static size_t socket_length(int family)
+{
+	switch (family) {
+	case AF_INET:
+		return sizeof(struct sockaddr_in);
+#ifdef HAVE_IPV6
+	case AF_INET6:
+		return sizeof(struct sockaddr_in6);
+#endif
+	}
+	return 0;
+}
+
+
+
 struct socket_info
 {
 	int fd;
@@ -185,8 +213,7 @@ struct socket_info
 
 static struct socket_info *sockets;
 
-
-static const char *socket_wrapper_dir(void)
+const char *socket_wrapper_dir(void)
 {
 	const char *s = getenv("SOCKET_WRAPPER_DIR");
 	if (s == NULL) {
@@ -198,7 +225,7 @@ static const char *socket_wrapper_dir(void)
 	return s;
 }
 
-static unsigned int socket_wrapper_default_iface(void)
+unsigned int socket_wrapper_default_iface(void)
 {
 	const char *s = getenv("SOCKET_WRAPPER_DEFAULT_IFACE");
 	if (s) {
@@ -213,17 +240,13 @@ static unsigned int socket_wrapper_default_iface(void)
 	return 1;/* 127.0.0.1 */
 }
 
-static int convert_un_in(const struct sockaddr_un *un, struct sockaddr_in *in, socklen_t *len)
+static int convert_un_in(const struct sockaddr_un *un, struct sockaddr *in, socklen_t *len)
 {
 	unsigned int iface;
 	unsigned int prt;
 	const char *p;
 	char type;
 
-	if ((*len) < sizeof(struct sockaddr_in)) {
-		return 0;
-	}
-
 	p = strrchr(un->sun_path, '/');
 	if (p) p++; else p = un->sun_path;
 
@@ -232,80 +255,145 @@ static int convert_un_in(const struct sockaddr_un *un, struct sockaddr_in *in, s
 		return -1;
 	}
 
-	if (type != SOCKET_TYPE_CHAR_TCP && type != SOCKET_TYPE_CHAR_UDP) {
+	if (iface == 0 || iface > MAX_WRAPPED_INTERFACES) {
 		errno = EINVAL;
 		return -1;
 	}
 
-	if (iface == 0 || iface > MAX_WRAPPED_INTERFACES) {
+	if (prt > 0xFFFF) {
 		errno = EINVAL;
 		return -1;
 	}
 
-	if (prt > 0xFFFF) {
+	switch(type) {
+	case SOCKET_TYPE_CHAR_TCP:
+	case SOCKET_TYPE_CHAR_UDP: {
+		struct sockaddr_in *in2 = (struct sockaddr_in *)in;
+		
+		if ((*len) < sizeof(*in2)) {
+		    errno = EINVAL;
+		    return -1;
+		}
+
+		memset(in2, 0, sizeof(*in2));
+		in2->sin_family = AF_INET;
+		in2->sin_addr.s_addr = htonl((127<<24) | iface);
+		in2->sin_port = htons(prt);
+
+		*len = sizeof(*in2);
+		break;
+	}
+#ifdef HAVE_IPV6
+	case SOCKET_TYPE_CHAR_TCP_V6:
+	case SOCKET_TYPE_CHAR_UDP_V6: {
+		struct sockaddr_in6 *in2 = (struct sockaddr_in6 *)in;
+		
+		if ((*len) < sizeof(*in2)) {
+			errno = EINVAL;
+			return -1;
+		}
+
+		memset(in2, 0, sizeof(*in2));
+		in2->sin6_family = AF_INET6;
+		in2->sin6_addr.s6_addr[0] = SW_IPV6_ADDRESS;
+		in2->sin6_port = htons(prt);
+
+		*len = sizeof(*in2);
+		break;
+	}
+#endif
+	default:
 		errno = EINVAL;
 		return -1;
 	}
 
-	in->sin_family = AF_INET;
-	in->sin_addr.s_addr = htonl((127<<24) | iface);
-	in->sin_port = htons(prt);
-
-	*len = sizeof(struct sockaddr_in);
 	return 0;
 }
 
-static int convert_in_un_remote(struct socket_info *si, const struct sockaddr_in *in, struct sockaddr_un *un,
+static int convert_in_un_remote(struct socket_info *si, const struct sockaddr *inaddr, struct sockaddr_un *un,
 				int *bcast)
 {
-	char u_type = '\0';
-	char b_type = '\0';
-	char a_type = '\0';
 	char type = '\0';
-	unsigned int addr= ntohl(in->sin_addr.s_addr);
-	unsigned int prt = ntohs(in->sin_port);
+	unsigned int prt;
 	unsigned int iface;
 	int is_bcast = 0;
 
 	if (bcast) *bcast = 0;
 
-	if (prt == 0) {
-		errno = EINVAL;
-		return -1;
-	}
+	switch (si->family) {
+	case AF_INET: {
+		const struct sockaddr_in *in = 
+		    (const struct sockaddr_in *)inaddr;
+		unsigned int addr = ntohl(in->sin_addr.s_addr);
+		char u_type = '\0';
+		char b_type = '\0';
+		char a_type = '\0';
 
-	switch (si->type) {
-	case SOCK_STREAM:
-		u_type = SOCKET_TYPE_CHAR_TCP;
-		break;
-	case SOCK_DGRAM:
-		u_type = SOCKET_TYPE_CHAR_UDP;
-		a_type = SOCKET_TYPE_CHAR_UDP;
-		b_type = SOCKET_TYPE_CHAR_UDP;
+		switch (si->type) {
+		case SOCK_STREAM:
+			u_type = SOCKET_TYPE_CHAR_TCP;
+			break;
+		case SOCK_DGRAM:
+			u_type = SOCKET_TYPE_CHAR_UDP;
+			a_type = SOCKET_TYPE_CHAR_UDP;
+			b_type = SOCKET_TYPE_CHAR_UDP;
+			break;
+		}
+
+		prt = ntohs(in->sin_port);
+		if (a_type && addr == 0xFFFFFFFF) {
+			/* 255.255.255.255 only udp */
+			is_bcast = 2;
+			type = a_type;
+			iface = socket_wrapper_default_iface();
+		} else if (b_type && addr == 0x7FFFFFFF) {
+			/* 127.255.255.255 only udp */
+			is_bcast = 1;
+			type = b_type;
+			iface = socket_wrapper_default_iface();
+		} else if ((addr & 0xFFFFFF00) == 0x7F000000) {
+			/* 127.0.0.X */
+			is_bcast = 0;
+			type = u_type;
+			iface = (addr & 0x000000FF);
+		} else {
+			errno = ENETUNREACH;
+			return -1;
+		}
+		if (bcast) *bcast = is_bcast;
 		break;
 	}
+#ifdef HAVE_IPV6
+	case AF_INET6: {
+		const struct sockaddr_in6 *in = 
+		    (const struct sockaddr_in6 *)inaddr;
 
-	if (a_type && addr == 0xFFFFFFFF) {
-		/* 255.255.255.255 only udp */
-		is_bcast = 2;
-		type = a_type;
-		iface = socket_wrapper_default_iface();
-	} else if (b_type && addr == 0x7FFFFFFF) {
-		/* 127.255.255.255 only udp */
-		is_bcast = 1;
-		type = b_type;
-		iface = socket_wrapper_default_iface();
-	} else if ((addr & 0xFFFFFF00) == 0x7F000000) {
-		/* 127.0.0.X */
-		is_bcast = 0;
-		type = u_type;
-		iface = (addr & 0x000000FF);
-	} else {
+		switch (si->type) {
+		case SOCK_STREAM:
+			type = SOCKET_TYPE_CHAR_TCP_V6;
+			break;
+		case SOCK_DGRAM:
+			type = SOCKET_TYPE_CHAR_UDP_V6;
+			break;
+		}
+
+		/* XXX no multicast/broadcast */
+
+		prt = ntohs(in->sin6_port);
+		iface = SW_IPV6_ADDRESS;
+		
+		break;
+	}
+#endif
+	default:
 		errno = ENETUNREACH;
 		return -1;
 	}
 
-	if (bcast) *bcast = is_bcast;
+	if (prt == 0) {
+		errno = EINVAL;
+		return -1;
+	}
 
 	if (is_bcast) {
 		snprintf(un->sun_path, sizeof(un->sun_path), "%s/EINVAL", 
@@ -320,60 +408,96 @@ static int convert_in_un_remote(struct socket_info *si, const struct sockaddr_in
 	return 0;
 }
 
-static int convert_in_un_alloc(struct socket_info *si, const struct sockaddr_in *in, struct sockaddr_un *un,
+static int convert_in_un_alloc(struct socket_info *si, const struct sockaddr *inaddr, struct sockaddr_un *un,
 			       int *bcast)
 {
-	char u_type = '\0';
-	char d_type = '\0';
-	char b_type = '\0';
-	char a_type = '\0';
 	char type = '\0';
-	unsigned int addr= ntohl(in->sin_addr.s_addr);
-	unsigned int prt = ntohs(in->sin_port);
+	unsigned int prt;
 	unsigned int iface;
 	struct stat st;
 	int is_bcast = 0;
 
 	if (bcast) *bcast = 0;
 
-	switch (si->type) {
-	case SOCK_STREAM:
-		u_type = SOCKET_TYPE_CHAR_TCP;
-		d_type = SOCKET_TYPE_CHAR_TCP;
-		break;
-	case SOCK_DGRAM:
-		u_type = SOCKET_TYPE_CHAR_UDP;
-		d_type = SOCKET_TYPE_CHAR_UDP;
-		a_type = SOCKET_TYPE_CHAR_UDP;
-		b_type = SOCKET_TYPE_CHAR_UDP;
+	switch (si->family) {
+	case AF_INET: {
+		const struct sockaddr_in *in = 
+		    (const struct sockaddr_in *)inaddr;
+		unsigned int addr = ntohl(in->sin_addr.s_addr);
+		char u_type = '\0';
+		char d_type = '\0';
+		char b_type = '\0';
+		char a_type = '\0';
+
+		prt = ntohs(in->sin_port);
+
+		switch (si->type) {
+		case SOCK_STREAM:
+			u_type = SOCKET_TYPE_CHAR_TCP;
+			d_type = SOCKET_TYPE_CHAR_TCP;
+			break;
+		case SOCK_DGRAM:
+			u_type = SOCKET_TYPE_CHAR_UDP;
+			d_type = SOCKET_TYPE_CHAR_UDP;
+			a_type = SOCKET_TYPE_CHAR_UDP;
+			b_type = SOCKET_TYPE_CHAR_UDP;
+			break;
+		}
+
+		if (addr == 0) {
+			/* 0.0.0.0 */
+		 	is_bcast = 0;
+			type = d_type;
+			iface = socket_wrapper_default_iface();
+		} else if (a_type && addr == 0xFFFFFFFF) {
+			/* 255.255.255.255 only udp */
+			is_bcast = 2;
+			type = a_type;
+			iface = socket_wrapper_default_iface();
+		} else if (b_type && addr == 0x7FFFFFFF) {
+			/* 127.255.255.255 only udp */
+			is_bcast = 1;
+			type = b_type;
+			iface = socket_wrapper_default_iface();
+		} else if ((addr & 0xFFFFFF00) == 0x7F000000) {
+			/* 127.0.0.X */
+			is_bcast = 0;
+			type = u_type;
+			iface = (addr & 0x000000FF);
+		} else {
+			errno = EADDRNOTAVAIL;
+			return -1;
+		}
 		break;
 	}
+#ifdef HAVE_IPV6
+	case AF_INET6: {
+		const struct sockaddr_in6 *in = 
+		    (const struct sockaddr_in6 *)inaddr;
 
-	if (addr == 0) {
-		/* 0.0.0.0 */
-		is_bcast = 0;
-		type = d_type;
-		iface = socket_wrapper_default_iface();
-	} else if (a_type && addr == 0xFFFFFFFF) {
-		/* 255.255.255.255 only udp */
-		is_bcast = 2;
-		type = a_type;
-		iface = socket_wrapper_default_iface();
-	} else if (b_type && addr == 0x7FFFFFFF) {
-		/* 127.255.255.255 only udp */
-		is_bcast = 1;
-		type = b_type;
-		iface = socket_wrapper_default_iface();
-	} else if ((addr & 0xFFFFFF00) == 0x7F000000) {
-		/* 127.0.0.X */
-		is_bcast = 0;
-		type = u_type;
-		iface = (addr & 0x000000FF);
-	} else {
-		errno = EADDRNOTAVAIL;
+		switch (si->type) {
+		case SOCK_STREAM:
+			type = SOCKET_TYPE_CHAR_TCP_V6;
+			break;
+		case SOCK_DGRAM:
+			type = SOCKET_TYPE_CHAR_UDP_V6;
+			break;
+		}
+
+		/* XXX no multicast/broadcast */
+
+		prt = ntohs(in->sin6_port);
+		iface = SW_IPV6_ADDRESS;
+		


-- 
Samba Shared Repository


More information about the samba-cvs mailing list