summaryrefslogtreecommitdiff
path: root/ipc.c
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2009-10-08 23:33:15 +0000
committerDmitry V. Levin <ldv@altlinux.org>2009-10-08 23:33:15 +0000
commit783f5bc24c7ce99739f1e1cd71060fda26aa43e3 (patch)
tree971111c5c523d94de01b2010d7158fb6982227d7 /ipc.c
parentd7bb8b49cc89d428c3a415b94a6ddfcff754dc85 (diff)
downloadstrace-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.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/ipc.c b/ipc.c
index 8ed1900..c0f4bb8 100644
--- a/ipc.c
+++ b/ipc.c
@@ -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;