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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> Date: Tue Jun 10 09:21:05 2008 +0200 socket_wrapper: sync missing stuff from v4-0-test metze commit e4e015caac88f6e31ca6d8fcda5a97a11aee226d Author: Jelmer Vernooij <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> Date: Tue Mar 6 23:03:34 2007 +0000 r21729: Some more tests (cherry picked from commit d2baa8218cf504d6631d610f9fd393ad8c61574c) commit 8003f00a28bb7237ec1b1f4eb9687c542a86c2b2 Author: Stefan Metzmacher <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]> + * Copyright (C) Jelmer Vernooij 2005,2008 <[EMAIL PROTECTED]> * Copyright (C) Stefan Metzmacher 2006 <[EMAIL PROTECTED]> * * 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