From nobody@FreeBSD.org  Sun May 24 19:20:05 2009
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id E1AF51065672
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 24 May 2009 19:20:05 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id CF5D98FC0C
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 24 May 2009 19:20:05 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id n4OJK5ZU037768
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 24 May 2009 19:20:05 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id n4OJK5qm037767;
	Sun, 24 May 2009 19:20:05 GMT
	(envelope-from nobody)
Message-Id: <200905241920.n4OJK5qm037767@www.freebsd.org>
Date: Sun, 24 May 2009 19:20:05 GMT
From: Steven Hartland <steven.hartland@multiplay.co.uk>
To: freebsd-gnats-submit@FreeBSD.org
Subject: Additional detail for truss when tracing linux apps
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         134919
>Category:       bin
>Synopsis:       [patch] add information to truss(1) when tracing linux apps
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    smh
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Sun May 24 19:30:01 UTC 2009
>Closed-Date:    
>Last-Modified:  Thu Dec 13 22:11:13 UTC 2012
>Originator:     Steven Hartland
>Release:        7.2
>Organization:
Multiplay
>Environment:
FreeBSD ftp1.multiplay.co.uk 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Sun May 24 19:21:08 BST 2009     root@ftp1.multiplay.co.uk:/usr/obj/usr/src/sys/MULTIPLAY  i386
>Description:
The following patch adds a number of additional tracing options for linux apps to truss
>How-To-Repeat:

>Fix:
Apply the attached patch :)

Patch attached with submission follows:

--- /usr/src/usr.bin/truss/syscall.h.orig	2007-04-10 05:03:34.000000000 +0100
+++ /usr/src/usr.bin/truss/syscall.h	2008-06-30 13:16:01.000000000 +0100
@@ -41,5 +41,5 @@
 	Umtx, Sigset, Sigprocmask, Kevent, Sockdomain, Socktype, Open,
 	Fcntlflag, Rusage, BinString, Shutdown, Resource, Rlimit, Timeval2,
-	Pathconf };
+	Pathconf, LinuxSockArgs };
 
 #define ARG_MASK	0xff
@@ -65,2 +65,49 @@
 void print_syscall_ret(struct trussinfo *, const char *, int, char **, int,
     long);
+
+/*
+ * Linux Socket defines
+ */
+#define LINUX_SOCKET        1
+#define LINUX_BIND      2
+#define LINUX_CONNECT       3
+#define LINUX_LISTEN        4
+#define LINUX_ACCEPT        5
+#define LINUX_GETSOCKNAME   6
+#define LINUX_GETPEERNAME   7
+#define LINUX_SOCKETPAIR    8
+#define LINUX_SEND      9
+#define LINUX_RECV      10
+#define LINUX_SENDTO        11
+#define LINUX_RECVFROM      12
+#define LINUX_SHUTDOWN      13
+#define LINUX_SETSOCKOPT    14
+#define LINUX_GETSOCKOPT    15
+#define LINUX_SENDMSG       16
+#define LINUX_RECVMSG       17 
+
+#define PAD_(t) (sizeof(register_t) <= sizeof(t) ? \
+        0 : sizeof(register_t) - sizeof(t))
+    
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define PADL_(t)    0
+#define PADR_(t)    PAD_(t)
+#else
+#define PADL_(t)    PAD_(t)
+#define PADR_(t)    0
+#endif
+
+typedef int     l_int;
+typedef uint32_t    l_ulong;
+
+struct linux_socketcall_args {
+    char what_l_[PADL_(l_int)]; l_int what; char what_r_[PADR_(l_int)];
+    char args_l_[PADL_(l_ulong)]; l_ulong args; char args_r_[PADR_(l_ulong)];
+};
+
+/*
+struct linux_socketcall_args {
+	l_int what;
+	l_ulong args;
+};
+*/
--- syscalls.c.orig	2008-07-13 22:34:30.000000000 +0100
+++ syscalls.c	2008-11-22 02:27:12.000000000 +0000
@@ -96,4 +96,8 @@
 	{ "readlink", 1, 3,
 	  { { Name, 0 } , { Readlinkres | OUT, 1 }, { Int, 2 }}},
