qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v3 11/13] linux-user/strace: Add print_sockaddr_ptr(


From: Philippe Mathieu-Daudé
Subject: [Qemu-devel] [PATCH v3 11/13] linux-user/strace: Add print_sockaddr_ptr() to handle plain/pointer addrlen
Date: Mon, 2 Jul 2018 14:50:28 -0300

While very similar to send()/recv(), the format used by
sendto()/recvfrom() is slightly different: the 'addrlen'
is not a plain sockaddr_t but a pointer to it.

Split the current function to handle both formats.

Signed-off-by: Philippe Mathieu-Daudé <address@hidden>
Tested-By: Guido Günther <address@hidden>
---
 linux-user/strace.c | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/linux-user/strace.c b/linux-user/strace.c
index 85a1efef32..9ab11059e4 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -68,6 +68,7 @@ UNUSED static void print_timezone(abi_ulong, int);
 UNUSED static void print_number(abi_long, int);
 UNUSED static void print_signal(abi_ulong, int);
 UNUSED static void print_sockaddr(abi_ulong addr, abi_long addrlen, int);
+UNUSED static void print_sockaddr_ptr(abi_ulong addr, abi_long addrlen_ptr, 
int);
 UNUSED static void print_socket_domain(int domain);
 UNUSED static void print_socket_type(int type);
 UNUSED static void print_socket_protocol(int domain, int type, int protocol);
@@ -336,7 +337,8 @@ static void print_siginfo(const target_siginfo_t *tinfo)
 }
 
 static void
-print_sockaddr(abi_ulong addr, abi_long addrlen, int last)
+print_sockaddr_ex(abi_ulong addr, abi_long addrlen,
+                  bool addrlen_is_ptr, int last)
 {
     struct target_sockaddr *sa;
     int i;
@@ -418,7 +420,29 @@ print_sockaddr(abi_ulong addr, abi_long addrlen, int last)
     } else {
         print_raw_param("0x"TARGET_ABI_FMT_lx, addr, 0);
     }
-    gemu_log(", "TARGET_ABI_FMT_ld"%s", addrlen, get_comma(last));
+    gemu_log(", %s"TARGET_ABI_FMT_ld"%s%s",
+             (addrlen_is_ptr ? "[" : ""), addrlen,
+             (addrlen_is_ptr ? "]" : ""), get_comma(last));
+}
+
+static void
+print_sockaddr(abi_ulong addr, abi_long addrlen, int last)
+{
+    print_sockaddr_ex(addr, addrlen, false, last);
+}
+
+static void
+print_sockaddr_ptr(abi_ulong addr, abi_long addrlen_ptr, int last)
+{
+    abi_ulong addrlen;
+
+    if (!addr) {
+        print_sockaddr_ex(0, 0, false, last);
+        return;
+    }
+
+    get_user_ual(addrlen, addrlen_ptr);
+    print_sockaddr_ex(addr, addrlen, true, last);
 }
 
 static void
-- 
2.18.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]