--- /dev/null
+--- strace-4.5.18/ipc.c.orig 2007-01-15 21:25:52.000000000 +0100
++++ strace-4.5.18/ipc.c 2009-09-30 17:48:38.080610937 +0200
+@@ -152,6 +152,12 @@
+ { 0, NULL },
+ };
+
++static const struct xlat semop_flags[] = {
++ { SEM_UNDO, "SEM_UNDO" },
++ { IPC_NOWAIT, "IPC_NOWAIT" },
++ { 0, NULL },
++};
++
+ int sys_msgget(tcp)
+ struct tcb *tcp;
+ {
+@@ -273,14 +279,34 @@
+ int sys_semop(tcp)
+ struct tcb *tcp;
+ {
++ int i;
++
+ if (entering(tcp)) {
+ tprintf("%lu", tcp->u_arg[0]);
+ if (indirect_ipccall(tcp)) {
+- tprintf(", %#lx", tcp->u_arg[3]);
+- tprintf(", %lu", tcp->u_arg[1]);
++ tprintf(", %#lx {", tcp->u_arg[3]);
++ for(i = 0; i < tcp->u_arg[1]; i++) {
++ struct sembuf sb;
++ umove(tcp, tcp->u_arg[3]+i*sizeof(struct sembuf), &sb);
++ if(i != 0)
++ tprintf(", ");
++ tprintf("{%u, %d, ", sb.sem_num, sb.sem_op);
++ printflags(semop_flags, sb.sem_flg, "SEM_???");
++ tprintf("}");
++ }
++ tprintf("}, %lu", tcp->u_arg[1]);
+ } else {
+- tprintf(", %#lx", tcp->u_arg[1]);
+- tprintf(", %lu", tcp->u_arg[2]);
++ tprintf(", %#lx {", tcp->u_arg[1]);
++ for(i = 0; i < tcp->u_arg[2]; i++) {
++ struct sembuf sb;
++ umove(tcp, tcp->u_arg[1]+i*sizeof(struct sembuf), &sb);
++ if(i != 0)
++ tprintf(", ");
++ tprintf("{%u, %d, ", sb.sem_num, sb.sem_op);
++ printflags(semop_flags, sb.sem_flg, "SEM_???");
++ tprintf("}");
++ }
++ tprintf("}, %lu", tcp->u_arg[2]);
+ }
+ }
+ return 0;
+@@ -290,15 +316,35 @@
+ int sys_semtimedop(tcp)
+ struct tcb *tcp;
+ {
++ int i;
++
+ if (entering(tcp)) {
+ tprintf("%lu", tcp->u_arg[0]);
+ if (indirect_ipccall(tcp)) {
+- tprintf(", %#lx", tcp->u_arg[3]);
+- tprintf(", %lu, ", tcp->u_arg[1]);
++ tprintf(", %#lx {", tcp->u_arg[3]);
++ for(i = 0; i < tcp->u_arg[1]; i++) {
++ struct sembuf sb;
++ umove(tcp, tcp->u_arg[3]+i*sizeof(struct sembuf), &sb);
++ if(i != 0)
++ tprintf(", ");
++ tprintf("{%u, %d, ", sb.sem_num, sb.sem_op);
++ printflags(semop_flags, sb.sem_flg, "SEM_???");
++ tprintf("}");
++ }
++ tprintf("}, %lu, ", tcp->u_arg[1]);
+ printtv(tcp, tcp->u_arg[5]);
+ } else {
+- tprintf(", %#lx", tcp->u_arg[1]);
+- tprintf(", %lu, ", tcp->u_arg[2]);
++ tprintf(", %#lx {", tcp->u_arg[1]);
++ for(i = 0; i < tcp->u_arg[2]; i++) {
++ struct sembuf sb;
++ umove(tcp, tcp->u_arg[1]+i*sizeof(struct sembuf), &sb);
++ if(i != 0)
++ tprintf(", ");
++ tprintf("{%u, %d, ", sb.sem_num, sb.sem_op);
++ printflags(semop_flags, sb.sem_flg, "SEM_???");
++ tprintf("}");
++ }
++ tprintf("}, %lu, ", tcp->u_arg[2]);
+ printtv(tcp, tcp->u_arg[3]);
+ }
+ }