From: Dmitry V. Levin Date: Mon, 18 Jul 2016 16:25:25 +0000 (+0000) Subject: Print unsent messages of sendmmsg syscall X-Git-Tag: v4.13~25 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3a161d19021710dd8c746655c45eb97aeba93051;p=strace Print unsent messages of sendmmsg syscall * 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. --- diff --git a/mmsghdr.c b/mmsghdr.c index 9ef0f080..d310a767 100644 --- 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 */ diff --git a/tests/mmsg_name.c b/tests/mmsg_name.c index e90cafdb..466b602d 100644 --- a/tests/mmsg_name.c +++ b/tests/mmsg_name.c @@ -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);