]> granicus.if.org Git - strace/blobdiff - clone.c
Print struct iovec as a regular structure
[strace] / clone.c
diff --git a/clone.c b/clone.c
index 63304c22133ec693034658917888c88035c75a68..99d0da7f0ce960b73f15ffea5da497276d08ec85 100644 (file)
--- a/clone.c
+++ b/clone.c
@@ -1,3 +1,34 @@
+/*
+ * Copyright (c) 1999-2000 Wichert Akkerman <wichert@cistron.nl>
+ * Copyright (c) 2002-2005 Roland McGrath <roland@redhat.com>
+ * Copyright (c) 2008 Jan Kratochvil <jan.kratochvil@redhat.com>
+ * Copyright (c) 2009-2013 Denys Vlasenko <dvlasenk@redhat.com>
+ * Copyright (c) 2006-2015 Dmitry V. Levin <ldv@altlinux.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
 #include "defs.h"
 
 #include <sched.h>
@@ -51,7 +82,9 @@ SYS_FUNC(clone)
        if (exiting(tcp)) {
                const char *sep = "|";
                unsigned long flags = tcp->u_arg[ARG_FLAGS];
-               tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
+               tprints("child_stack=");
+               printaddr(tcp->u_arg[ARG_STACK]);
+               tprints(", ");
 #ifdef ARG_STACKSIZE
                if (ARG_STACKSIZE != -1)
                        tprintf("stack_size=%#lx, ",
@@ -65,8 +98,10 @@ SYS_FUNC(clone)
                if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
                              |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
                        return 0;
-               if (flags & CLONE_PARENT_SETTID)
-                       tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
+               if (flags & CLONE_PARENT_SETTID) {
+                       tprints(", parent_tidptr=");
+                       printaddr(tcp->u_arg[ARG_PTID]);
+               }
                if (flags & CLONE_SETTLS) {
 #if defined I386 || defined X86_64 || defined X32
 # ifndef I386
@@ -80,10 +115,15 @@ SYS_FUNC(clone)
                        else
 # endif
 #endif /* I386 || X86_64 || X32 */
-                               tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
+                       {
+                               tprints(", tls=");
+                               printaddr(tcp->u_arg[ARG_TLS]);
+                       }
+               }
+               if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID)) {
+                       tprints(", child_tidptr=");
+                       printaddr(tcp->u_arg[ARG_CTID]);
                }
-               if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
-                       tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
        }
        /* TODO on syscall entry:
         * We can clear CLONE_PTRACE here since it is an ancient hack
@@ -111,7 +151,7 @@ SYS_FUNC(setns)
 
 SYS_FUNC(unshare)
 {
-       printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
+       printflags_long(clone_flags, tcp->u_arg[0], "CLONE_???");
        return RVAL_DECODED;
 }