svn commit: r333617 - in stable/11: . cddl/lib/libdtrace cddl/usr.sbin cddl/usr.sbin/dwatch cddl/usr.sbin/dwatch/libexec etc/mtree share/dtrace

Devin Teske dteske at FreeBSD.org
Tue May 15 00:00:48 UTC 2018


Author: dteske
Date: Tue May 15 00:00:44 2018
New Revision: 333617
URL: https://svnweb.freebsd.org/changeset/base/333617

Log:
  MFC SVN r329188,329334,329353,329914,329995-329996: DTrace Enhancements
  
  r329188: Use tabs in io.d, fix alignment issues, remove extra newlines
  r329334: Add errno definitions to /usr/lib/dtrace/errno.d
  r329353: Add inline to errno.d for translating int to string
  r329914: Updates and enhancements to io.d to aid DTrace scripting
  r329995: Updates and enhancements to signal.d to aid DTrace scripting
  r329996: Consistent casing for fallback SIGCHLD (s/Unknown/unknown/)
  
  MFC SVN r330559-330560,330672,332865-332867,333513-333519: dwatch(1)
  
  r330559: Introduce dwatch(1) as a tool for making DTrace more useful
  r330560: Bump dwatch(1) internal version from 1.0-beta-91 to 1.0
  r330672: Fix display of wrong pid from dtrace_sched(4)
  r332865: Add `-dev' option to aid debugging of profiles
  r332866: Add profile for send(2)/recv(2) syscalls
  r332867: Remove the line used to demonstrate `-dev' option
  r333513: Bugfix, usage displayed with `-1Q'
  r333514: Separate default values so `-[BK] num' don't affect usage
  r333515: Simplify info message test
  r333516: Export ARGV to profiles loaded via load_profile()
  r333517: Allow `-E code' to override profile EVENT_DETAILS
  r333518: Expose process for ip/tcp/udp
  r333519: Refactor sendrecv profile
  
  Reviewed by:	markj, gnn, bdrewery (head; earlier version)
  Approved by:	re (gjb)
  Relnotes:	yes
  Sponsored by:	Smule, Inc.
  Differential Revision:	https://reviews.freebsd.org/D15418

Added:
  stable/11/cddl/usr.sbin/dwatch/
     - copied from r330559, head/cddl/usr.sbin/dwatch/
  stable/11/cddl/usr.sbin/dwatch/libexec/sendrecv   (contents, props changed)
     - copied, changed from r332866, head/cddl/usr.sbin/dwatch/libexec/sendrecv
Deleted:
  stable/11/share/dtrace/watch_execve
  stable/11/share/dtrace/watch_kill
  stable/11/share/dtrace/watch_vop_remove
Modified:
  stable/11/ObsoleteFiles.inc
  stable/11/cddl/lib/libdtrace/errno.d
  stable/11/cddl/lib/libdtrace/io.d
  stable/11/cddl/lib/libdtrace/ip.d
  stable/11/cddl/lib/libdtrace/libproc_compat.h
  stable/11/cddl/lib/libdtrace/psinfo.d
  stable/11/cddl/lib/libdtrace/regs_x86.d
  stable/11/cddl/lib/libdtrace/sched.d
  stable/11/cddl/lib/libdtrace/signal.d
  stable/11/cddl/lib/libdtrace/tcp.d
  stable/11/cddl/lib/libdtrace/udp.d
  stable/11/cddl/usr.sbin/Makefile
  stable/11/cddl/usr.sbin/dwatch/dwatch
  stable/11/cddl/usr.sbin/dwatch/libexec/Makefile
  stable/11/cddl/usr.sbin/dwatch/libexec/chmod
  stable/11/cddl/usr.sbin/dwatch/libexec/errno
  stable/11/cddl/usr.sbin/dwatch/libexec/io
  stable/11/cddl/usr.sbin/dwatch/libexec/ip
  stable/11/cddl/usr.sbin/dwatch/libexec/kill
  stable/11/cddl/usr.sbin/dwatch/libexec/nanosleep
  stable/11/cddl/usr.sbin/dwatch/libexec/open
  stable/11/cddl/usr.sbin/dwatch/libexec/proc
  stable/11/cddl/usr.sbin/dwatch/libexec/rw
  stable/11/cddl/usr.sbin/dwatch/libexec/sched
  stable/11/cddl/usr.sbin/dwatch/libexec/tcp
  stable/11/cddl/usr.sbin/dwatch/libexec/udp
  stable/11/cddl/usr.sbin/dwatch/libexec/vop_create
  stable/11/cddl/usr.sbin/dwatch/libexec/vop_readdir
  stable/11/cddl/usr.sbin/dwatch/libexec/vop_rename
  stable/11/cddl/usr.sbin/dwatch/libexec/vop_symlink
  stable/11/etc/mtree/BSD.usr.dist
  stable/11/share/dtrace/Makefile
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/ObsoleteFiles.inc
==============================================================================
--- stable/11/ObsoleteFiles.inc	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/ObsoleteFiles.inc	Tue May 15 00:00:44 2018	(r333617)
@@ -38,6 +38,10 @@
 #   xargs -n1 | sort | uniq -d;
 # done
 
+# 20180513: remove DTrace scripts made obsolete by dwatch(1)
+OLD_FILES+=usr/share/dtrace/watch_execve
+OLD_FILES+=usr/share/dtrace/watch_kill
+OLD_FILES+=usr/share/dtrace/watch_vop_remove
 # 20180331: new clang import which bumps version from 5.0.1 to 6.0.0.
 OLD_FILES+=usr/lib/clang/5.0.1/include/sanitizer/allocator_interface.h
 OLD_FILES+=usr/lib/clang/5.0.1/include/sanitizer/asan_interface.h

Modified: stable/11/cddl/lib/libdtrace/errno.d
==============================================================================
--- stable/11/cddl/lib/libdtrace/errno.d	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/errno.d	Tue May 15 00:00:44 2018	(r333617)
@@ -20,6 +20,7 @@
  * CDDL HEADER END
  *
  * Portions Copyright 2006-2008 John Birrell jb at freebsd.org
+ * Portions Copyright 2018 Devin Teske dteske at freebsd.org
  *
  * $FreeBSD$
  */
@@ -216,7 +217,15 @@ inline int ENOLINK = 91;
 #pragma D binding "1.0" ENOLINK
 inline int EPROTO = 92;
 #pragma D binding "1.0" EPROTO
-inline int ELAST = 92;
+inline int ENOTCAPABLE = 93;
+#pragma D binding "1.13" ENOTCAPABLE
+inline int ECAPMODE = 94;
+#pragma D binding "1.13" ECAPMODE
+inline int ENOTRECOVERABLE = 95;
+#pragma D binding "1.13" ENOTRECOVERABLE
+inline int EOWNERDEAD = 96;
+#pragma D binding "1.13" EOWNERDEAD
+inline int ELAST = 96;
 #pragma D binding "1.0" ELAST
 inline int ERESTART = -1;
 #pragma D binding "1.0" ERESTART
@@ -226,3 +235,114 @@ inline int ENOIOCTL = -3;
 #pragma D binding "1.0" ENOIOCTL
 inline int EDIRIOCTL = -4;
 #pragma D binding "1.0" EDIRIOCTL
+inline int ERELOOKUP = -5;
+#pragma D binding "1.13" ERELOOKUP
+
+/*
+ * Error strings from <sys/errno.h>
+ */
+#pragma D binding "1.13" strerror
+inline string strerror[int errno] =
+	errno == 0 ? 			"Success" :
+	errno == EPERM ?		"Operation not permitted" :
+	errno == ENOENT ?		"No such file or directory" :
+	errno == ESRCH ?		"No such process" :
+	errno == EINTR ?		"Interrupted system call" :
+	errno == EIO ?			"Input/output error" :
+	errno == ENXIO ?		"Device not configured" :
+	errno == E2BIG ?		"Argument list too long" :
+	errno == ENOEXEC ?		"Exec format error" :
+	errno == EBADF ?		"Bad file descriptor" :
+	errno == ECHILD ?		"No child processes" :
+	errno == EDEADLK ?		"Resource deadlock avoided" :
+	errno == ENOMEM ?		"Cannot allocate memory" :
+	errno == EACCES ?		"Permission denied" :
+	errno == EFAULT ?		"Bad address" :
+	errno == ENOTBLK ?		"Block device required" :
+	errno == EBUSY ?		"Device busy" :
+	errno == EEXIST ?		"File exists" :
+	errno == EXDEV ?		"Cross-device link" :
+	errno == ENODEV ?		"Operation not supported by device" :
+	errno == ENOTDIR ?		"Not a directory" :
+	errno == EISDIR ?		"Is a directory" :
+	errno == EINVAL ?		"Invalid argument" :
+	errno == ENFILE ?		"Too many open files in system" :
+	errno == EMFILE ?		"Too many open files" :
+	errno == ENOTTY ?		"Inappropriate ioctl for device" :
+	errno == ETXTBSY ?		"Text file busy" :
+	errno == EFBIG ?		"File too large" :
+	errno == ENOSPC ?		"No space left on device" :
+	errno == ESPIPE ?		"Illegal seek" :
+	errno == EROFS ?		"Read-only filesystem" :
+	errno == EMLINK ?		"Too many links" :
+	errno == EPIPE ?		"Broken pipe" :
+	errno == EDOM ?			"Numerical argument out of domain" :
+	errno == ERANGE ?		"Result too large" :
+	errno == EAGAIN ?		"Resource temporarily unavailable" :
+	errno == EINPROGRESS ?		"Operation now in progress" :
+	errno == EALREADY ?		"Operation already in progress" :
+	errno == ENOTSOCK ?		"Socket operation on non-socket" :
+	errno == EDESTADDRREQ ?		"Destination address required" :
+	errno == EMSGSIZE ?		"Message too long" :
+	errno == EPROTOTYPE ?		"Protocol wrong type for socket" :
+	errno == ENOPROTOOPT ?		"Protocol not available" :
+	errno == EPROTONOSUPPORT ?	"Protocol not supported" :
+	errno == ESOCKTNOSUPPORT ?	"Socket type not supported" :
+	errno == EOPNOTSUPP ?		"Operation not supported" :
+	errno == EPFNOSUPPORT ?		"Protocol family not supported" :
+	errno == EAFNOSUPPORT ?		"Address family not supported by protocol family" :
+	errno == EADDRINUSE ?		"Address already in use" :
+	errno == EADDRNOTAVAIL ?	"Can't assign requested address" :
+	errno == ENETDOWN ?		"Network is down" :
+	errno == ENETUNREACH ?		"Network is unreachable" :
+	errno == ENETRESET ?		"Network dropped connection on reset" :
+	errno == ECONNABORTED ?		"Software caused connection abort" :
+	errno == ECONNRESET ?		"Connection reset by peer" :
+	errno == ENOBUFS ?		"No buffer space available" :
+	errno == EISCONN ?		"Socket is already connected" :
+	errno == ENOTCONN ?		"Socket is not connected" :
+	errno == ESHUTDOWN ?		"Can't send after socket shutdown" :
+	errno == ETOOMANYREFS ?		"Too many references: can't splice" :
+	errno == ETIMEDOUT ?		"Operation timed out" :
+	errno == ECONNREFUSED ?		"Connection refused" :
+	errno == ELOOP ?		"Too many levels of symbolic links" :
+	errno == ENAMETOOLONG ?		"File name too long" :
+	errno == EHOSTDOWN ?		"Host is down" :
+	errno == EHOSTUNREACH ?		"No route to host" :
+	errno == ENOTEMPTY ?		"Directory not empty" :
+	errno == EPROCLIM ?		"Too many processes" :
+	errno == EUSERS ?		"Too many users" :
+	errno == EDQUOT ?		"Disc quota exceeded" :
+	errno == ESTALE ?		"Stale NFS file handle" :
+	errno == EREMOTE ?		"Too many levels of remote in path" :
+	errno == EBADRPC ?		"RPC struct is bad" :
+	errno == ERPCMISMATCH ?		"RPC version wrong" :
+	errno == EPROGUNAVAIL ?		"RPC prog. not avail" :
+	errno == EPROGMISMATCH ?	"Program version wrong" :
+	errno == EPROCUNAVAIL ?		"Bad procedure for program" :
+	errno == ENOLCK ?		"No locks available" :
+	errno == ENOSYS ?		"Function not implemented" :
+	errno == EFTYPE ?		"Inappropriate file type or format" :
+	errno == EAUTH ?		"Authentication error" :
+	errno == ENEEDAUTH ?		"Need authenticator" :
+	errno == EIDRM ?		"Identifier removed" :
+	errno == ENOMSG ?		"No message of desired type" :
+	errno == EOVERFLOW ?		"Value too large to be stored in data type" :
+	errno == ECANCELED ?		"Operation canceled" :
+	errno == EILSEQ ?		"Illegal byte sequence" :
+	errno == ENOATTR ?		"Attribute not found" :
+	errno == EDOOFUS ?		"Programming error" :
+	errno == EBADMSG ?		"Bad message" :
+	errno == EMULTIHOP ?		"Multihop attempted" :
+	errno == ENOLINK ?		"Link has been severed" :
+	errno == EPROTO ?		"Protocol error" :
+	errno == ENOTCAPABLE ?		"Capabilities insufficient" :
+	errno == ECAPMODE ?		"Not permitted in capability mode" :
+	errno == ENOTRECOVERABLE ?	"State not recoverable" :
+	errno == EOWNERDEAD ?		"Previous owner died" :
+	errno == ERESTART ?		"restart syscall" :
+	errno == EJUSTRETURN ?		"don't modify regs, just return" :
+	errno == ENOIOCTL ?		"ioctl not handled by this layer" :
+	errno == EDIRIOCTL ?		"do direct ioctl in GEOM" :
+	errno == ERELOOKUP ?		"retry the directory lookup" :
+	"Unknown error";

Modified: stable/11/cddl/lib/libdtrace/io.d
==============================================================================
--- stable/11/cddl/lib/libdtrace/io.d	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/io.d	Tue May 15 00:00:44 2018	(r333617)
@@ -18,6 +18,8 @@
  *
  * CDDL HEADER END
  *
+ * Portions Copyright 2018 Devin Teske dteske at freebsd.org
+ *
  * $FreeBSD$
  */
 /*
@@ -29,47 +31,51 @@
 #pragma D depends_on provider io
 
 typedef struct devinfo {
-        int dev_major;                  /* major number */
-        int dev_minor;                  /* minor number */
-        int dev_instance;               /* instance number */
-        string dev_name;                /* name of device */
-        string dev_statname;            /* name of device + instance/minor */
-        string dev_pathname;            /* pathname of device */
+	int dev_major;			/* major number */
+	int dev_minor;			/* minor number */
+	int dev_instance;		/* instance number */
+	int dev_type;			/* type of device */
+	string dev_name;		/* name of device */
+	string dev_statname;		/* name of device + instance/minor */
+	string dev_pathname;		/* pathname of device */
 } devinfo_t;
 
 #pragma D binding "1.0" translator
 translator devinfo_t < struct devstat *D > {
-           dev_major = D->device_number;
-           dev_minor = D->unit_number;
-           dev_instance = 0;
-           dev_name = stringof(D->device_name);
-           dev_statname = stringof(D->device_name);
-           dev_pathname = stringof(D->device_name);
+	dev_major = D->device_number;
+	dev_minor = D->unit_number;
+	dev_instance = 0;
+	dev_type = D->device_type;
+	dev_name = stringof(D->device_name);
+	dev_statname = stringof(D->device_name);
+	dev_pathname = stringof(D->device_name);
 };
 
 typedef struct bufinfo {
-        int b_flags;                    /* flags */
-        long b_bcount;                /* number of bytes */
-        caddr_t b_addr;                 /* buffer address */
-        uint64_t b_blkno;               /* expanded block # on device */
-        uint64_t b_lblkno;              /* block # on device */
-        size_t b_resid;                 /* # of bytes not transferred */
-        size_t b_bufsize;               /* size of allocated buffer */
-/*        caddr_t b_iodone;              I/O completion routine */
-        int b_error;                    /* expanded error field */
-/*        dev_t b_edev;                  extended device */
+	int b_cmd;			/* I/O operation */
+	int b_flags;			/* flags */
+	long b_bcount;			/* number of bytes */
+	caddr_t b_addr;			/* buffer address */
+	uint64_t b_blkno;		/* expanded block # on device */
+	uint64_t b_lblkno;		/* block # on device */
+	size_t b_resid;			/* # of bytes not transferred */
+	size_t b_bufsize;		/* size of allocated buffer */
+/*	caddr_t b_iodone;		I/O completion routine */
+	int b_error;			/* expanded error field */
+/*	dev_t b_edev;			extended device */
 } bufinfo_t;
 
 #pragma D binding "1.0" translator
 translator bufinfo_t < struct bio *B > {
-           b_flags = B->bio_flags;
-           b_bcount = B->bio_bcount;
-           b_addr = B->bio_data;
-           b_blkno = 0;
-           b_lblkno = 0;
-           b_resid = B->bio_resid;
-           b_bufsize = 0; /* XXX gnn */
-           b_error = B->bio_error;
+	b_cmd = B->bio_cmd;
+	b_flags = B->bio_flags;
+	b_bcount = B->bio_bcount;
+	b_addr = B->bio_data;
+	b_blkno = 0;
+	b_lblkno = 0;
+	b_resid = B->bio_resid;
+	b_bufsize = 0; /* XXX gnn */
+	b_error = B->bio_error;
 };
 
 /*
@@ -106,4 +112,150 @@ inline int O_SYNC = 0x0080;
 inline int O_TRUNC = 0x0400;
 #pragma D binding "1.1" O_TRUNC
 
+/*
+ * The following inline constants can be used to examine bio_cmd of struct bio
+ * or a translated bufinfo_t.
+ */
+inline int BIO_READ =		0x01;
+#pragma D binding "1.13" BIO_READ
+inline int BIO_WRITE =		0x02;
+#pragma D binding "1.13" BIO_WRITE
+inline int BIO_DELETE =		0x03;
+#pragma D binding "1.13" BIO_DELETE
+inline int BIO_GETATTR =	0x04;
+#pragma D binding "1.13" BIO_GETATTR
+inline int BIO_FLUSH =		0x05;
+#pragma D binding "1.13" BIO_FLUSH
+inline int BIO_CMD0 =		0x06;
+#pragma D binding "1.13" BIO_CMD0
+inline int BIO_CMD1 =		0x07;
+#pragma D binding "1.13" BIO_CMD1
+inline int BIO_CMD2 =		0x08;
+#pragma D binding "1.13" BIO_CMD2
+inline int BIO_ZONE =		0x09;
+#pragma D binding "1.13" BIO_ZONE
 
+/*
+ * The following inline constants can be used to examine bio_flags of struct
+ * bio or a translated bufinfo_t.
+ */
+inline int BIO_ERROR =			0x01;
+#pragma D binding "1.13" BIO_ERROR
+inline int BIO_DONE =			0x02;
+#pragma D binding "1.13" BIO_DONE
+inline int BIO_ONQUEUE =		0x04;
+#pragma D binding "1.13" BIO_ONQUEUE
+inline int BIO_ORDERED =		0x08;
+#pragma D binding "1.13" BIO_ORDERED
+inline int BIO_UNMAPPED =		0x10;
+#pragma D binding "1.13" BIO_UNMAPPED
+inline int BIO_TRANSIENT_MAPPING =	0x20;
+#pragma D binding "1.13" BIO_TRANSIENT_MAPPING
+inline int BIO_VLIST =			0x40;
+#pragma D binding "1.13" BIO_VLIST
+
+/*
+ * The following inline constants can be used to examine device_type of struct
+ * devstat or a translated devinfo_t.
+ */
+inline int DEVSTAT_TYPE_DIRECT =	0x000;
+#pragma D binding "1.13" DEVSTAT_TYPE_DIRECT
+inline int DEVSTAT_TYPE_SEQUENTIAL =	0x001;
+#pragma D binding "1.13" DEVSTAT_TYPE_SEQUENTIAL
+inline int DEVSTAT_TYPE_PRINTER =	0x002;
+#pragma D binding "1.13" DEVSTAT_TYPE_PRINTER
+inline int DEVSTAT_TYPE_PROCESSOR =	0x003;
+#pragma D binding "1.13" DEVSTAT_TYPE_PROCESSOR
+inline int DEVSTAT_TYPE_WORM =		0x004;
+#pragma D binding "1.13" DEVSTAT_TYPE_WORM
+inline int DEVSTAT_TYPE_CDROM =		0x005;
+#pragma D binding "1.13" DEVSTAT_TYPE_CDROM
+inline int DEVSTAT_TYPE_SCANNER =	0x006;
+#pragma D binding "1.13" DEVSTAT_TYPE_SCANNER
+inline int DEVSTAT_TYPE_OPTICAL =	0x007;
+#pragma D binding "1.13" DEVSTAT_TYPE_OPTICAL
+inline int DEVSTAT_TYPE_CHANGER =	0x008;
+#pragma D binding "1.13" DEVSTAT_TYPE_CHANGER
+inline int DEVSTAT_TYPE_COMM =		0x009;
+#pragma D binding "1.13" DEVSTAT_TYPE_COMM
+inline int DEVSTAT_TYPE_ASC0 =		0x00a;
+#pragma D binding "1.13" DEVSTAT_TYPE_ASC0
+inline int DEVSTAT_TYPE_ASC1 =		0x00b;
+#pragma D binding "1.13" DEVSTAT_TYPE_ASC1
+inline int DEVSTAT_TYPE_STORARRAY =	0x00c;
+#pragma D binding "1.13" DEVSTAT_TYPE_STORARRAY
+inline int DEVSTAT_TYPE_ENCLOSURE =	0x00d;
+#pragma D binding "1.13" DEVSTAT_TYPE_ENCLOSURE
+inline int DEVSTAT_TYPE_FLOPPY =	0x00e;
+#pragma D binding "1.13" DEVSTAT_TYPE_FLOPPY
+inline int DEVSTAT_TYPE_MASK =		0x00f;
+#pragma D binding "1.13" DEVSTAT_TYPE_MASK
+inline int DEVSTAT_TYPE_IF_SCSI =	0x010;
+#pragma D binding "1.13" DEVSTAT_TYPE_IF_SCSI
+inline int DEVSTAT_TYPE_IF_IDE =	0x020;
+#pragma D binding "1.13" DEVSTAT_TYPE_IF_IDE
+inline int DEVSTAT_TYPE_IF_OTHER =	0x030;
+#pragma D binding "1.13" DEVSTAT_TYPE_IF_OTHER
+inline int DEVSTAT_TYPE_IF_MASK =	0x0f0;
+#pragma D binding "1.13" DEVSTAT_TYPE_IF_MASK
+inline int DEVSTAT_TYPE_PASS =		0x100;
+#pragma D binding "1.13" DEVSTAT_TYPE_PASS
+
+#pragma D binding "1.13" device_type_string
+inline string device_type_string[int type] =
+	type == DEVSTAT_TYPE_DIRECT ?		"DIRECT" :
+	type == DEVSTAT_TYPE_SEQUENTIAL ?	"SEQUENTIAL" :
+	type == DEVSTAT_TYPE_PRINTER ?		"PRINTER" :
+	type == DEVSTAT_TYPE_PROCESSOR ?	"PROCESSOR" :
+	type == DEVSTAT_TYPE_WORM ?		"WORM" :
+	type == DEVSTAT_TYPE_CDROM ?		"CDROM" :
+	type == DEVSTAT_TYPE_SCANNER ?		"SCANNER" :
+	type == DEVSTAT_TYPE_OPTICAL ?		"OPTICAL" :
+	type == DEVSTAT_TYPE_CHANGER ?		"CHANGER" :
+	type == DEVSTAT_TYPE_COMM ?		"COMM" :
+	type == DEVSTAT_TYPE_ASC0 ?		"ASC0" :
+	type == DEVSTAT_TYPE_ASC1 ?		"ASC1" :
+	type == DEVSTAT_TYPE_STORARRAY ?	"STORARRAY" :
+	type == DEVSTAT_TYPE_ENCLOSURE ?	"ENCLOSURE" :
+	type == DEVSTAT_TYPE_FLOPPY ?		"FLOPPY" :
+	strjoin("UNKNOWN(", strjoin(lltostr(type), ")"));
+
+#pragma D binding "1.13" device_type
+inline string device_type[int type] =
+	device_type_string[type & DEVSTAT_TYPE_MASK];
+
+#pragma D binding "1.13" device_if_string
+inline string device_if_string[int type] =
+	type == 0 ?			"ACCESS" :
+	type == DEVSTAT_TYPE_IF_SCSI ?	"SCSI" :
+	type == DEVSTAT_TYPE_IF_IDE ?	"IDE" :
+	type == DEVSTAT_TYPE_IF_OTHER ?	"OTHER" :
+	strjoin("UNKNOWN(", strjoin(lltostr(type), ")"));
+
+#pragma D binding "1.13" device_if
+inline string device_if[int type] =
+	device_if_string[type & DEVSTAT_TYPE_IF_MASK];
+
+#pragma D binding "1.13" bio_cmd_string
+inline string bio_cmd_string[int cmd] =
+	cmd == BIO_READ ?	"READ" :
+	cmd == BIO_WRITE ?	"WRITE" :
+	cmd == BIO_DELETE ?	"DELETE" :
+	cmd == BIO_GETATTR ?	"GETATTR" :
+	cmd == BIO_FLUSH ?	"FLUSH" :
+	cmd == BIO_CMD0 ?	"CMD0" :
+	cmd == BIO_CMD1 ?	"CMD1" :
+	cmd == BIO_CMD2 ?	"CMD2" :
+	cmd == BIO_ZONE ?	"ZONE" :
+	strjoin("UNKNOWN(", strjoin(lltostr(cmd), ")"));
+
+#pragma D binding "1.13" bio_flag_string
+inline string bio_flag_string[int flag] =
+	flag == BIO_ERROR ?		"ERROR" :
+	flag == BIO_DONE ?		"DONE" :
+	flag == BIO_ONQUEUE ?		"ONQUEUE" :
+	flag == BIO_ORDERED ?		"ORDERED" :
+	flag == BIO_UNMAPPED ?		"UNMAPPED" :
+	flag == BIO_TRANSIENT_MAPPING ?	"TRANSIENT_MAPPING" :
+	flag == BIO_VLIST ?		"VLIST" :
+	"";

Modified: stable/11/cddl/lib/libdtrace/ip.d
==============================================================================
--- stable/11/cddl/lib/libdtrace/ip.d	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/ip.d	Tue May 15 00:00:44 2018	(r333617)
@@ -215,10 +215,10 @@ translator csinfo_t < void *p > {
 
 #pragma D binding "1.6.3" translator
 translator csinfo_t < struct inpcb *p > {
-	cs_addr =       NULL;
-	cs_cid =        (uint64_t)p;
-	cs_pid =        0;	/* XXX */
-	cs_zoneid =     0;
+	cs_addr =	NULL;
+	cs_cid =	(uint64_t)p;
+	cs_pid =	0;	/* XXX */
+	cs_zoneid =	0;
 };
 
 #pragma D binding "1.5" translator

Modified: stable/11/cddl/lib/libdtrace/libproc_compat.h
==============================================================================
--- stable/11/cddl/lib/libdtrace/libproc_compat.h	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/libproc_compat.h	Tue May 15 00:00:44 2018	(r333617)
@@ -4,7 +4,7 @@
  * 
  * This software was developed by Rui Paulo under sponsorship from the
  * FreeBSD Foundation. 
- *  
+ *
  * Redistribution and use in source and binary forms, with or without 
  * modification, are permitted provided that the following conditions 
  * are met: 

Modified: stable/11/cddl/lib/libdtrace/psinfo.d
==============================================================================
--- stable/11/cddl/lib/libdtrace/psinfo.d	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/psinfo.d	Tue May 15 00:00:44 2018	(r333617)
@@ -97,4 +97,3 @@ inline psinfo_t *curpsinfo = xlate <psinfo_t *> (curth
 inline lwpsinfo_t *curlwpsinfo = xlate <lwpsinfo_t *> (curthread);
 #pragma D attributes Stable/Stable/Common curlwpsinfo
 #pragma D binding "1.0" curlwpsinfo
-

Modified: stable/11/cddl/lib/libdtrace/regs_x86.d
==============================================================================
--- stable/11/cddl/lib/libdtrace/regs_x86.d	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/regs_x86.d	Tue May 15 00:00:44 2018	(r333617)
@@ -1,4 +1,4 @@
-/*                                                                              
+/*
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
@@ -116,4 +116,3 @@ inline int R_R14 = 18 + 1 + 1;
 #pragma D binding "1.0" R_R14
 inline int R_R15 = 18 + 1 + 0;
 #pragma D binding "1.0" R_R15
-

Modified: stable/11/cddl/lib/libdtrace/sched.d
==============================================================================
--- stable/11/cddl/lib/libdtrace/sched.d	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/sched.d	Tue May 15 00:00:44 2018	(r333617)
@@ -81,4 +81,3 @@ inline chipid_t chip = curcpu->cpu_chip;
 inline lgrp_id_t lgrp = curcpu->cpu_lgrp;
 #pragma D attributes Stable/Stable/Common lgrp
 #pragma D binding "1.0" lgrp
-

Modified: stable/11/cddl/lib/libdtrace/signal.d
==============================================================================
--- stable/11/cddl/lib/libdtrace/signal.d	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/signal.d	Tue May 15 00:00:44 2018	(r333617)
@@ -20,6 +20,7 @@
  * CDDL HEADER END
  *
  * Portions Copyright 2008 John Birrell jb at freebsd.org
+ * Portions Copyright 2018 Devin Teske dteske at freebsd.org
  *
  * $FreeBSD$
  */
@@ -86,7 +87,48 @@ inline int SIGUSR1 = 30;
 #pragma D binding "1.0" SIGUSR1
 inline int SIGUSR2 = 31;
 #pragma D binding "1.0" SIGUSR2
+inline int SIGTHR = 32;
+#pragma D binding "1.13" SIGTHR
+inline int SIGLIBRT = 33;
+#pragma D binding "1.13" SIGLIBRT
 
+#pragma D binding "1.13" signal_string
+inline string signal_string[int signal] =
+	signal == SIGHUP ?	"SIGHUP" :
+	signal == SIGINT ?	"SIGINT" :
+	signal == SIGQUIT ?	"SIGQUIT" :
+	signal == SIGILL ?	"SIGILL":
+	signal == SIGTRAP ?	"SIGTRAP" :
+	signal == SIGABRT ?	"SIGABRT" :
+	signal == SIGEMT ?	"SIGEMT" :
+	signal == SIGFPE ?	"SIGFPE" :
+	signal == SIGKILL ?	"SIGKILL" :
+	signal == SIGBUS ?	"SIGBUS" :
+	signal == SIGSEGV ?	"SIGSEGV" :
+	signal == SIGSYS ?	"SIGSYS" :
+	signal == SIGPIPE ?	"SIGPIPE" :
+	signal == SIGALRM ?	"SIGALRM" :
+	signal == SIGTERM ?	"SIGTERM" :
+	signal == SIGURG ?	"SIGURG" :
+	signal == SIGSTOP ?	"SIGSTOP" :
+	signal == SIGTSTP ?	"SIGTSTP" :
+	signal == SIGCONT ?	"SIGCONT" :
+	signal == SIGCHLD ?	"SIGCHLD" :
+	signal == SIGTTIN ?	"SIGTTIN" :
+	signal == SIGTTOU ?	"SIGTTOU" :
+	signal == SIGIO ?	"SIGIO" :
+	signal == SIGXCPU ?	"SIGXCPU" :
+	signal == SIGXFSZ ?	"SIGXFSZ" :
+	signal == SIGVTALRM ?	"SIGVTALRM" :
+	signal == SIGPROF ?	"SIGPROF" :
+	signal == SIGWINCH ?	"SIGWINCH" :
+	signal == SIGINFO ?	"SIGINFO" :
+	signal == SIGUSR1 ?	"SIGUSR1" :
+	signal == SIGUSR2 ?	"SIGUSR2" :
+	signal == SIGTHR ?	"SIGTHR" :
+	signal == SIGLIBRT ?	"SIGLIBRT" :
+	"UNKNOWN";
+
 inline int CLD_EXITED = 1;
 #pragma D binding "1.0" CLD_EXITED
 inline int CLD_KILLED = 2;
@@ -99,3 +141,13 @@ inline int CLD_STOPPED = 5;
 #pragma D binding "1.0" CLD_STOPPED
 inline int CLD_CONTINUED = 6;
 #pragma D binding "1.0" CLD_CONTINUED
+
+#pragma D binding "1.13" child_signal_string
+inline string child_signal_string[int child_signal] =
+	child_signal == CLD_EXITED ?	"child exited" :
+	child_signal == CLD_KILLED ?	"child terminated abnormally" :
+	child_signal == CLD_DUMPED ?	"child core dumped" :
+	child_signal == CLD_TRAPPED ?	"traced child trapped" :
+	child_signal == CLD_STOPPED ?	"child stopped" :
+	child_signal == CLD_CONTINUED ?	"stopped child continued" :
+	strjoin("unknown SIGCHLD code (", strjoin(lltostr(child_signal), ")"));

Modified: stable/11/cddl/lib/libdtrace/tcp.d
==============================================================================
--- stable/11/cddl/lib/libdtrace/tcp.d	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/tcp.d	Tue May 15 00:00:44 2018	(r333617)
@@ -118,18 +118,18 @@ typedef struct tcpsinfo {
 	int32_t tcps_rcv_ws;		/* receive window scaling */
 	u_long tcps_cwnd;		/* congestion window */
 	u_long tcps_cwnd_ssthresh;	/* threshold for congestion avoidance */
-	uint32_t tcps_srecover;	/* for use in NewReno Fast Recovery */
+	uint32_t tcps_srecover;		/* for use in NewReno Fast Recovery */
 	uint32_t tcps_sack_fack;	/* SACK sequence # we have acked */
 	uint32_t tcps_sack_snxt;	/* next SACK seq # for retransmission */
 	uint32_t tcps_rto;		/* round-trip timeout, msec */
 	uint32_t tcps_mss;		/* max segment size */
 	int tcps_retransmit;		/* retransmit send event, boolean */
 	int tcps_srtt;			/* smoothed RTT in units of (TCP_RTT_SCALE*hz) */
-	int tcps_debug;		/* socket has SO_DEBUG set */
-	int tcps_cookie;	/* expose the socket's SO_USER_COOKIE */
-	int32_t tcps_dupacks;	/* consecutive dup acks received */
-	uint32_t tcps_rtttime;	/* RTT measurement start time */
-	uint32_t tcps_rtseq;	/* sequence # being timed */
+	int tcps_debug;			/* socket has SO_DEBUG set */
+	int tcps_cookie;		/* expose the socket's SO_USER_COOKIE */
+	int32_t tcps_dupacks;		/* consecutive dup acks received */
+	uint32_t tcps_rtttime;		/* RTT measurement start time */
+	uint32_t tcps_rtseq;		/* sequence # being timed */
 	uint32_t tcps_ts_recent;	/* timestamp echo data */
 } tcpsinfo_t;
 
@@ -206,31 +206,31 @@ translator tcpsinfo_t < struct tcpcb *p > {
 	tcps_snxt =		p == NULL ? 0  : p->snd_nxt;
 	tcps_rack =		p == NULL ? 0  : p->last_ack_sent;
 	tcps_rnxt =		p == NULL ? 0  : p->rcv_nxt;
-	tcps_swnd =		p == NULL ? -1  : p->snd_wnd;
-	tcps_snd_ws =		p == NULL ? -1  : p->snd_scale;
-	tcps_swl1 =		p == NULL ? -1  : p->snd_wl1;
-	tcps_swl2 = 		p == NULL ? -1  : p->snd_wl2;
-	tcps_radv =		p == NULL ? -1  : p->rcv_adv;
-	tcps_rwnd =		p == NULL ? -1  : p->rcv_wnd;
-	tcps_rup =		p == NULL ? -1  : p->rcv_up;
-	tcps_rcv_ws =		p == NULL ? -1  : p->rcv_scale;
-	tcps_cwnd =		p == NULL ? -1  : p->snd_cwnd;
-	tcps_cwnd_ssthresh =	p == NULL ? -1  : p->snd_ssthresh;
-	tcps_srecover =		p == NULL ? -1  : p->snd_recover;
+	tcps_swnd =		p == NULL ? -1 : p->snd_wnd;
+	tcps_snd_ws =		p == NULL ? -1 : p->snd_scale;
+	tcps_swl1 =		p == NULL ? -1 : p->snd_wl1;
+	tcps_swl2 = 		p == NULL ? -1 : p->snd_wl2;
+	tcps_radv =		p == NULL ? -1 : p->rcv_adv;
+	tcps_rwnd =		p == NULL ? -1 : p->rcv_wnd;
+	tcps_rup =		p == NULL ? -1 : p->rcv_up;
+	tcps_rcv_ws =		p == NULL ? -1 : p->rcv_scale;
+	tcps_cwnd =		p == NULL ? -1 : p->snd_cwnd;
+	tcps_cwnd_ssthresh =	p == NULL ? -1 : p->snd_ssthresh;
+	tcps_srecover =		p == NULL ? -1 : p->snd_recover;
 	tcps_sack_fack =	p == NULL ? 0  : p->snd_fack;
 	tcps_sack_snxt =	p == NULL ? 0  : p->sack_newdata;
 	tcps_rto =		p == NULL ? -1 : (p->t_rxtcur * 1000) / `hz;
-	tcps_mss =		p == NULL ? -1  : p->t_maxseg;
+	tcps_mss =		p == NULL ? -1 : p->t_maxseg;
 	tcps_retransmit =	p == NULL ? -1 : p->t_rxtshift > 0 ? 1 : 0;
-	tcps_srtt =             p == NULL ? -1  : p->t_srtt;   /* smoothed RTT in units of (TCP_RTT_SCALE*hz) */
+	tcps_srtt =		p == NULL ? -1 : p->t_srtt;   /* smoothed RTT in units of (TCP_RTT_SCALE*hz) */
 	tcps_debug =		p == NULL ? 0 :
 	    p->t_inpcb->inp_socket->so_options & 1;
 	tcps_cookie =		p == NULL ? -1 :
 	    p->t_inpcb->inp_socket->so_user_cookie;
-	tcps_dupacks =		p == NULL ? -1  : p->t_dupacks;
-	tcps_rtttime =		p == NULL ? -1  : p->t_rtttime;
-	tcps_rtseq =		p == NULL ? -1  : p->t_rtseq;
-	tcps_ts_recent =	p == NULL ? -1  : p->ts_recent;
+	tcps_dupacks =		p == NULL ? -1 : p->t_dupacks;
+	tcps_rtttime =		p == NULL ? -1 : p->t_rtttime;
+	tcps_rtseq =		p == NULL ? -1 : p->t_rtseq;
+	tcps_ts_recent =	p == NULL ? -1 : p->ts_recent;
 };
 
 #pragma D binding "1.6.3" translator
