]> granicus.if.org Git - strace/commitdiff
mmsghdr.c: rewrite decode_mmsgvec using print_array
authorDmitry V. Levin <ldv@altlinux.org>
Sat, 16 Jul 2016 22:04:24 +0000 (22:04 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 19 Jul 2016 17:46:32 +0000 (17:46 +0000)
* fetch_struct_mmsghdr.c (sizeof_struct_mmsghdr): New mpers printer.
* mmsghdr.c: Include <limits.h>.
(print_struct_mmsghdr_config): New structure.
(fetch_struct_mmsghdr_or_printaddr, print_struct_mmsghdr): New functions.
(decode_mmsgvec): Rewrite using them and print_array.

fetch_struct_mmsghdr.c
mmsghdr.c

index 932de69b22d53d6ebd0cd4708875c0772236f116..87d52c6c50cbc9d2e83c8055624c2c40e6121be4 100644 (file)
@@ -80,3 +80,8 @@ MPERS_PRINTER_DECL(int, fetch_struct_mmsghdr,
 
        return sizeof(v_compat);
 }
+
+MPERS_PRINTER_DECL(unsigned int, sizeof_struct_mmsghdr, void)
+{
+       return sizeof(struct_mmsghdr);
+}
index 35dfd792599ef72b6cf7b55afdceab899adfc33d..2364fef2638521eab17a4076fa0f346ea9b0c595 100644 (file)
--- a/mmsghdr.c
+++ b/mmsghdr.c
 
 #include "defs.h"
 #include "msghdr.h"
+#include <limits.h>
 
 static int
-decode_mmsghdr(struct tcb *tcp, const int *const p_user_msg_namelen,
-              const long addr, const bool use_msg_len)
+fetch_struct_mmsghdr_or_printaddr(struct tcb *tcp, const long addr,
+                                 const unsigned int len, void *const mh)
 {
-       struct mmsghdr mmsg;
-       int fetched = fetch_struct_mmsghdr(tcp, addr, &mmsg);
-
-       if (fetched) {
-               tprints("{msg_hdr=");
-               print_struct_msghdr(tcp, &mmsg.msg_hdr, p_user_msg_namelen,
-                                   use_msg_len ? mmsg.msg_len : -1UL);
-               tprintf(", msg_len=%u}", mmsg.msg_len);
+       if ((entering(tcp) || !syserror(tcp))
+           && fetch_struct_mmsghdr(tcp, addr, mh)) {
+               return 0;
        } else {
                printaddr(addr);
+               return -1;
        }
+}
 
-       return fetched;
+struct print_struct_mmsghdr_config {
+       const int *p_user_msg_namelen;
+       unsigned int count;
+       bool use_msg_len;
+};
+
+static bool
+print_struct_mmsghdr(struct tcb *tcp, void *elem_buf,
+                    size_t elem_size, void *data)
+{
+       const struct mmsghdr *const mmsg = elem_buf;
+       struct print_struct_mmsghdr_config *const c = data;
+
+       if (!c->count) {
+               tprints("...");
+               return false;
+       }
+       --c->count;
+
+       tprints("{msg_hdr=");
+       print_struct_msghdr(tcp, &mmsg->msg_hdr, c->p_user_msg_namelen,
+                           c->use_msg_len ? mmsg->msg_len : -1UL);
+       tprintf(", msg_len=%u}", mmsg->msg_len);
+
+       return true;
 }
 
 static void
-decode_mmsgvec(struct tcb *tcp, unsigned long addr, unsigned int len,
-              bool use_msg_len)
+decode_mmsgvec(struct tcb *tcp, const unsigned long addr,
+              const unsigned int len, const bool use_msg_len)
 {
-       if (syserror(tcp)) {
-               printaddr(addr);
-       } else {
-               unsigned int i, fetched;
+       struct mmsghdr mmsg;
+       struct print_struct_mmsghdr_config c = {
+               .count = IOV_MAX,
+               .use_msg_len = use_msg_len
+       };
 
-               tprints("[");
-               for (i = 0; i < len; ++i, addr += fetched) {
-                       if (i)
-                               tprints(", ");
-                       fetched = decode_mmsghdr(tcp, 0, addr, use_msg_len);
-                       if (!fetched)
-                               break;
-               }
-               tprints("]");
-       }
+       print_array(tcp, addr, len, &mmsg, sizeof_struct_mmsghdr(),
+                   fetch_struct_mmsghdr_or_printaddr,
+                   print_struct_mmsghdr, &c);
 }
 
 void