summaryrefslogtreecommitdiff
path: root/net.c
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2012-03-11 23:59:29 +0000
committerDmitry V. Levin <ldv@altlinux.org>2012-03-11 23:59:29 +0000
commit7af9f35001af19e2844b3e9fb3c672ee696be17b (patch)
treecb72deb2c20b9d86f9603890d9665c48f01bbcda /net.c
parent1ff463d15412de77fcf5b8ca1cf43c63dce1dbe1 (diff)
downloadstrace-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.c53
1 files changed, 45 insertions, 8 deletions
diff --git a/net.c b/net.c
index 266d9c1..e7c7b2b 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);