Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 Jun 2017 12:33:33 +0000 (UTC)
From:      Michael Tuexen <tuexen@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r319417 - in stable/11: lib/libsysdecode usr.bin/truss
Message-ID:  <201706011233.v51CXXj1024719@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: tuexen
Date: Thu Jun  1 12:33:33 2017
New Revision: 319417
URL: https://svnweb.freebsd.org/changeset/base/319417

Log:
  MFC r317730:
  Add support for listen() call.
  
  MFC r317731:
  Add Socklent for handling args of type socklen_t.
  
  MFC r317732:
  Decode the third argument of socket().
  
  MFC r317736:
  Add support for [gs]etsockopt().
  
  MFC r317737:
  Decode the fourth argument of sendto and recvfrom call.
  
  MFC r317739:
  Add support for sendmsg() and recvmsg().
  
  MFC r317747:
  Add support for socket option names related to the IPPROTO_SCTP level.
  
  MFC r317748:
  Add support for socket option names related to the IPPROTO_IPV6 level.
  
  MFC r317750:
  Add support for sctp_generic_sendmsg() and sctp_generic_recvmsg().
  
  MFC r317789:
  Add support for socket option names related to the level IPPROTO_UDPLITE.
  
  MFC r318879:
  Improve the decoding of the third argument of the socket() call.
  
  Decoding of the third argument depends on the first one. For doing this,
  add a corresponding function to libsysdecode.
  
  Thanks to jhb@ for suggesting this.

Added:
  stable/11/lib/libsysdecode/sysdecode_socket_protocol.3
     - copied unchanged from r318879, head/lib/libsysdecode/sysdecode_socket_protocol.3
Modified:
  stable/11/lib/libsysdecode/Makefile
  stable/11/lib/libsysdecode/flags.c
  stable/11/lib/libsysdecode/mktables
  stable/11/lib/libsysdecode/sysdecode.h
  stable/11/usr.bin/truss/syscall.h
  stable/11/usr.bin/truss/syscalls.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/lib/libsysdecode/Makefile
==============================================================================
--- stable/11/lib/libsysdecode/Makefile	Thu Jun  1 11:48:01 2017	(r319416)
+++ stable/11/lib/libsysdecode/Makefile	Thu Jun  1 12:33:33 2017	(r319417)
@@ -22,6 +22,7 @@ MAN=	sysdecode.3 \
 	sysdecode_quotactl_cmd.3 \
 	sysdecode_sigcode.3 \
 	sysdecode_sockopt_name.3 \
+	sysdecode_socket_protocol.3 \
 	sysdecode_syscallnames.3 \
 	sysdecode_utrace.3
 MLINKS= sysdecode_abi_to_freebsd_errno.3 sysdecode_freebsd_to_abi_errno.3

Modified: stable/11/lib/libsysdecode/flags.c
==============================================================================
--- stable/11/lib/libsysdecode/flags.c	Thu Jun  1 11:48:01 2017	(r319416)
+++ stable/11/lib/libsysdecode/flags.c	Thu Jun  1 12:33:33 2017	(r319417)
@@ -47,8 +47,10 @@ __FBSDID("$FreeBSD$");
 #include <sys/thr.h>
 #include <sys/umtx.h>
 #include <netinet/in.h>
+#include <netinet/sctp.h>
 #include <netinet/tcp.h>
 #include <netinet/udp.h>
+#include <netinet/udplite.h>
 #include <nfsserver/nfs.h>
 #include <ufs/ufs/quota.h>
 #include <vm/vm.h>
@@ -728,6 +730,19 @@ sysdecode_socketdomain(int domain)
 }
 
 const char *
