Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Oct 2012 08:43:50 GMT
From:      Steven Hartland <steven.hartland@multiplay.co.uk>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   misc/173114: Add Linux socket call decoding to truss (patch included)
Message-ID:  <201210260843.q9Q8hoDI086840@red.freebsd.org>
Resent-Message-ID: <201210260850.q9Q8o00P081962@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         173114
>Category:       misc
>Synopsis:       Add Linux socket call decoding to truss (patch included)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Oct 26 08:50:00 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator:     Steven Hartland
>Release:        8.3-RELEASE
>Organization:
Multiplay
>Environment:
FreeBSD dev 8.3-RELEASE-p4 FreeBSD 8.3-RELEASE-p4 #22: Mon Sep 17 17:18:32 UTC 2012     root@dev:/usr/obj/usr/src/sys/MULTIPLAY  amd64
>Description:
Add Linux socket call decoding to truss
>How-To-Repeat:
N/A
>Fix:
Apply the patch

Patch attached with submission follows:

Add Linux socket call decoding to truss
--- usr.bin/truss/syscall.h.orig	2007-04-10 05:03:34.000000000 +0100
+++ 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;
+};
+*/
--- usr.bin/truss/syscalls.c.orig	2010-12-21 17:09:25.000000000 +0000
+++ usr.bin/truss/syscalls.c	2012-02-24 14:50:30.000000000 +0000
@@ -95,6 +95,10 @@
 	{ .name = "fork", .ret_type = 1, .nargs = 0 },
 	{ .name = "getegid", .ret_type = 1, .nargs = 0 },
 	{ .name = "geteuid", .ret_type = 1, .nargs = 0 },
+	{ .name = "linux_readlink", .ret_type = 1, .nargs = 3,
+	  .args = { { Name, 0 } , { Name | OUT, 1 }, { Int, 2 }}},
+	{ .name = "linux_socketcall", .ret_type = 1, .nargs = 2,
+	  .args = { { Int, 0 } , { LinuxSockArgs, 1 }}},
 	{ .name = "getgid", .ret_type = 1, .nargs = 0 },
 	{ .name = "getpid", .ret_type = 1, .nargs = 0 },
 	{ .name = "getpgid", .ret_type = 1, .nargs = 1,
@@ -112,6 +116,8 @@
 	  .args = { { Int, 0 }, { Int, 1 }, { Whence, 2 } } },
 	{ .name = "mmap", .ret_type = 2, .nargs = 6,
 	  .args = { { Ptr, 0 }, { Int, 1 }, { Mprot, 2 }, { Mmapflags, 3 }, { Int, 4 }, { Quad, 5 + QUAD_ALIGN } } },
+	{ .name = "linux_mkdir", .ret_type = 1, .nargs = 2,
+	  .args = { { Name | IN, 0} , {Int, 1}}},
 	{ .name = "mprotect", .ret_type = 1, .nargs = 3,
 	  .args = { { Ptr, 0 }, { Int, 1 }, { Mprot, 2 } } },
 	{ .name = "open", .ret_type = 1, .nargs = 3,
@@ -136,6 +142,8 @@
 	  .args = { { Name, 0 }, { Octal, 1 } } },
 	{ .name = "chown", .ret_type = 0, .nargs = 3,
 	  .args = { { Name, 0 }, { Int, 1 }, { Int, 2 } } },
+	{ .name = "linux_stat64", .ret_type = 1, .nargs = 3,
+	  .args = { { Name | IN, 0 }, { Ptr | OUT, 1 }, { Ptr | IN, 1 }}},
 	{ .name = "mount", .ret_type = 0, .nargs = 4,
 	  .args = { { Name, 0 }, { Name, 1 }, { Int, 2 }, { Ptr, 3 } } },
 	{ .name = "umount", .ret_type = 0, .nargs = 2,
@@ -148,6 +156,8 @@
 	  .args = { { Name | IN, 0 }, { Stat | OUT, 1 } } },
 	{ .name = "linux_newstat", .ret_type = 1, .nargs = 2,
 	  .args = { { Name | IN, 0 }, { Ptr | OUT, 1 } } },
+	{ .name = "linux_access", .ret_type = 1, .nargs = 2,
+	  .args = { { Name, 0 }, { Int, 1 }}},
 	{ .name = "linux_newfstat", .ret_type = 1, .nargs = 2,
 	  .args = { { Int, 0 }, { Ptr | OUT, 1 } } },
 	{ .name = "write", .ret_type = 1, .nargs = 3,
@@ -712,6 +722,76 @@
 			asprintf(&tmp, "0x%lx", args[sc->offset]);
 		break;
 	}
+	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;
+	}
 	case Pollfd: {
 		/*
 		 * XXX: A Pollfd argument expects the /next/ syscall argument to be


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210260843.q9Q8hoDI086840>