@@ -319,74 +319,74 @@ inline int PRU_LISTEN		= 3;
 #pragma D binding "1.12.1" PRU_CONNECT
 inline int PRU_CONNECT		= 4;
 #pragma D binding "1.12.1" PRU_ACCEPT
-inline int PRU_ACCEPT	 = 5 ;
+inline int PRU_ACCEPT		= 5 ;
 #pragma D binding "1.12.1" PRU_DISCONNECT
-inline int PRU_DISCONNECT=  6;
+inline int PRU_DISCONNECT	= 6;
 #pragma D binding "1.12.1" PRU_SHUTDOWN
-inline int PRU_SHUTDOWN	 =  7;
+inline int PRU_SHUTDOWN		= 7;
 #pragma D binding "1.12.1" PRU_RCVD
-inline int PRU_RCVD	 =  8;
+inline int PRU_RCVD		= 8;
 #pragma D binding "1.12.1" PRU_SEND
-inline int PRU_SEND	 =  9;
+inline int PRU_SEND		= 9;
 #pragma D binding "1.12.1" PRU_ABORT
-inline int PRU_ABORT	  = 10;
+inline int PRU_ABORT		= 10;
 #pragma D binding "1.12.1" PRU_CONTROL
-inline int PRU_CONTROL	  = 11;
+inline int PRU_CONTROL		= 11;
 #pragma D binding "1.12.1" PRU_SENSE
