]> granicus.if.org Git - strace/commitdiff
Print unsent messages of sendmmsg syscall
authorDmitry V. Levin <ldv@altlinux.org>
Mon, 18 Jul 2016 16:25:25 +0000 (16:25 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 19 Jul 2016 17:46:33 +0000 (17:46 +0000)
* defs.h (decode_mmsgvec): Add int argument.
* mmsghdr.c (print_struct_mmsghdr_config): Add msg_len_vlen field.
(print_struct_mmsghdr): Print struct mmsghdr.msg_len only for
msg_len_vlen first elements of struct mmsghdr array.
(decode_mmsgvec): Add msg_len_vlen argument.
(SYS_FUNC(sendmmsg), SYS_FUNC(recvmmsg)): Pass to decode_mmsgvec
the number of elements of struct mmsghdr array that contain meaningful
struct mmsghdr.msg_len.
* tests/mmsg_name.c (test_mmsg_name): Check it.

mmsghdr.c
tests/mmsg_name.c

index 9ef0f08087634ff893856f4fe3c542f9c4f05bab..d310a767a9118bed824c3ebe8734674ae28dc451 100644 (file)
--- a/mmsghdr.c
+++ b/mmsghdr.c
@@ -47,6 +47,7 @@ fetch_struct_mmsghdr_or_printaddr(struct tcb *tcp, const long addr,
 
 struct print_struct_mmsghdr_config {
        const int *p_user_msg_namelen;
+       unsigned int msg_len_vlen;
        unsigned int count;
        bool use_msg_len;
 };
@@ -67,7 +68,11 @@ print_struct_mmsghdr(struct tcb *tcp, void *elem_buf,
        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);
+       if (c->msg_len_vlen) {
+               tprintf(", msg_len=%u", mmsg->msg_len);
+               --c->msg_len_vlen;
+       }
+       tprints("}");
 
        if (c->p_user_msg_namelen)
                ++c->p_user_msg_namelen;
@@ -120,10 +125,12 @@ save_mmsgvec_namelen(struct tcb *tcp, unsigned long addr,
 
 static void
 decode_mmsgvec(struct tcb *tcp, const unsigned long addr,
-              const unsigned int len, const bool use_msg_len)
+              const unsigned int vlen, const unsigned int msg_len_vlen,
+              const bool use_msg_len)
 {
        struct mmsghdr mmsg;
        struct print_struct_mmsghdr_config c = {
+               .msg_len_vlen = msg_len_vlen,
                .count = IOV_MAX,
                .use_msg_len = use_msg_len
        };
@@ -135,7 +142,7 @@ decode_mmsgvec(struct tcb *tcp, const unsigned long addr,
                c.p_user_msg_namelen = data->namelen;
        }
 
-       print_array(tcp, addr, len, &mmsg, sizeof_struct_mmsghdr(),
+       print_array(tcp, addr, vlen, &mmsg, sizeof_struct_mmsghdr(),
                    fetch_struct_mmsghdr_or_printaddr,
                    print_struct_mmsghdr, &c);
 }
@@ -173,7 +180,8 @@ SYS_FUNC(sendmmsg)
                        return RVAL_DECODED;
                }
        } else {
-               decode_mmsgvec(tcp, tcp->u_arg[1], tcp->u_rval, false);
+               decode_mmsgvec(tcp, tcp->u_arg[1], tcp->u_arg[2],
+                              tcp->u_rval, false);
                /* vlen */
                tprintf(", %u, ", (unsigned int) tcp->u_arg[2]);
                /* flags */
@@ -202,7 +210,8 @@ SYS_FUNC(recvmmsg)
                return 0;
        } else {
                if (verbose(tcp)) {
-                       decode_mmsgvec(tcp, tcp->u_arg[1], tcp->u_rval, true);
+                       decode_mmsgvec(tcp, tcp->u_arg[1], tcp->u_rval,
+                                      tcp->u_rval, true);
                        /* vlen */
                        tprintf(", %u, ", (unsigned int) tcp->u_arg[2]);
                        /* flags */
index e90cafdb086b4e527e076e1763c887e72ede9b24..466b602db9e255ad5804038a17f2ee46ede7b787 100644 (file)
@@ -104,19 +104,22 @@ test_mmsg_name(const int send_fd, const int recv_fd)
                perror_msg_and_skip("sendmmsg");
 
        printf("sendmmsg(%d, [", send_fd);
-       for (i = 0; i < rc; ++i) {
+       for (i = 0; i < IOV_MAX1; ++i) {
                if (i)
                        printf(", ");
+               if (i >= IOV_MAX
 #ifndef VERBOSE_MMSGHDR
-               if (i >= DEFAULT_STRLEN) {
+                       || i >= DEFAULT_STRLEN
+#endif
+                  ) {
                        printf("...");
                        break;
                }
-#endif
                printf("{msg_hdr={msg_name=NULL, msg_namelen=0"
                       ", msg_iov=[{iov_base=\"%c\", iov_len=1}]"
-                      ", msg_iovlen=1, msg_controllen=0, msg_flags=0}"
-                      ", msg_len=1}", '0' + i % 10);
+                      ", msg_iovlen=1, msg_controllen=0, msg_flags=0}%s}",
+                      '0' + i % 10,
+                      i < rc ? ", msg_len=1" : "");
        }
        printf("], %u, MSG_DONTWAIT) = %d\n", IOV_MAX1, rc);