+	{ "linux_readlink", 1, 3,
+	  { { Name, 0 } , { Name | OUT, 1 }, { Int, 2 }}},
+	{ "linux_socketcall", 1, 2,
+	  { { Int, 0 } , { LinuxSockArgs, 1 }}},
 	{ "lseek", 2, 3,
 	  { {Int, 0}, {Quad, 1 + QUAD_ALIGN},
@@ -112,4 +116,6 @@
 	{ "linux_open", 1, 3,
 	  { { Name, 0 }, { Hex, 1}, { Octal, 2 }}},
+	{ "linux_mkdir", 1, 2,
+	  { { Name | IN, 0} , {Int, 1}}},
 	{ "close", 1, 1,
 	  { { Int, 0 } } },
@@ -136,4 +142,6 @@
 	{ "stat", 1, 2,
 	  { { Name | IN, 0 }, { Stat | OUT, 1 }}},
+	{ "linux_stat64", 1, 3,
+	  { { Name | IN, 0 }, { Ptr | OUT, 1 }, { Ptr | IN, 1 }}},
 	{ "lstat", 1, 2,
 	  { { Name | IN, 0 }, { Stat | OUT, 1 }}},
@@ -149,4 +157,5 @@
 	{ "exit", 0, 1, { { Hex, 0 }}},
 	{ "access", 1, 2, { { Name | IN, 0 }, { Int, 1 }}},
+	{ "linux_access", 1, 2, { { Name, 0 }, { Int, 1 }}},
 	{ "sigaction", 1, 3,
 	  { { Signal, 0 }, { Sigaction | IN, 1 }, { Sigaction | OUT, 2 }}},
@@ -667,4 +676,75 @@
     break;
   case Itimerval:
+  case LinuxSockArgs:
+	{
+
+		struct linux_socketcall_args largs;
+		if ( get_struct(pid, (void *)args[sc->offset], (void *)&largs, sizeof(largs)) == -1)
+		{
+			err(1, "get_struct %p", (void *)args[sc->offset]);
+		}
+		const char *what;
+		char buf[30];
+
+		switch (largs.what) {
+		case LINUX_SOCKET:
+			what = "LINUX_SOCKET";
+			break;
+		case LINUX_BIND:
+			what = "LINUX_BIND";
+			break;
+		case LINUX_CONNECT:
+			what = "LINUX_CONNECT";
+			break;
+		case LINUX_LISTEN:
+			what = "LINUX_LISTEN";
+			break;
+		case LINUX_ACCEPT:
+			what = "LINUX_ACCEPT";
+			break;
+		case LINUX_GETSOCKNAME:
+			what = "LINUX_GETSOCKNAME";
+			break;
+		case LINUX_GETPEERNAME:
+			what = "LINUX_GETPEERNAME";
+			break;
+		case LINUX_SOCKETPAIR:
+			what = "LINUX_SOCKETPAIR";
+			break;
+		case LINUX_SEND:   
+			what = "LINUX_SEND";
+			break;
+		case LINUX_RECV: 
+			what = "LINUX_RECV";
+			break;
+		case LINUX_SENDTO:
+			what = "LINUX_SENDTO";
+			break;
+		case LINUX_RECVFROM:
+			what = "LINUX_RECVFROM";
+			break;
+		case LINUX_SHUTDOWN:
+			what = "LINUX_SHUTDOWN";
+			break;
+		case LINUX_SETSOCKOPT:
+			what = "LINUX_SETSOCKOPT";
+			break;
+		case LINUX_GETSOCKOPT:
+			what = "LINUX_GETSOCKOPT";
+			break;
+		case LINUX_SENDMSG:
+			what = "LINUX_SENDMSG";
+			break;
+		case LINUX_RECVMSG:
+			what = "LINUX_RECVMSG";
+			break;
+		default:
+			sprintf( buf, "%d", largs.what );
+			what = buf;
+			break;
+		}
+		asprintf(&tmp, "(0x%lx)%s, 0x%lx", args[sc->offset], what, (long unsigned int)largs.args );
+	}
+	break;
     {
       struct itimerval itv;


>Release-Note:
>Audit-Trail:

From: "Steven Hartland" <killing@multiplay.co.uk>
To: <bug-followup@FreeBSD.org>,
	<steven.hartland@multiplay.co.uk>
Cc:  
Subject: Re: misc/134919: Additional detail for truss when tracing linux apps
Date: Sun, 24 May 2009 22:47:42 +0100

 This is a multi-part message in MIME format.
 
 ------=_NextPart_000_08DA_01C9DCC1.A590F830
 Content-Type: text/plain;
 	format=flowed;
 	charset="Windows-1252";
 	reply-type=original
 Content-Transfer-Encoding: 7bit
 
 Updated patch that applies on 7.2-RELEASE
 
 ================================================
 This e.mail is private and confidential between Multiplay (UK) Ltd. and the person or entity to whom it is addressed. In the event of misdirection, the recipient is prohibited from using, copying, printing or otherwise disseminating it or any information contained in it. 
 
 In the event of misdirection, illegible or incomplete transmission please telephone +44 845 868 1337
 or return the E.mail to postmaster@multiplay.co.uk.
 ------=_NextPart_000_08DA_01C9DCC1.A590F830
 Content-Type: application/octet-stream;
 	name="syscalls.c.patch"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment;
 	filename="syscalls.c.patch"
 
 --- /usr/src/usr.bin/truss/syscalls.c.orig	2009-04-15 04:14:26.000000000 =
 +0100=0A=
 +++ /usr/src/usr.bin/truss/syscalls.c	2009-05-24 22:41:54.000000000 +0100=0A=
 @@ -96,4 +96,8 @@=0A=
  	{ "readlink", 1, 3,=0A=
  	  { { Name, 0 } , { Readlinkres | OUT, 1 }, { Int, 2 } } },=0A=
 +	{ "linux_readlink", 1, 3,=0A=
 +	  { { Name, 0 } , { Name | OUT, 1 }, { Int, 2 }}},=0A=
 +	{ "linux_socketcall", 1, 2,=0A=
 +	  { { Int, 0 } , { LinuxSockArgs, 1 }}},=0A=
  	{ "lseek", 2, 3,=0A=
  	  { { Int, 0 }, { Quad, 1 + QUAD_ALIGN }, { Whence, 1 + QUAD_SLOTS + =
 QUAD_ALIGN } } },=0A=
 @@ -112,4 +116,6 @@=0A=
  	{ "close", 1, 1,=0A=
  	  { { Int, 0 } } },=0A=
 +	{ "linux_mkdir", 1, 2,=0A=
 +	  { { Name | IN, 0} , {Int, 1}}},=0A=
  	{ "link", 0, 2,=0A=
  	  { { Name, 0 }, { Name, 1 } } },=0A=
 @@ -136,4 +142,6 @@=0A=
  	{ "lstat", 1, 2,=0A=
  	  { { Name | IN, 0 }, { Stat | OUT, 1 } } },=0A=
 +	{ "linux_stat64", 1, 3,=0A=
 +	  { { Name | IN, 0 }, { Ptr | OUT, 1 }, { Ptr | IN, 1 }}},=0A=
  	{ "linux_newstat", 1, 2,=0A=
  	  { { Name | IN, 0 }, { Ptr | OUT, 1 } } },=0A=
 @@ -149,4 +157,5 @@=0A=
  	{ "sigaction", 1, 3,=0A=
  	  { { Signal, 0 }, { Sigaction | IN, 1 }, { Sigaction | OUT, 2 } } },=0A=
 +	{ "linux_access", 1, 2, { { Name, 0 }, { Int, 1 }}},=0A=
  	{ "accept", 1, 3,=0A=
  	  { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } },=0A=
 @@ -672,4 +681,74 @@=0A=
  		break;=0A=
  	}=0A=
 +	case LinuxSockArgs:=0A=
 +	{=0A=
 +		struct linux_socketcall_args largs;=0A=
 +		if ( get_struct(pid, (void *)args[sc->offset], (void *)&largs, =
 sizeof(largs)) =3D=3D -1)=0A=
 +		{=0A=
 +			err(1, "get_struct %p", (void *)args[sc->offset]);=0A=
 +		}=0A=
 +		const char *what;=0A=
 +		char buf[30];=0A=
 +=0A=
 +		switch (largs.what) {=0A=
 +		case LINUX_SOCKET:=0A=
 +			what =3D "LINUX_SOCKET";=0A=
 +			break;=0A=
 +		case LINUX_BIND:=0A=
 +			what =3D "LINUX_BIND";=0A=
 +			break;=0A=
 +		case LINUX_CONNECT:=0A=
 +			what =3D "LINUX_CONNECT";=0A=
 +			break;=0A=
 +		case LINUX_LISTEN:=0A=
 +			what =3D "LINUX_LISTEN";=0A=
 +			break;=0A=
 +		case LINUX_ACCEPT:=0A=
 +			what =3D "LINUX_ACCEPT";=0A=
 +			break;=0A=
 +		case LINUX_GETSOCKNAME:=0A=
 +			what =3D "LINUX_GETSOCKNAME";=0A=
 +			break;=0A=
 +		case LINUX_GETPEERNAME:=0A=
 +			what =3D "LINUX_GETPEERNAME";=0A=
 +			break;=0A=
 +		case LINUX_SOCKETPAIR:=0A=
 +			what =3D "LINUX_SOCKETPAIR";=0A=
 +			break;=0A=
 +		case LINUX_SEND:   =0A=
 +			what =3D "LINUX_SEND";=0A=
 +			break;=0A=
 +		case LINUX_RECV: =0A=
 +			what =3D "LINUX_RECV";=0A=
 +			break;=0A=
 +		case LINUX_SENDTO:=0A=
 +			what =3D "LINUX_SENDTO";=0A=
 +			break;=0A=
 +		case LINUX_RECVFROM:=0A=
 +			what =3D "LINUX_RECVFROM";=0A=
 +			break;=0A=
 +		case LINUX_SHUTDOWN:=0A=
 +			what =3D "LINUX_SHUTDOWN";=0A=
 +			break;=0A=
 +		case LINUX_SETSOCKOPT:=0A=
 +			what =3D "LINUX_SETSOCKOPT";=0A=
 +			break;=0A=
 +		case LINUX_GETSOCKOPT:=0A=
 +			what =3D "LINUX_GETSOCKOPT";=0A=
 +			break;=0A=
 +		case LINUX_SENDMSG:=0A=
 +			what =3D "LINUX_SENDMSG";=0A=
 +			break;=0A=
 +		case LINUX_RECVMSG:=0A=
 +			what =3D "LINUX_RECVMSG";=0A=
 +			break;=0A=
 +		default:=0A=
 +			sprintf( buf, "%d", largs.what );=0A=
 +			what =3D buf;=0A=
 +			break;=0A=
 +		}=0A=
 +		asprintf(&tmp, "(0x%lx)%s, 0x%lx", args[sc->offset], what, (long =
 unsigned int)largs.args );=0A=
 +		break;=0A=
 +	}=0A=
  	case Pollfd: {=0A=
  		/*=0A=
 
 ------=_NextPart_000_08DA_01C9DCC1.A590F830--
 

From: "Steven Hartland" <killing@multiplay.co.uk>
To: <bug-followup@freebsd.org>
Cc:  
Subject: Re: bin/134919: [patch] add information to truss(1) when tracing linux apps
Date: Tue, 7 Feb 2012 09:25:18 -0000

 Any update on this?
 
Responsible-Changed-From-To: freebsd-bugs->smh 
Responsible-Changed-By: smh 
Responsible-Changed-When: Thu Dec 13 22:11:13 UTC 2012 
Responsible-Changed-Why:  
I'll take it. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=134919 
>Unformatted:
