[PATCH 1/4] Introduce a separate function to copy from msghdr32 to msghdr

Masatake YAMATO yamato at redhat.com
Thu Nov 6 16:23:24 UTC 2014


This patch is an initial step for supporting "-e write=all" and
"-e read=all" option for sendmmsg and recvmmsg system calls.

Coverting a data of msghdr32 to msghdr is needed both
{send,recv}msg and {send,recv}mmsg to decode parameters.
To share the copying code in both decoders, a separate
function named `copy_from_msghdr32' is introduced.

* net.c (copy_from_msghdr32): New function.

  (extractmsghdr): calls copy_from_msghdr32.

Signed-off-by: Masatake YAMATO <yamato at redhat.com>
---
 net.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/net.c b/net.c
index a0e90a8..193705d 100644
--- a/net.c
+++ b/net.c
@@ -392,6 +392,20 @@ struct mmsghdr32 {
 	uint32_t /* unsigned */ msg_len;
 };
 
+#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
+static void
+copy_from_msghdr32(struct msghdr *to_msg, struct msghdr32 *from_msg32)
+{
+	to_msg->msg_name       = (void*)(long)from_msg32->msg_name;
+	to_msg->msg_namelen    =              from_msg32->msg_namelen;
+	to_msg->msg_iov        = (void*)(long)from_msg32->msg_iov;
+	to_msg->msg_iovlen     =              from_msg32->msg_iovlen;
+	to_msg->msg_control    = (void*)(long)from_msg32->msg_control;
+	to_msg->msg_controllen =              from_msg32->msg_controllen;
+	to_msg->msg_flags      =              from_msg32->msg_flags;
+}
+#endif
+
 static bool
 extractmsghdr(struct tcb *tcp, long addr, struct msghdr *msg)
 {
@@ -401,13 +415,7 @@ extractmsghdr(struct tcb *tcp, long addr, struct msghdr *msg)
 
 		if (umove(tcp, addr, &msg32) < 0)
 			return false;
-		msg->msg_name       = (void*)(long)msg32.msg_name;
-		msg->msg_namelen    =              msg32.msg_namelen;
-		msg->msg_iov        = (void*)(long)msg32.msg_iov;
-		msg->msg_iovlen     =              msg32.msg_iovlen;
-		msg->msg_control    = (void*)(long)msg32.msg_control;
-		msg->msg_controllen =              msg32.msg_controllen;
-		msg->msg_flags      =              msg32.msg_flags;
+		copy_from_msghdr32(msg, &msg32);
 	} else
 #endif
 	if (umove(tcp, addr, msg) < 0)
-- 
1.9.3





More information about the Strace-devel mailing list