diff options
-rw-r--r-- | source3/Makefile.in | 29 | ||||
-rw-r--r-- | source3/configure.in | 8 | ||||
-rw-r--r-- | source3/include/includes.h | 2 | ||||
-rw-r--r-- | source3/lib/socket_wrapper/config.m4 | 22 | ||||
-rw-r--r-- | source3/lib/socket_wrapper/socket_wrapper.c (renamed from source3/lib/socket_wrapper.c) | 252 | ||||
-rw-r--r-- | source3/lib/socket_wrapper/socket_wrapper.h (renamed from source3/include/socket_wrapper.h) | 16 |
6 files changed, 229 insertions, 100 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index a73da33eec..8f6d1b3036 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -207,8 +207,6 @@ ERRORMAP_OBJ = libsmb/errormap.o PASSCHANGE_OBJ = libsmb/passchange.o -SOCKET_WRAPPER_OBJ = lib/socket_wrapper.o - LIBNDR_OBJ = librpc/ndr/ndr_basic.o librpc/ndr/ndr.o librpc/ndr/ndr_misc.o \ librpc/ndr/ndr_sec_helper.o librpc/ndr/ndr_string.o librpc/ndr/sid.o @@ -221,10 +219,12 @@ RPC_PARSE_OBJ0 = rpc_parse/parse_prs.o rpc_parse/parse_misc.o TALLOC_OBJ = lib/talloc.o -LIB_OBJ = $(VERSION_OBJ) lib/charcnv.o lib/debug.o lib/fault.o \ - lib/getsmbpass.o lib/interface.o lib/md4.o \ - lib/interfaces.o lib/pidfile.o lib/replace.o lib/replace1.o lib/repdir.o lib/timegm.o \ - lib/signal.o lib/system.o lib/sendfile.o lib/time.o \ +LIB_WITHOUT_PROTO_OBJ = @SOCKET_WRAPPER_OBJS@ + +LIB_WITH_PROTO_OBJ = $(VERSION_OBJ) lib/charcnv.o lib/debug.o lib/fault.o \ + lib/getsmbpass.o lib/interface.o lib/md4.o \ + lib/interfaces.o lib/pidfile.o lib/replace.o lib/replace1.o lib/repdir.o lib/timegm.o \ + lib/signal.o lib/system.o lib/sendfile.o lib/time.o \ lib/ufc.o lib/genrand.o lib/username.o \ lib/util_pw.o lib/access.o lib/smbrun.o \ lib/bitmap.o lib/crc32.o $(SNPRINTF_OBJ) lib/dprintf.o \ @@ -240,9 +240,11 @@ LIB_OBJ = $(VERSION_OBJ) lib/charcnv.o lib/debug.o lib/fault.o \ lib/pam_errors.o intl/lang_tdb.o \ lib/adt_tree.o lib/gencache.o $(TDB_OBJ) \ lib/module.o lib/events.o lib/ldap_escape.o @CHARSET_STATIC@ \ - lib/secdesc.o lib/util_seaccess.o lib/secace.o lib/secacl.o @SOCKWRAP@ \ + lib/secdesc.o lib/util_seaccess.o lib/secace.o lib/secacl.o \ libads/krb5_errs.o lib/system_smbd.o lib/audit.o $(TALLOC_OBJ) +LIB_OBJ = $(LIB_WITHOUT_PROTO_OBJ) $(LIB_WITH_PROTO_OBJ) + LIB_DUMMY_OBJ = lib/dummysmbd.o lib/dummyroot.o LIB_NONSMBD_OBJ = $(LIB_OBJ) $(LIB_DUMMY_OBJ) @@ -621,9 +623,9 @@ CUPS_OBJ = client/smbspool.o $(PARAM_OBJ) $(LIBSMB_OBJ) \ MOUNT_OBJ = client/smbmount.o \ $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) $(LIB_NONSMBD_OBJ) $(SECRETS_OBJ) -MNT_OBJ = client/smbmnt.o lib/replace.o lib/timegm.o $(VERSION_OBJ) $(SNPRINTF_OBJ) @SOCKWRAP@ +MNT_OBJ = client/smbmnt.o lib/replace.o lib/timegm.o $(VERSION_OBJ) $(SNPRINTF_OBJ) @SOCKET_WRAPPER_OBJS@ -UMOUNT_OBJ = client/smbumount.o @SOCKWRAP@ +UMOUNT_OBJ = client/smbumount.o @SOCKET_WRAPPER_OBJS@ CIFS_MOUNT_OBJ = client/mount.cifs.o @@ -707,9 +709,10 @@ SMBFILTER_OBJ = utils/smbfilter.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(SECRETS_OBJ) \ $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) PROTO_OBJ = $(SMBD_OBJ_MAIN) $(LIBNDR_OBJ) $(LIBNDR_GEN_OBJ) \ - $(SMBD_OBJ_SRV) $(NMBD_OBJ1) $(SWAT_OBJ1) $(LIB_OBJ) $(LIBSMB_OBJ) \ + $(SMBD_OBJ_SRV) $(NMBD_OBJ1) $(SWAT_OBJ1) $(LIBSMB_OBJ) \ $(SMBTORTURE_OBJ1) $(RPCCLIENT_OBJ1) \ $(LIBMSRPC_OBJ) @SMBWRAP_OBJS@ \ + $(LIB_WITH_PROTO_OBJ) \ $(RPC_PIPE_OBJ) $(RPC_PARSE_OBJ) $(KRBCLIENT_OBJ) \ $(AUTH_OBJ) $(PARAM_OBJ) $(LOCKING_OBJ) $(SECRETS_OBJ) \ $(PRINTING_OBJ) $(PRINTBACKEND_OBJ) $(OPLOCK_OBJ) $(NOTIFY_OBJ) \ @@ -1485,15 +1488,15 @@ bin/pam_smbpass.@SHLIBEXT@: $(PAM_SMBPASS_PICOOBJ) bin/tdbbackup@EXEEXT@: $(TDBBACKUP_OBJ) bin/.dummy @echo Linking $@ - @$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(LDFLAGS) $(DYNEXP) $(LIBS) $(TDBBACKUP_OBJ) @SOCKWRAP@ + @$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(LDFLAGS) $(DYNEXP) $(LIBS) $(TDBBACKUP_OBJ) @SOCKET_WRAPPER_OBJS@ bin/tdbtool@EXEEXT@: $(TDBTOOL_OBJ) bin/.dummy @echo Linking $@ - @$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(LDFLAGS) $(DYNEXP) $(LIBS) $(TDBTOOL_OBJ) @SOCKWRAP@ + @$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(LDFLAGS) $(DYNEXP) $(LIBS) $(TDBTOOL_OBJ) @SOCKET_WRAPPER_OBJS@ bin/tdbdump@EXEEXT@: $(TDBDUMP_OBJ) bin/.dummy @echo Linking $@ - @$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(LDFLAGS) $(DYNEXP) $(LIBS) $(TDBDUMP_OBJ) @SOCKWRAP@ + @$(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(LDFLAGS) $(DYNEXP) $(LIBS) $(TDBDUMP_OBJ) @SOCKET_WRAPPER_OBJS@ bin/t_strcmp@EXEEXT@: bin/libbigballofmud.@SHLIBEXT@ torture/t_strcmp.o $(CC) $(FLAGS) @PIE_LDFLAGS@ -o $@ $(DYNEXP) $(LIBS) torture/t_strcmp.o -L ./bin -lbigballofmud diff --git a/source3/configure.in b/source3/configure.in index 4f8e3329b9..381ad4e3a6 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -334,13 +334,7 @@ AC_ARG_ENABLE(debug, CFLAGS="${CFLAGS} -g" fi]) -AC_SUBST(SOCKWRAP) -AC_ARG_ENABLE(socket-wrapper, -[ --enable-socket-wrapper Turn on socket wrapper library (default=no)], - [if eval "test x$enable_socket_wrapper = xyes"; then - AC_DEFINE(SOCKET_WRAPPER,1,[Use socket wrapper library]) - SOCKWRAP="\$(SOCKET_WRAPPER_OBJ)" - fi]) +m4_include(lib/socket_wrapper/config.m4) ################################################# # set prefix for 'make test' diff --git a/source3/include/includes.h b/source3/include/includes.h index 3cca090bb9..1effa69f9a 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -941,7 +941,7 @@ extern int errno; #ifdef SOCKET_WRAPPER #define SOCKET_WRAPPER_REPLACE -#include "include/socket_wrapper.h" +#include "lib/socket_wrapper/socket_wrapper.h" #endif /* Our own pstrings and fstrings */ diff --git a/source3/lib/socket_wrapper/config.m4 b/source3/lib/socket_wrapper/config.m4 new file mode 100644 index 0000000000..42212abc7f --- /dev/null +++ b/source3/lib/socket_wrapper/config.m4 @@ -0,0 +1,22 @@ +AC_ARG_ENABLE(socket-wrapper, +[ --enable-socket-wrapper Turn on socket wrapper library (default=no)]) + +DEFAULT_TEST_TARGET=test-noswrap +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 + 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(HAVE_SOCKET_WRAPPER) +AC_SUBST(SOCKET_WRAPPER_OBJS) diff --git a/source3/lib/socket_wrapper.c b/source3/lib/socket_wrapper/socket_wrapper.c index 04c337267f..af774e1927 100644 --- a/source3/lib/socket_wrapper.c +++ b/source3/lib/socket_wrapper/socket_wrapper.c @@ -3,6 +3,7 @@ unix domain sockets if the environment variable SOCKET_WRAPPER_DIR is set. Copyright (C) Jelmer Vernooij 2005 + Copyright (C) Stefan Metzmacher 2006 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,25 +20,44 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifdef _SAMBA_BUILD_ + +#define SOCKET_WRAPPER_NOT_REPLACE #include "includes.h" +/* +#include "system/network.h" +#include "system/filesys.h" +*/ +#ifndef _DLINKLIST_H +#include "lib/util/dlinklist.h" +#endif -#ifdef _PUBLIC_ -#undef _PUBLIC_ +#ifdef malloc +#undef malloc #endif -#define _PUBLIC_ - -#ifdef SOCKET_WRAPPER_REPLACE -#undef accept -#undef connect -#undef bind -#undef getpeername -#undef getsockname -#undef getsockopt -#undef setsockopt -#undef recvfrom -#undef sendto -#undef socket -#undef close +#ifdef calloc +#undef calloc +#endif +#ifdef strdup +#undef strdup +#endif + +#else /* _SAMBA_BUILD_ */ + +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <errno.h> +#include <sys/un.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <stdio.h> + +#error "dlinklist.h missing" + #endif /* LD_PRELOAD doesn't work yet, so REWRITE_CALLS is all we support @@ -54,13 +74,12 @@ #define real_setsockopt setsockopt #define real_recvfrom recvfrom #define real_sendto sendto +#define real_recv recv +#define real_send send #define real_socket socket #define real_close close #endif -#undef malloc -#undef calloc -#undef strdup /* we need to use a very terse format here as IRIX 6.4 silently truncates names to 16 chars, so if we use a longer name then we can't tell which port a packet came from with recvfrom() @@ -82,7 +101,7 @@ struct socket_info { int fd; - int domain; + int family; int type; int protocol; int bound; @@ -100,7 +119,7 @@ struct socket_info struct socket_info *prev, *next; }; -static struct socket_info *sockets = NULL; +static struct socket_info *sockets; static const char *socket_wrapper_dir(void) @@ -115,6 +134,23 @@ static const char *socket_wrapper_dir(void) return s; } +static const char *socket_wrapper_dump_dir(void) +{ + const char *s = getenv("SOCKET_WRAPPER_DUMP_DIR"); + + if (!socket_wrapper_dir()) { + return NULL; + } + + if (s == NULL) { + return NULL; + } + if (strncmp(s, "./", 2) == 0) { + s += 2; + } + return s; +} + static unsigned int socket_wrapper_default_iface(void) { const char *s = getenv("SOCKET_WRAPPER_DEFAULT_IFACE"); @@ -346,9 +382,6 @@ static int sockaddr_convert_to_un(struct socket_info *si, const struct sockaddr } else { return convert_in_un_remote(si, (const struct sockaddr_in *)in_addr, out_addr, bcast); } - case AF_UNIX: - memcpy(out_addr, in_addr, sizeof(*out_addr)); - return 0; default: break; } @@ -390,10 +423,6 @@ static int sockaddr_convert_from_un(const struct socket_info *si, return -1; } return convert_un_in(in_addr, (struct sockaddr_in *)out_addr, _out_addrlen); - case AF_UNIX: - memcpy(out_addr, in_addr, out_addrlen); - *_out_addrlen = out_addrlen; - return 0; default: break; } @@ -402,26 +431,52 @@ static int sockaddr_convert_from_un(const struct socket_info *si, return -1; } -_PUBLIC_ int swrap_socket(int domain, int type, int protocol) +enum swrap_packet_type { + SWRAP_CONNECT, + SWRAP_ACCEPT, + SWRAP_RECVFROM, + SWRAP_SENDTO, + SWRAP_RECV, + SWRAP_SEND, + SWRAP_CLOSE +}; + +static void swrap_dump_packet(struct socket_info *si, const struct sockaddr *addr, + enum swrap_packet_type type, + const void *buf, size_t len, ssize_t ret) +{ + if (!socket_wrapper_dump_dir()) { + return; + } + +} + +_PUBLIC_ int swrap_socket(int family, int type, int protocol) { struct socket_info *si; int fd; if (!socket_wrapper_dir()) { - return real_socket(domain, type, protocol); + return real_socket(family, type, protocol); } - - si = (struct socket_info *)calloc(1, sizeof(struct socket_info)); - if (si == NULL) { - errno = ENOMEM; + + switch (family) { + case AF_INET: + break; + case AF_UNIX: + return real_socket(family, type, protocol); + default: + errno = EAFNOSUPPORT; return -1; } - + fd = real_socket(AF_UNIX, type, 0); if (fd == -1) return -1; - si->domain = domain; + si = calloc(1, sizeof(struct socket_info)); + + si->family = family; si->type = type; si->protocol = protocol; si->fd = fd; @@ -458,29 +513,35 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen) fd = ret; ret = sockaddr_convert_from_un(parent_si, &un_addr, un_addrlen, - parent_si->domain, addr, addrlen); - if (ret == -1) return ret; - - child_si = (struct socket_info *)malloc(sizeof(struct socket_info)); - if (child_si == NULL) { + parent_si->family, addr, addrlen); + if (ret == -1) { close(fd); - errno = ENOMEM; - return -1; + return ret; } + + child_si = malloc(sizeof(struct socket_info)); memset(child_si, 0, sizeof(*child_si)); child_si->fd = fd; - child_si->domain = parent_si->domain; + child_si->family = parent_si->family; child_si->type = parent_si->type; child_si->protocol = parent_si->protocol; child_si->bound = 1; ret = real_getsockname(fd, (struct sockaddr *)&un_my_addr, &un_my_addrlen); - if (ret == -1) return ret; + if (ret == -1) { + free(child_si); + close(fd); + return ret; + } ret = sockaddr_convert_from_un(child_si, &un_my_addr, un_my_addrlen, - child_si->domain, &my_addr, &my_addrlen); - if (ret == -1) return ret; + child_si->family, &my_addr, &my_addrlen); + if (ret == -1) { + free(child_si); + close(fd); + return ret; + } child_si->myname_len = my_addrlen; child_si->myname = sockaddr_dup(&my_addr, my_addrlen); @@ -490,6 +551,8 @@ _PUBLIC_ int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen) DLIST_ADD(sockets, child_si); + swrap_dump_packet(child_si, addr, SWRAP_ACCEPT, NULL, 0, 0); + return fd; } @@ -504,6 +567,7 @@ static int swrap_auto_bind(struct socket_info *si) int i; char type; int ret; + int port; struct stat st; un_addr.sun_family = AF_UNIX; @@ -521,9 +585,10 @@ static int swrap_auto_bind(struct socket_info *si) } for (i=0;i<1000;i++) { + port = 10000 + i; snprintf(un_addr.sun_path, sizeof(un_addr.sun_path), "%s/"SOCKET_FORMAT, socket_wrapper_dir(), - type, socket_wrapper_default_iface(), i + 10000); + type, socket_wrapper_default_iface(), port); if (stat(un_addr.sun_path, &st) == 0) continue; ret = real_bind(si->fd, (struct sockaddr *)&un_addr, sizeof(un_addr)); @@ -540,7 +605,7 @@ static int swrap_auto_bind(struct socket_info *si) memset(&in, 0, sizeof(in)); in.sin_family = AF_INET; - in.sin_port = htons(i); + in.sin_port = htons(port); in.sin_addr.s_addr = htonl(127<<24 | socket_wrapper_default_iface()); si->myname_len = sizeof(in); @@ -560,7 +625,7 @@ _PUBLIC_ int swrap_connect(int s, const struct sockaddr *serv_addr, socklen_t ad return real_connect(s, serv_addr, addrlen); } - if (si->bound == 0 && si->domain != AF_UNIX) { + if (si->bound == 0) { ret = swrap_auto_bind(si); if (ret == -1) return -1; } @@ -572,10 +637,8 @@ _PUBLIC_ int swrap_connect(int s, const struct sockaddr *serv_addr, socklen_t ad sizeof(struct sockaddr_un)); /* to give better errors */ - if (serv_addr->sa_family == AF_INET) { - if (ret == -1 && errno == ENOENT) { - errno = EHOSTUNREACH; - } + if (ret == -1 && errno == ENOENT) { + errno = EHOSTUNREACH; } if (ret == 0) { @@ -583,6 +646,8 @@ _PUBLIC_ int swrap_connect(int s, const struct sockaddr *serv_addr, socklen_t ad si->peername = sockaddr_dup(serv_addr, addrlen); } + swrap_dump_packet(si, serv_addr, SWRAP_CONNECT, NULL, 0, ret); + return ret; } @@ -660,13 +725,8 @@ _PUBLIC_ int swrap_getsockopt(int s, int level, int optname, void *optval, sockl return real_getsockopt(s, level, optname, optval, optlen); } - switch (si->domain) { - case AF_UNIX: - return real_getsockopt(s, level, optname, optval, optlen); - default: - errno = ENOPROTOOPT; - return -1; - } + errno = ENOPROTOOPT; + return -1; } _PUBLIC_ int swrap_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) @@ -681,15 +741,9 @@ _PUBLIC_ int swrap_setsockopt(int s, int level, int optname, const void *o return real_setsockopt(s, level, optname, optval, optlen); } - switch (si->domain) { - case AF_UNIX: - return real_setsockopt(s, level, optname, optval, optlen); + switch (si->family) { case AF_INET: - /* Silence some warnings */ -#ifdef TCP_NODELAY - if (optname == TCP_NODELAY) - return 0; -#endif + return 0; default: errno = ENOPROTOOPT; return -1; @@ -714,15 +768,17 @@ _PUBLIC_ ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags, struct return ret; if (sockaddr_convert_from_un(si, &un_addr, un_addrlen, - si->domain, from, fromlen) == -1) { + si->family, from, fromlen) == -1) { return -1; } - + + swrap_dump_packet(si, from, SWRAP_RECVFROM, buf, len, ret); + return ret; } -_PUBLIC_ ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) +_PUBLIC_ ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) { struct sockaddr_un un_addr; int ret; @@ -733,7 +789,7 @@ _PUBLIC_ ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags, return real_sendto(s, buf, len, flags, to, tolen); } - if (si->bound == 0 && si->domain != AF_UNIX) { + if (si->bound == 0) { ret = swrap_auto_bind(si); if (ret == -1) return -1; } @@ -757,18 +813,58 @@ _PUBLIC_ ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags, /* ignore the any errors in broadcast sends */ real_sendto(s, buf, len, flags, (struct sockaddr *)&un_addr, sizeof(un_addr)); } + + swrap_dump_packet(si, to, SWRAP_SENDTO, buf, len, len); + return len; } ret = real_sendto(s, buf, len, flags, (struct sockaddr *)&un_addr, sizeof(un_addr)); /* to give better errors */ - if (to->sa_family == AF_INET) { - if (ret == -1 && errno == ENOENT) { - errno = EHOSTUNREACH; - } + if (ret == -1 && errno == ENOENT) { + errno = EHOSTUNREACH; + } + + swrap_dump_packet(si, to, SWRAP_SENDTO, buf, len, ret); + + return ret; +} + +_PUBLIC_ ssize_t swrap_recv(int s, void *buf, size_t len, int flags) +{ + int ret; + struct socket_info *si = find_socket_info(s); + + if (!si) { + return real_recv(s, buf, len, flags); } + ret = real_recv(s, buf, len, flags); + if (ret == -1) + return ret; + + swrap_dump_packet(si, NULL, SWRAP_RECV, buf, len, ret); + + return ret; +} + + +_PUBLIC_ ssize_t swrap_send(int s, const void *buf, size_t len, int flags) +{ + int ret; + struct socket_info *si = find_socket_info(s); + + if (!si) { + return real_send(s, buf, len, flags); + } + + ret = real_send(s, buf, len, flags); + if (ret == -1) + return ret; + + swrap_dump_packet(si, NULL, SWRAP_SEND, buf, len, ret); + return ret; } @@ -779,6 +875,8 @@ _PUBLIC_ int swrap_close(int fd) if (si) { DLIST_REMOVE(sockets, si); + swrap_dump_packet(si, NULL, SWRAP_CLOSE, NULL, 0, 0); + free(si->path); free(si->myname); free(si->peername); diff --git a/source3/include/socket_wrapper.h b/source3/lib/socket_wrapper/socket_wrapper.h index 3c4a2c01dc..23a261faaf 100644 --- a/source3/include/socket_wrapper.h +++ b/source3/lib/socket_wrapper/socket_wrapper.h @@ -19,7 +19,7 @@ #ifndef __SOCKET_WRAPPER_H__ #define __SOCKET_WRAPPER_H__ -int swrap_socket(int domain, int type, int protocol); +int swrap_socket(int family, int type, int protocol); int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen); int swrap_connect(int s, const struct sockaddr *serv_addr, socklen_t addrlen); int swrap_bind(int s, const struct sockaddr *myaddr, socklen_t addrlen); @@ -28,7 +28,9 @@ int swrap_getsockname(int s, struct sockaddr *name, socklen_t *addrlen); int swrap_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); int swrap_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); -ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); +ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); +ssize_t swrap_recv(int s, void *buf, size_t len, int flags); +ssize_t swrap_send(int s, const void *buf, size_t len, int flags); int swrap_close(int); #ifdef SOCKET_WRAPPER_REPLACE @@ -78,6 +80,16 @@ int swrap_close(int); #endif #define sendto(s,buf,len,flags,to,tolen) swrap_sendto(s,buf,len,flags,to,tolen) +#ifdef recv +#undef recv +#endif +#define recv(s,buf,len,flags) swrap_recv(s,buf,len,flags) + +#ifdef send +#undef send +#endif +#define send(s,buf,len,flags) swrap_send(s,buf,len,flags) + #ifdef socket #undef socket #endif |