diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2009-10-08 23:33:15 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2009-10-08 23:33:15 +0000 |
commit | 783f5bc24c7ce99739f1e1cd71060fda26aa43e3 (patch) | |
tree | 971111c5c523d94de01b2010d7158fb6982227d7 /ipc.c | |
parent | d7bb8b49cc89d428c3a415b94a6ddfcff754dc85 (diff) | |
download | strace-783f5bc24c7ce99739f1e1cd71060fda26aa43e3.tar.gz strace-783f5bc24c7ce99739f1e1cd71060fda26aa43e3.tar.bz2 strace-783f5bc24c7ce99739f1e1cd71060fda26aa43e3.tar.xz |
Enhance msgsnd() parser
* ipc.c (tprint_msgsnd): New function. Move msgsnd parser code here,
add check for umove() return code.
(sys_msgsnd): Use tprint_msgsnd().
Diffstat (limited to 'ipc.c')
-rw-r--r-- | ipc.c | 35 |
1 files changed, 18 insertions, 17 deletions
@@ -211,29 +211,30 @@ struct tcb *tcp; return 0; } -int sys_msgsnd(tcp) -struct tcb *tcp; +static void +tprint_msgsnd(struct tcb *tcp, long addr, unsigned long count) { long mtype; + if (umove(tcp, addr, &mtype) < 0) { + tprintf("%#lx", addr); + } else { + tprintf("{%lu, ", mtype); + printstr(tcp, addr + sizeof(mtype), count); + tprintf("}"); + } + tprintf(", %lu, ", count); + printflags(msg_flags, tcp->u_arg[3], "MSG_???"); +} + +int sys_msgsnd(struct tcb *tcp) +{ if (entering(tcp)) { - tprintf("%lu", tcp->u_arg[0]); + tprintf("%lu, ", tcp->u_arg[0]); if (indirect_ipccall(tcp)) { - umove(tcp, tcp->u_arg[3], &mtype); - tprintf(", {%lu, ", mtype); - printstr(tcp, tcp->u_arg[3] + sizeof(long), - tcp->u_arg[1]); - tprintf("}, %lu", tcp->u_arg[1]); - tprintf(", "); - printflags(msg_flags, tcp->u_arg[2], "MSG_???"); + tprint_msgsnd(tcp, tcp->u_arg[3], tcp->u_arg[1]); } else { - umove(tcp, tcp->u_arg[1], &mtype); - tprintf(", {%lu, ", mtype); - printstr(tcp, tcp->u_arg[1] + sizeof(long), - tcp->u_arg[2]); - tprintf("}, %lu", tcp->u_arg[2]); - tprintf(", "); - printflags(msg_flags, tcp->u_arg[3], "MSG_???"); + tprint_msgsnd(tcp, tcp->u_arg[1], tcp->u_arg[2]); } } return 0; |