-inline int PRU_SENSE	  = 12;
+inline int PRU_SENSE		= 12;
 #pragma D binding "1.12.1" PRU_RCVOOB
-inline int PRU_RCVOOB	  = 13;
+inline int PRU_RCVOOB		= 13;
 #pragma D binding "1.12.1" PRU_SENDOOB
-inline int PRU_SENDOOB	  = 14;
+inline int PRU_SENDOOB		= 14;
 #pragma D binding "1.12.1" PRU_SOCKADDR
-inline int PRU_SOCKADDR	  = 15;
+inline int PRU_SOCKADDR		= 15;
 #pragma D binding "1.12.1" PRU_PEERADDR
-inline int PRU_PEERADDR	  = 16;
+inline int PRU_PEERADDR		= 16;
 #pragma D binding "1.12.1" PRU_CONNECT2
-inline int PRU_CONNECT2	  = 17;
+inline int PRU_CONNECT2		= 17;
 #pragma D binding "1.12.1" PRU_FASTTIMO
-inline int PRU_FASTTIMO	  = 18;
+inline int PRU_FASTTIMO		= 18;
 #pragma D binding "1.12.1" PRU_SLOWTIMO
-inline int PRU_SLOWTIMO	  = 19;
+inline int PRU_SLOWTIMO		= 19;
 #pragma D binding "1.12.1" PRU_PROTORCV