+sysdecode_socket_protocol(int domain, int protocol)
+{
+
+	switch (domain) {
+	case PF_INET:
+	case PF_INET6:
+		return (lookup_value(sockipproto, protocol));
+	default:
+		return (NULL);
+	}
+}
+
+const char *
 sysdecode_sockaddr_family(int sa_family)
 {
 
@@ -750,10 +765,16 @@ sysdecode_sockopt_name(int level, int optname)
 	if (level == IPPROTO_IP)
 		/* XXX: UNIX domain socket options use a level of 0 also. */
 		return (lookup_value(sockoptip, optname));
+	if (level == IPPROTO_IPV6)
+		return (lookup_value(sockoptipv6, optname));
+	if (level == IPPROTO_SCTP)
+		return (lookup_value(sockoptsctp, optname));
 	if (level == IPPROTO_TCP)
 		return (lookup_value(sockopttcp, optname));
 	if (level == IPPROTO_UDP)
 		return (lookup_value(sockoptudp, optname));
+	if (level == IPPROTO_UDPLITE)
+		return (lookup_value(sockoptudplite, optname));
 	return (NULL);
 }
 

Modified: stable/11/lib/libsysdecode/mktables
==============================================================================
--- stable/11/lib/libsysdecode/mktables	Thu Jun  1 11:48:01 2017	(r319416)
+++ stable/11/lib/libsysdecode/mktables	Thu Jun  1 12:33:33 2017	(r319417)
@@ -130,8 +130,11 @@ gen_table "sockfamily"      "AF_[[:alnum:]]+[[:space:]
 gen_table "sockipproto"     "IPPROTO_[[:alnum:]]+[[:space:]]+"             "netinet/in.h"
 gen_table "sockopt"         "SO_[A-Z]+[[:space:]]+0x[0-9]+"                "sys/socket.h"
 gen_table "sockoptip"       "(IP_[[:alnum:]_]+|MCAST_[[:alnum:]_]+_GROUP)[[:space:]]+" "netinet/in.h" "IP_DEFAULT|IP_MIN|IP_MAX|IP_PORTRANGE"
+gen_table "sockoptipv6"     "IPV6_[[:alnum:]_]+[[:space:]]+[0-9]+"         "netinet6/in6.h"     "IPV6_ADDR_|IPV6_TAG_DIRECT|IPV6_OPTIONS|IPV6_RECVOPTS|IPV6_RECVRETOPTS|IPV6_RECVDSTADDR|IPV6_RETOPTS|IPV6_2292|IPV6_RECVRTHDRDSTOPTS|IPV6_REACHCONF|IPV6_PKTOPTIONS"
+gen_table "sockoptsctp"     "SCTP_[[:alnum:]_]+[[:space:]]+[0-9]+"         "netinet/sctp.h"
 gen_table "sockopttcp"      "TCP_[[:alnum:]_]+[[:space:]]+[0-9]+"          "netinet/tcp.h"      "TCP_MIN|TCP_MAX[^S]|TCP_MSS|TCP_[[:alnum:]_]+_MAX"
 gen_table "sockoptudp"      "UDP_[[:alnum:]]+[[:space:]]+[0-9]+"           "netinet/udp.h"      "UDP_ENCAP_"
+gen_table "sockoptudplite"  "UDPLITE_[[:alnum:]_]+[[:space:]]+[0-9]+"      "netinet/udplite.h"
 gen_table "socktype"        "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*"          "sys/socket.h"
 gen_table "thrcreateflags"  "THR_[A-Z]+[[:space:]]+0x[0-9]+"               "sys/thr.h"
 gen_table "umtxop"          "UMTX_OP_[[:alnum:]_]+[[:space:]]+[0-9]+"      "sys/umtx.h"

Modified: stable/11/lib/libsysdecode/sysdecode.h
==============================================================================
--- stable/11/lib/libsysdecode/sysdecode.h	Thu Jun  1 11:48:01 2017	(r319416)
+++ stable/11/lib/libsysdecode/sysdecode.h	Thu Jun  1 12:33:33 2017	(r319417)
@@ -99,6 +99,7 @@ const char *sysdecode_sigsegv_code(int _si_code);
 const char *sysdecode_sigtrap_code(int _si_code);
 const char *sysdecode_sockaddr_family(int _sa_family);
 const char *sysdecode_socketdomain(int _domain);
