diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2012-03-11 23:59:29 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2012-03-11 23:59:29 +0000 |
commit | 7af9f35001af19e2844b3e9fb3c672ee696be17b (patch) | |
tree | cb72deb2c20b9d86f9603890d9665c48f01bbcda /net.c | |
parent | 1ff463d15412de77fcf5b8ca1cf43c63dce1dbe1 (diff) | |
download | strace-7af9f35001af19e2844b3e9fb3c672ee696be17b.tar.gz strace-7af9f35001af19e2844b3e9fb3c672ee696be17b.tar.bz2 strace-7af9f35001af19e2844b3e9fb3c672ee696be17b.tar.xz |
Implement sendmmsg syscall decoder
* linux/dummy.h (sys_sendmmsg): Remove.
* linux/syscall.h (sys_sendmmsg): New prototype.
* net.c (printmmsghdr): Add index argument specifying the element in
mmsghdr array to print.
(decode_mmsg): New function, prints the whole mmsghdr array, its length
and message flags.
(sys_sendmmsg): New function.
(sys_recvmmsg): Use decode_mmsg to fix mmsghdr array decoding.
Diffstat (limited to 'net.c')
-rw-r--r-- | net.c | 53 |
1 files changed, 45 insertions, 8 deletions
@@ -1447,13 +1447,14 @@ printmsghdr(struct tcb *tcp, long addr) } static void -printmmsghdr(struct tcb *tcp, long addr) +printmmsghdr(struct tcb *tcp, long addr, unsigned int idx) { struct mmsghdr { struct msghdr msg_hdr; unsigned msg_len; } mmsg; + addr += sizeof(mmsg) * idx; if (umove(tcp, addr, &mmsg) < 0) { tprintf("%#lx", addr); return; @@ -1463,6 +1464,30 @@ printmmsghdr(struct tcb *tcp, long addr) tprintf(", %u}", mmsg.msg_len); } +static void +decode_mmsg(struct tcb *tcp) +{ + /* mmsgvec */ + if (syserror(tcp)) { + tprintf("%#lx", tcp->u_arg[1]); + } else { + unsigned int len = tcp->u_rval; + unsigned int i; + + tprints("{"); + for (i = 0; i < len; ++i) { + if (i) + tprints(", "); + printmmsghdr(tcp, tcp->u_arg[1], i); + } + tprints("}"); + } + /* vlen */ + tprintf(", %u, ", (unsigned int) tcp->u_arg[2]); + /* flags */ + printflags(msg_flags, tcp->u_arg[3], "MSG_???"); +} + #endif /* HAVE_SENDMSG */ /* @@ -1627,6 +1652,24 @@ sys_sendmsg(struct tcb *tcp) return 0; } +int +sys_sendmmsg(struct tcb *tcp) +{ + if (entering(tcp)) { + /* sockfd */ + tprintf("%d, ", (int) tcp->u_arg[0]); + if (!verbose(tcp)) { + tprintf("%#lx, %u, ", + tcp->u_arg[1], (unsigned int) tcp->u_arg[2]); + printflags(msg_flags, tcp->u_arg[3], "MSG_???"); + } + } else { + if (verbose(tcp)) + decode_mmsg(tcp); + } + return 0; +} + #endif /* HAVE_SENDMSG */ int @@ -1732,13 +1775,7 @@ sys_recvmmsg(struct tcb *tcp) return 0; } else { if (verbose(tcp)) { - if (syserror(tcp)) - tprintf("%#lx", tcp->u_arg[1]); - else - printmmsghdr(tcp, tcp->u_arg[1]); - tprintf(", %ld, ", tcp->u_arg[2]); - /* flags */ - printflags(msg_flags, tcp->u_arg[3], "MSG_???"); + decode_mmsg(tcp); /* timeout on entrance */ tprintf(", %s", tcp->auxstr ? tcp->auxstr : "{...}"); free((void *) tcp->auxstr); |