-inline int PRU_PROTORCV	  = 20;
+inline int PRU_PROTORCV		= 20;
 #pragma D binding "1.12.1" PRU_PROTOSEND
-inline int PRU_PROTOSEND  = 21;
+inline int PRU_PROTOSEND	= 21;
 #pragma D binding "1.12.1" PRU_SEND_EOF
-inline int PRU_SEND_EOF	  = 22;
+inline int PRU_SEND_EOF		= 22;
 #pragma D binding "1.12.1" PRU_SOSETLABEL
-inline int PRU_SOSETLABEL = 23;
+inline int PRU_SOSETLABEL	= 23;
 #pragma D binding "1.12.1" PRU_CLOSE
-inline int PRU_CLOSE	  = 24;
+inline int PRU_CLOSE		= 24;
 #pragma D binding "1.12.1" PRU_FLUSH
-inline int PRU_FLUSH	  = 25;
+inline int PRU_FLUSH		= 25;
 
 #pragma D binding "1.12.1" prureq_string
 inline string prureq_string[uint8_t req] =
-	req == PRU_ATTACH ? "ATTACH" :
-	req == PRU_DETACH ? "DETACH" :
-	req == PRU_BIND ? "BIND" :
-	req == PRU_LISTEN ? "LISTEN" :
-	req == PRU_CONNECT ? "CONNECT" :
-	req == PRU_ACCEPT ? "ACCEPT" :
-	req == PRU_DISCONNECT ? "DISCONNECT" :
-	req == PRU_SHUTDOWN ? "SHUTDOWN" :
-	req == PRU_RCVD ? "RCVD" :
-	req == PRU_SEND ? "SEND" :
-	req == PRU_ABORT ? "ABORT" :
-	req == PRU_CONTROL ? "CONTROL" :
-	req == PRU_SENSE ? "SENSE" :
-	req == PRU_RCVOOB ? "RCVOOB" :
-	req == PRU_SENDOOB ? "SENDOOB" :
-	req == PRU_SOCKADDR ? "SOCKADDR" :
-	req == PRU_PEERADDR ? "PEERADDR" :
-	req == PRU_CONNECT2 ? "CONNECT2" :
-	req == PRU_FASTTIMO ? "FASTTIMO" :
-	req == PRU_SLOWTIMO ? "SLOWTIMO" :
-	req == PRU_PROTORCV ? "PROTORCV" :
-	req == PRU_PROTOSEND ? "PROTOSEND" :
-	req == PRU_SEND ? "SEND_EOF" :
-	req == PRU_SOSETLABEL ? "SOSETLABEL" :
-	req == PRU_CLOSE ? "CLOSE" :
-	req == PRU_FLUSH ? "FLUSE" :
+	req == PRU_ATTACH ?	"ATTACH" :
+	req == PRU_DETACH ?	"DETACH" :
+	req == PRU_BIND ?	"BIND" :
+	req == PRU_LISTEN ?	"LISTEN" :
+	req == PRU_CONNECT ?	"CONNECT" :
+	req == PRU_ACCEPT ?	"ACCEPT" :
+	req == PRU_DISCONNECT ?	"DISCONNECT" :
+	req == PRU_SHUTDOWN ?	"SHUTDOWN" :
+	req == PRU_RCVD ?	"RCVD" :
+	req == PRU_SEND ?	"SEND" :
+	req == PRU_ABORT ?	"ABORT" :
+	req == PRU_CONTROL ?	"CONTROL" :
+	req == PRU_SENSE ?	"SENSE" :
+	req == PRU_RCVOOB ?	"RCVOOB" :
+	req == PRU_SENDOOB ?	"SENDOOB" :
+	req == PRU_SOCKADDR ?	"SOCKADDR" :
+	req == PRU_PEERADDR ?	"PEERADDR" :
+	req == PRU_CONNECT2 ?	"CONNECT2" :
+	req == PRU_FASTTIMO ?	"FASTTIMO" :
+	req == PRU_SLOWTIMO ?	"SLOWTIMO" :
+	req == PRU_PROTORCV ?	"PROTORCV" :
+	req == PRU_PROTOSEND ?	"PROTOSEND" :
+	req == PRU_SEND ?	"SEND_EOF" :
+	req == PRU_SOSETLABEL ?	"SOSETLABEL" :
+	req == PRU_CLOSE ?	"CLOSE" :
+	req == PRU_FLUSH ?	"FLUSE" :
 	"unknown" ;