+const char *sysdecode_socket_protocol(int _domain, int _protocol);
 bool	sysdecode_socket_type(FILE *_fp, int _type, int *_rem);
 const char *sysdecode_sockopt_level(int _level);
 const char *sysdecode_sockopt_name(int _level, int _optname);

Copied: stable/11/lib/libsysdecode/sysdecode_socket_protocol.3 (from r318879, head/lib/libsysdecode/sysdecode_socket_protocol.3)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/11/lib/libsysdecode/sysdecode_socket_protocol.3	Thu Jun  1 12:33:33 2017	(r319417, copy of r318879, head/lib/libsysdecode/sysdecode_socket_protocol.3)
@@ -0,0 +1,54 @@
+.\"
+.\" Copyright (c) 2016 John Baldwin <jhb@FreeBSD.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.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd May 25, 2017
+.Dt sysdecode_socket_protocol 3
+.Os
+.Sh NAME
+.Nm sysdecode_socket_protocol
+.Nd lookup name of socket protocol
+.Sh LIBRARY
+.Lb libsysdecode
+.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
+.Ft const char *
+.Fn sysdecode_socket_protocol "int domain" "int protocol"
+.Sh DESCRIPTION
+The
+.Fn sysdecode_socket_protocol
+function returns a text description of the protocol passed in the
+.Fa protocol
+argument to
+.Xr socket 2 .
+.Fn sysdecode_socket_protocol
+takes the
+.Fa protocol
+as well as the
+.Fa domain
+to uniquely identify the protocol.

