static void dumpio(struct tcb *tcp) { int (*func)(); if (syserror(tcp)) return; if ((unsigned long) tcp->u_arg[0] >= num_quals) return; func = tcp->s_ent->sys_func; if (func == printargs) return; if (qual_flags[tcp->u_arg[0]] & QUAL_READ) { if (func == sys_read || func == sys_pread || func == sys_recv || func == sys_recvfrom) { dumpstr(tcp, tcp->u_arg[1], tcp->u_rval); return; } else if (func == sys_readv) { dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]); return; #if HAVE_SENDMSG } else if (func == sys_recvmsg) { dumpiov_in_msghdr(tcp, tcp->u_arg[1]); return; } else if (func == sys_recvmmsg) { dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]); return; #endif } } if (qual_flags[tcp->u_arg[0]] & QUAL_WRITE) { if (func == sys_write || func == sys_pwrite || func == sys_send || func == sys_sendto) dumpstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); else if (func == sys_writev) dumpiov(tcp, tcp->u_arg[2], tcp->u_arg[1]); #if HAVE_SENDMSG else if (func == sys_sendmsg) dumpiov_in_msghdr(tcp, tcp->u_arg[1]); else if (func == sys_sendmmsg) dumpiov_in_mmsghdr(tcp, tcp->u_arg[1]); #endif } }
void dumpiov_in_msghdr(struct tcb *tcp, long addr) { struct msghdr msg; if (extractmsghdr(tcp, addr, &msg)) dumpiov(tcp, msg.msg_iovlen, (long)msg.msg_iov); }
void dumpiov_in_mmsghdr(struct tcb *tcp, long addr) { unsigned int len = tcp->u_rval; unsigned int i; struct mmsghdr mmsg; for (i = 0; i < len; ++i) { if (extractmmsghdr(tcp, addr, i, &mmsg)) { tprintf(" = %lu buffers in vector %u\n", (unsigned long)mmsg.msg_hdr.msg_iovlen, i); dumpiov(tcp, mmsg.msg_hdr.msg_iovlen, (long)mmsg.msg_hdr.msg_iov); } } }