Modified: stable/11/cddl/lib/libdtrace/udp.d
==============================================================================
--- stable/11/cddl/lib/libdtrace/udp.d	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/lib/libdtrace/udp.d	Tue May 15 00:00:44 2018	(r333617)
@@ -47,7 +47,7 @@ typedef struct udpinfo {
 	uint16_t udp_sport;		/* source port */
 	uint16_t udp_dport;		/* destination port */
 	uint16_t udp_length;		/* total length */
-	uint16_t udp_checksum;          /* headers + data checksum */
+	uint16_t udp_checksum;		/* headers + data checksum */
 	struct udphdr *udp_hdr;		/* raw UDP header */
 } udpinfo_t;
 

Modified: stable/11/cddl/usr.sbin/Makefile
==============================================================================
--- stable/11/cddl/usr.sbin/Makefile	Mon May 14 23:12:30 2018	(r333616)
+++ stable/11/cddl/usr.sbin/Makefile	Tue May 15 00:00:44 2018	(r333617)
@@ -3,6 +3,7 @@
 .include <src.opts.mk>
 
 SUBDIR=	${_dtrace} \
+	${_dwatch} \
 	${_lockstat} \
 	${_plockstat} \
 	${_tests} \
@@ -26,6 +27,7 @@ _zfsd=	zfsd
 
 .if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386"
 _dtrace=	dtrace