Modified: stable/11/usr.bin/truss/syscall.h
==============================================================================
--- stable/11/usr.bin/truss/syscall.h	Thu Jun  1 11:48:01 2017	(r319416)
+++ stable/11/usr.bin/truss/syscall.h	Thu Jun  1 12:33:33 2017	(r319417)
@@ -46,7 +46,8 @@ enum Argtype { None = 1, Hex, Octal, Int, UInt, LongHe
 	LinuxSockArgs, Umtxop, Atfd, Atflags, Timespec2, Accessmode, Long,
 	Sysarch, ExecArgs, ExecEnv, PipeFds, QuadHex, Utrace, IntArray, Pipe2,
 	CapFcntlRights, Fadvice, FileFlags, Flockop, Getfsstatmode, Kldsymcmd,
-	Kldunloadflags, Sizet, Madvice,
+	Kldunloadflags, Sizet, Madvice, Socklent, Sockprotocol, Sockoptlevel,
+	Sockoptname, Msgflags,
 
 	CloudABIAdvice, CloudABIClockID, ClouduABIFDSFlags,
 	CloudABIFDStat, CloudABIFileStat, CloudABIFileType,

Modified: stable/11/usr.bin/truss/syscalls.c
==============================================================================
--- stable/11/usr.bin/truss/syscalls.c	Thu Jun  1 11:48:01 2017	(r319416)
+++ stable/11/usr.bin/truss/syscalls.c	Thu Jun  1 12:33:33 2017	(r319417)
@@ -86,7 +86,7 @@ static struct syscall decoded_syscalls[] = {
 	{ .name = "access", .ret_type = 1, .nargs = 2,
 	  .args = { { Name | IN, 0 }, { Accessmode, 1 } } },
 	{ .name = "bind", .ret_type = 1, .nargs = 3,
-	  .args = { { Int, 0 }, { Sockaddr | IN, 1 }, { Int, 2 } } },
+	  .args = { { Int, 0 }, { Sockaddr | IN, 1 }, { Socklent, 2 } } },
 	{ .name = "bindat", .ret_type = 1, .nargs = 4,
 	  .args = { { Atfd, 0 }, { Int, 1 }, { Sockaddr | IN, 2 },
 		    { Int, 3 } } },
@@ -114,7 +114,7 @@ static struct syscall decoded_syscalls[] = {
 	{ .name = "close", .ret_type = 1, .nargs = 1,
 	  .args = { { Int, 0 } } },
 	{ .name = "connect", .ret_type = 1, .nargs = 3,
-	  .args = { { Int, 0 }, { Sockaddr | IN, 1 }, { Int, 2 } } },
+	  .args = { { Int, 0 }, { Sockaddr | IN, 1 }, { Socklent, 2 } } },
 	{ .name = "connectat", .ret_type = 1, .nargs = 4,
 	  .args = { { Atfd, 0 }, { Int, 1 }, { Sockaddr | IN, 2 },
 		    { Int, 3 } } },
@@ -174,6 +174,9 @@ static struct syscall decoded_syscalls[] = {
 	  .args = { { Int, 0 } } },
 	{ .name = "getsockname", .ret_type = 1, .nargs = 3,
 	  .args = { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } },
+	{ .name = "getsockopt", .ret_type = 1, .nargs = 5,
+	  .args = { { Int, 0 }, { Sockoptlevel, 1 }, { Sockoptname, 2 },
+		    { Ptr | OUT, 3 }, { Ptr | OUT, 4 } } },
 	{ .name = "gettimeofday", .ret_type = 1, .nargs = 2,
 	  .args = { { Timeval | OUT, 0 }, { Ptr, 1 } } },
 	{ .name = "ioctl", .ret_type = 1, .nargs = 3,
@@ -212,7 +215,9 @@ static struct syscall decoded_syscalls[] = {
 	{ .name = "linkat", .ret_type = 1, .nargs = 5,
 	  .args = { { Atfd, 0 }, { Name, 1 }, { Atfd, 2 }, { Name, 3 },
 		    { Atflags, 4 } } },
-	{ .name = "lseek", .ret_type = 2, .nargs = 3,
+	{ .name = "listen", .ret_type = 1, .nargs = 2,
+	  .args = { { Int, 0 }, { Int, 1 } } },
+ 	{ .name = "lseek", .ret_type = 2, .nargs = 3,
 	  .args = { { Int, 0 }, { QuadHex, 1 }, { Whence, 2 } } },
 	{ .name = "lstat", .ret_type = 1, .nargs = 2,
 	  .args = { { Name | IN, 0 }, { Stat | OUT, 1 } } },
@@ -273,8 +278,11 @@ static struct syscall decoded_syscalls[] = {
 	  .args = { { Atfd, 0 }, { Name, 1 }, { Readlinkres | OUT, 2 },
 		    { Sizet, 3 } } },
 	{ .name = "recvfrom", .ret_type = 1, .nargs = 6,
-	  .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 }, { Hex, 3 },
-		    { Sockaddr | OUT, 4 }, { Ptr | OUT, 5 } } },
+	  .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 },
+	            { Msgflags, 3 }, { Sockaddr | OUT, 4 },
+	            { Ptr | OUT, 5 } } },
+	{ .name = "recvmsg", .ret_type = 1, .nargs = 3,
+	  .args = { { Int, 0 }, { Ptr, 1 }, { Msgflags, 2 } } },
 	{ .name = "rename", .ret_type = 1, .nargs = 2,
 	  .args = { { Name, 0 }, { Name, 1 } } },
 	{ .name = "renameat", .ret_type = 1, .nargs = 4,
@@ -283,16 +291,30 @@ static struct syscall decoded_syscalls[] = {
 	  .args = { { Rforkflags, 0 } } },
 	{ .name = "rmdir", .ret_type = 1, .nargs = 1,
 	  .args = { { Name, 0 } } },
+	{ .name = "sctp_generic_recvmsg", .ret_type = 1, .nargs = 7,
+	  .args = { { Int, 0 }, { Ptr | IN, 1 }, { Int, 2 },
+	            { Sockaddr | OUT, 3 }, { Ptr | OUT, 4 }, { Ptr | OUT, 5 },
+	            { Ptr | OUT, 6 } } },
+	{ .name = "sctp_generic_sendmsg", .ret_type = 1, .nargs = 7,
+	  .args = { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 },
+	            { Sockaddr | IN, 3 }, { Socklent, 4 }, { Ptr | IN, 5 },
+	            { Msgflags, 6 } } },
 	{ .name = "select", .ret_type = 1, .nargs = 5,
 	  .args = { { Int, 0 }, { Fd_set, 1 }, { Fd_set, 2 }, { Fd_set, 3 },
 		    { Timeval, 4 } } },
