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>