+_dwatch=	dwatch
 _lockstat=	lockstat
 _plockstat=	plockstat
 .endif
@@ -33,15 +35,18 @@ _plockstat=	plockstat
 .if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "arm" || \
     ${MACHINE_CPUARCH} == "riscv"
 _dtrace=	dtrace
+_dwatch=	dwatch
 _lockstat=	lockstat
 .endif
 
 .if ${MACHINE_CPUARCH} == "mips"
 _dtrace=	dtrace
+_dwatch=	dwatch
 .endif
 
 .if ${MACHINE_CPUARCH} == "powerpc"
 _dtrace=	dtrace
+_dwatch=	dwatch
 _lockstat=	lockstat
 .endif
 

Modified: stable/11/cddl/usr.sbin/dwatch/dwatch
==============================================================================
--- head/cddl/usr.sbin/dwatch/dwatch	Tue Mar  6 23:44:19 2018	(r330559)
+++ stable/11/cddl/usr.sbin/dwatch/dwatch	Tue May 15 00:00:44 2018	(r333617)
@@ -47,7 +47,7 @@ DTRACE_PRAGMA="
 
 ############################################################ GLOBALS
 
-VERSION='$Version: 1.0-beta-91 $' # -V
+VERSION='$Version: 1.2 $' # -V
 
 pgm="${0##*/}" # Program basename
 
@@ -57,6 +57,12 @@ pgm="${0##*/}" # Program basename
 PROBE_ARG=
 
 #
+# Command-line defaults
+#
+_MAX_ARGS=64		# -B num
+_MAX_DEPTH=64		# -K num
+
+#
 # Command-line options
 #
 CONSOLE=		# -y
@@ -67,6 +73,7 @@ CUSTOM_DETAILS=		# -E code
 CUSTOM_TEST=		# -t test
 DEBUG=			# -d
 DESTRUCTIVE_ACTIONS=	# -w
+DEVELOPER=		# -dev
 EXECNAME=		# -k name
 EXECREGEX=		# -z regex
 EXIT_AFTER_COMPILE=	# -e
@@ -76,8 +83,8 @@ GROUP=			# -g group
 JID=			# -j jail
 LIST=			# -l
 LIST_PROFILES=		# -Q
-MAX_ARGS=64		# -B num
-MAX_DEPTH=64		# -K num
+MAX_ARGS=$_MAX_ARGS	# -B num
+MAX_DEPTH=$_MAX_DEPTH	# -K num
 ONELINE=		# -1
 OUTPUT=			# -o file
 OUTPUT_CMD=		# -O cmd
@@ -143,7 +150,7 @@ usage()
 	printf "$optfmt" "-1" \
 		"Print one line per process/profile (Default; disables \`-R')."
 	printf "$optfmt" "-B num" \
-		"Maximum process arguments to display (Default $MAX_ARGS)."
+		"Maximum process arguments to display (Default $_MAX_ARGS)."
 	printf "$optfmt" "-d" \
 		"Debug. Send dtrace(1) script to stdout instead of executing."
 	printf "$optfmt" "-e" \
@@ -161,7 +168,7 @@ usage()
 	printf "$optfmt" "-k name" \
 		"Only show processes matching name."
 	printf "$optfmt" "-K num" \
