From: Dmitry V. Levin Date: Sun, 11 Mar 2012 23:59:29 +0000 (+0000) Subject: Implement sendmmsg syscall decoder X-Git-Tag: v4.7~119 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7af9f35001af19e2844b3e9fb3c672ee696be17b;p=strace 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. --- diff --git a/linux/dummy.h b/linux/dummy.h index 88e3ba99..f22a8d32 100644 --- a/linux/dummy.h +++ b/linux/dummy.h @@ -45,7 +45,6 @@ #define sys_prlimit64 printargs #define sys_request_key printargs #define sys_rt_tgsigqueueinfo printargs -#define sys_sendmmsg printargs #define sys_sync_file_range printargs #define sys_sysfs printargs #define sys_syslog printargs diff --git a/linux/syscall.h b/linux/syscall.h index f5b0ef6a..18039703 100644 --- a/linux/syscall.h +++ b/linux/syscall.h @@ -220,6 +220,7 @@ int sys_semtimedop(); int sys_send(); int sys_sendfile(); int sys_sendfile64(); +int sys_sendmmsg(); int sys_sendmsg(); int sys_sendto(); int sys_set_mempolicy(); diff --git a/net.c b/net.c index 266d9c17..e7c7b2bb 100644 --- a/net.c +++ b/net.c @@ -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);