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.
This commit is contained in:
Дмитрий Левин 2012-03-11 23:59:29 +00:00
parent 1ff463d154
commit 7af9f35001
3 changed files with 46 additions and 9 deletions

View File

@ -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

View File

@ -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();

53
net.c
View File

@ -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);