-		"Maximum directory depth to display (Default $MAX_DEPTH)."
+		"Maximum directory depth to display (Default $_MAX_DEPTH)."
 	printf "$optfmt" "-l" \
 		"List available probes on standard output and exit."
 	printf "$optfmt" "-m" \
@@ -489,8 +496,7 @@ list_profiles()
 			function ans(s) { return cons ? "\033[" s "m" : "" }
 			gsub(filter, ans("31;1") "&" ans("39;22"))
 		' # END-QUOTE
-		return $SUCCESS
-		# NOTREACHED
+		exit $SUCCESS
 	fi
 
 	[ "$quiet" ] || echo PROFILES:
@@ -531,6 +537,11 @@ list_profiles()
 	exit $SUCCESS
 }
 
+shell_escape()
+{
+	echo "$*" | awk 'gsub(/'\''/, "&\\\\&&")||1'
+}
+
 load_profile()
 {
 	local profile="$1"
@@ -540,7 +551,45 @@ load_profile()
 
 	local oldIFS="$IFS"
 	local dir found=
+	local ARGV=
 
+	[ $COUNT -gt 0 ] &&			ARGV="$ARGV -N $COUNT"
+	[ "$DEBUG" ] &&				ARGV="$ARGV -d"
+	[ "$DESTRUCTIVE_ACTIONS" ] &&		ARGV="$ARGV -w"
+	[ "$EXIT_AFTER_COMPILE" ] &&		ARGV="$ARGV -e"
+	[ "$GROUP" ] &&				ARGV="$ARGV -g $GROUP"
+	[ "$JID" ] &&				ARGV="$ARGV -j $JID"
+	[ $MAX_ARGS -ne $_MAX_ARGS ] &&		ARGV="$ARGV -B $MAX_ARGS"
+	[ $MAX_DEPTH -ne $_MAX_DEPTH ] &&	ARGV="$ARGV -K $MAX_DEPTH"
+	[ "$ONELINE" ] &&			ARGV="$ARGV -1"
+	[ "$PID" ] &&				ARGV="$ARGV -p $PID"
+	[ "$PSTREE" ] &&			ARGV="$ARGV -R"
+	[ "$QUIET" ] &&				ARGV="$ARGV -q"
+	[ "$TIMEOUT" ] &&			ARGV="$ARGV -T $TIMEOUT"
+	[ "$TRACE" ] &&				ARGV="$ARGV -x"
+	[ "$USER" ] &&				ARGV="$ARGV -u $USER"
+	[ "$VERBOSE" ] &&			ARGV="$ARGV -v"
+
+	[ "$FILTER" ] &&
+		ARGV="$ARGV -r '$( shell_escape "$FILTER" )'"
+	[ "$EXECREGEX" ] &&
+		ARGV="$ARGV -z '$( shell_escape "$EXECREGEX" )'"
+	[ "$CUSTOM_DETAILS" ] &&
+		ARGV="$ARGV -E '$( shell_escape "$EVENT_DETAILS" )'"
+	[ "$EVENT_TEST" ] &&
+		ARGV="$ARGV -t '$( shell_escape "$EVENT_TEST" )'"
+	[ "$OUTPUT" ] &&
+		ARGV="$ARGV -o '$( shell_escape "$OUTPUT" )'"
+	[ "$OUTPUT_CMD" ] &&
+		ARGV="$ARGV -O '$( shell_escape "$OUTPUT_CMD" )'"
+
+	case "$PROBE_TYPE" in
+	provider) ARGV="$ARGV -P" ;;
+	  module) ARGV="$ARGV -m" ;;
+	function) ARGV="$ARGV -f" ;;
+	    name) ARGV="$ARGV -n" ;;
+	esac
+
 	IFS=:
 	for dir in $DWATCH_PROFILES_PATH; do
 		[ -d "$dir" ] || continue
@@ -835,6 +884,11 @@ if [ "$PROBE_ARG" ]; then
 fi
 
 #
+# Developer switch
+#
+[ "$DEBUG" -a "$EXIT_AFTER_COMPILE" -a "$VERBOSE" ] && DEVELOPER=1 DEBUG=
+
+#
 # Set default event details if `-E code' was not given
 #
 [ "$CUSTOM_DETAILS" ] || EVENT_DETAILS=$( pproc_dump 0 )
@@ -848,7 +902,7 @@ fi
 #
 # Show the user what's being watched
 #
-[ "$DEBUG$QUIET$EXIT_AFTER_COMPILE" ] || info "Watching '$PROBE' ..."
+[ "$DEBUG$EXIT_AFTER_COMPILE" ] || info "Watching '$PROBE' ..."
 
 #
 # Header for watched probe entry
@@ -966,6 +1020,61 @@ PSARGS_ACTION=$( cat <&9 )
 	exec 3>&1
 	console_stdout=3
 
+	#
+	# Developer debugging aide
+	#
+	if [ "$DEVELOPER" ]; then
+		#
+		# Run, capture the error line, and focus it
+		#
+		# Example error text to capture line number from:
+		# 	dtrace: failed to compile script /dev/stdin: line 669: ...
+		#
+		errline=
+		stdin_buf=$( cat )
+		stderr_buf=$( echo "$stdin_buf" |
+			dtrace_cmd -t -es /dev/stdin "$@" 2>&1 > /dev/null )
+		status=$?
+		if [ "$stderr_buf" ]; then
+			errline=$( echo "$stderr_buf" | awk '
+				BEGIN {
+					ti = "\033[31m"
+					te = "\033[39m"
+				}
+				{ line = $0 }
+				sub(/.*: line /, "") && sub(/:.*/, "") {
+					print # to errline
+					sub("line " $0, ti "&" te, line)
+				}
+				{ print line > "/dev/stderr" }
+			' 2>&3 )
+		fi
+		if  [ "$errline" ]; then
+			echo "$stdin_buf" | awk -v line="${errline%%[^0-9]*}" '
+				BEGIN {
+					start = line < 10 ? 1 : line - 10
+					end = line + 10
+					slen = length(sprintf("%u", start))
+					elen = length(sprintf("%u", end))
+					N = elen > slen ? elen : slen
+					for (i = start; i <= end; i++) {
+						ti[i] = "\033[2m"
+						te[i] = "\033[22m"
+					}
+					ti[line] = "\033[31m"
+					te[line] = "\033[39m"
+					fmt = "%s%*u %s%s\n"
+				}
+				NR < start { next }
+				NR == start, NR == end {
+					printf(fmt, ti[NR], N, NR, $0, te[NR])
+				}
+				NR > end { exit }
+			' # END-QUOTE
+		fi
+		exit $status
+	fi
+
 	if [ $COUNT -eq 0 -a ! "$EXECREGEX$FILTER$GROUP$OUTPUT_CMD$PID$USER" ]
 	then
 		case "$OUTPUT" in
@@ -1285,6 +1394,7 @@ $(	pproc_dump -v 3
 )}
 }
 EOF
+# NOTREACHED
 
 ################################################################################
 # END

Modified: stable/11/cddl/usr.sbin/dwatch/libexec/Makefile
==============================================================================
--- head/cddl/usr.sbin/dwatch/libexec/Makefile	Tue Mar  6 23:44:19 2018	(r330559)
+++ stable/11/cddl/usr.sbin/dwatch/libexec/Makefile	Tue May 15 00:00:44 2018	(r333617)
@@ -11,6 +11,7 @@ FILES=		chmod \
 		proc \
 		rw \
 		sched \
+		sendrecv \

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-all mailing list