+	{ .name = "sendmsg", .ret_type = 1, .nargs = 3,
+	  .args = { { Int, 0 }, { Ptr, 1 }, { Msgflags, 2 } } },
 	{ .name = "sendto", .ret_type = 1, .nargs = 6,
-	  .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 }, { Hex, 3 },
-		    { Sockaddr | IN, 4 }, { Int | IN, 5 } } },
+	  .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 },
+	            { Msgflags, 3 }, { Sockaddr | IN, 4 },
+	            { Socklent | IN, 5 } } },
 	{ .name = "setitimer", .ret_type = 1, .nargs = 3,
 	  .args = { { Int, 0 }, { Itimerval, 1 }, { Itimerval | OUT, 2 } } },
 	{ .name = "setrlimit", .ret_type = 1, .nargs = 2,
 	  .args = { { Resource, 0 }, { Rlimit | IN, 1 } } },
+	{ .name = "setsockopt", .ret_type = 1, .nargs = 5,
+	  .args = { { Int, 0 }, { Sockoptlevel, 1 }, { Sockoptname, 2 },
+		    { Ptr | IN, 3 }, { Socklent, 4 } } },
 	{ .name = "shutdown", .ret_type = 1, .nargs = 2,
 	  .args = { { Int, 0 }, { Shutdown, 1 } } },
 	{ .name = "sigaction", .ret_type = 1, .nargs = 3,
@@ -315,7 +337,7 @@ static struct syscall decoded_syscalls[] = {
 	{ .name = "sigwaitinfo", .ret_type = 1, .nargs = 2,
 	  .args = { { Sigset | IN, 0 }, { Ptr, 1 } } },
 	{ .name = "socket", .ret_type = 1, .nargs = 3,
-	  .args = { { Sockdomain, 0 }, { Socktype, 1 }, { Int, 2 } } },
+	  .args = { { Sockdomain, 0 }, { Socktype, 1 }, { Sockprotocol, 2 } } },
 	{ .name = "stat", .ret_type = 1, .nargs = 2,
 	  .args = { { Name | IN, 0 }, { Stat | OUT, 1 } } },
 	{ .name = "statfs", .ret_type = 1, .nargs = 2,
@@ -1911,6 +1933,48 @@ print_arg(struct syscall_args *sc, unsigned long *args
 		break;
 	case Madvice:
 		print_integer_arg(sysdecode_madvice, fp, args[sc->offset]);
+		break;
+	case Socklent:
+		fprintf(fp, "%u", (socklen_t)args[sc->offset]);
+		break;
+	case Sockprotocol: {
+		const char *temp;
+		int domain, protocol;
+
+		domain = args[sc->offset - 2];
+		protocol = args[sc->offset];
+		if (protocol == 0) {
+			fputs("0", fp);
+		} else {
+			temp = sysdecode_socket_protocol(domain, protocol);
+			if (temp) {
+				fputs(temp, fp);
+			} else {
+				fprintf(fp, "%d", protocol);
+			}
+		}
+		break;
+	}
+	case Sockoptlevel:
+		print_integer_arg(sysdecode_sockopt_level, fp,
+		    args[sc->offset]);
+		break;
+	case Sockoptname: {
+		const char *temp;
+		int level, name;
+
+		level = args[sc->offset - 1];
+		name = args[sc->offset];
+		temp = sysdecode_sockopt_name(level, name);
+		if (temp) {
+			fputs(temp, fp);
+		} else {
+			fprintf(fp, "%d", name);
+		}
+		break;
+	}
+	case Msgflags:
+		print_mask_arg(sysdecode_msg_flags, fp, args[sc->offset]);
 		break;
 
 	case CloudABIAdvice:



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