r18417: overload send() and recv() by socket wrapper
authorStefan Metzmacher <metze@samba.org>
Tue, 12 Sep 2006 06:19:11 +0000 (06:19 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:18:26 +0000 (14:18 -0500)
and add a dummy swrap_dump_packet() function
which can later dump the packet content,
so that a script can then generate a capture file
for wireshark

metze
(This used to be commit d05cab5c626b5960448f206e8c17b89edbf78733)

source4/lib/socket_wrapper/socket_wrapper.c
source4/lib/socket_wrapper/socket_wrapper.h

index 702b192aff3884c3d8d77806b044a80769d05ea5..5ba1624af67254e6c73e6fee5996cc58dfec8056 100644 (file)
@@ -53,6 +53,8 @@
 #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
@@ -398,6 +400,20 @@ static int sockaddr_convert_from_un(const struct socket_info *si,
        return -1;
 }
 
+enum swrap_packet_type {
+       SWRAP_RECVFROM,
+       SWRAP_SENDTO,
+       SWRAP_RECV,
+       SWRAP_SEND
+};
+
+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)
+{
+
+}
+
 _PUBLIC_ int swrap_socket(int domain, int type, int protocol)
 {
        struct socket_info *si;
@@ -700,12 +716,14 @@ _PUBLIC_ ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags, struct
                                     si->domain, 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;
@@ -740,6 +758,9 @@ _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;
        }
 
@@ -752,6 +773,45 @@ _PUBLIC_ ssize_t swrap_sendto(int  s,  const  void *buf, size_t len, int flags,
                }
        }
 
+       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;
 }
 
index 3c4a2c01dc97429cc6adb4eb3bfd87408d7ea788..b4cdcbbe32c1981e8629cdcdef9ac9adc830dde7 100644 (file)
@@ -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