summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorRenato Botelho <renato@netgate.com>2016-01-27 16:18:41 -0200
committerRenato Botelho <renato@netgate.com>2016-01-27 16:18:41 -0200
commit6d77218901c68616c2f97486c813b9a78c48046a (patch)
treef6974ba3b91df6ca8da937254277c65eb3c9cae2 /share
parenteb84e0723f3b4bc5e40024f66fe21c14b09e9ec4 (diff)
parentfbe44d1207452eedc6fc9c1f386a335c5bda0e20 (diff)
downloadFreeBSD-src-6d77218901c68616c2f97486c813b9a78c48046a.zip
FreeBSD-src-6d77218901c68616c2f97486c813b9a78c48046a.tar.gz
Merge remote-tracking branch 'origin/stable/10' into devel
Diffstat (limited to 'share')
-rw-r--r--share/dtrace/Makefile5
-rwxr-xr-xshare/dtrace/watch_execve227
-rwxr-xr-xshare/dtrace/watch_kill232
-rwxr-xr-xshare/dtrace/watch_vop_remove476
-rw-r--r--share/man/man4/splash.412
-rw-r--r--share/mk/bsd.dep.mk17
6 files changed, 965 insertions, 4 deletions
diff --git a/share/dtrace/Makefile b/share/dtrace/Makefile
index adbdc84..39ca2a6 100644
--- a/share/dtrace/Makefile
+++ b/share/dtrace/Makefile
@@ -12,7 +12,10 @@ SUBDIR= ${_toolkit}
_toolkit= toolkit
.endif
-SCRIPTS= nfsclienttime hotopen
+SCRIPTS= nfsclienttime hotopen \
+ watch_execve \
+ watch_kill \
+ watch_vop_remove
SCRIPTSDIR= ${SHAREDIR}/dtrace
diff --git a/share/dtrace/watch_execve b/share/dtrace/watch_execve
new file mode 100755
index 0000000..1817d4b
--- /dev/null
+++ b/share/dtrace/watch_execve
@@ -0,0 +1,227 @@
+#!/usr/sbin/dtrace -s
+/* -
+ * Copyright (c) 2014 Devin Teske <dteske@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.
+ *
+ * $Title: dtrace(1) script to log process(es) entering syscall::execve $
+ * $FreeBSD$
+ */
+
+#pragma D option quiet
+#pragma D option dynvarsize=16m
+#pragma D option switchrate=10hz
+
+/*********************************************************/
+
+syscall::execve:entry /* probe ID 1 */
+{
+ this->caller_execname = execname;
+}
+
+/*********************************************************/
+
+syscall::execve:return /execname != this->caller_execname/ /* probe ID 2 */
+{
+ /*
+ * Examine process, parent process, and grandparent process details
+ */
+
+ /******************* CURPROC *******************/
+
+ this->proc = curthread->td_proc;
+ this->pid0 = this->proc->p_pid;
+ this->uid0 = this->proc->p_ucred->cr_uid;
+ this->gid0 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc->p_args;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg0_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_4 = this->ar_length > 0 ? "..." : "";
+
+ /******************* PPARENT *******************/
+
+ this->proc = this->proc->p_pptr;
+ this->pid1 = this->proc->p_pid;
+ this->uid1 = this->proc->p_ucred->cr_uid;
+ this->gid1 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc ? this->proc->p_args : 0;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg1_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_4 = this->ar_length > 0 ? "..." : "";
+
+ /******************* GPARENT *******************/
+
+ this->proc = this->proc->p_pptr;
+ this->pid2 = this->proc->p_pid;
+ this->uid2 = this->proc->p_ucred->cr_uid;
+ this->gid2 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc ? this->proc->p_args : 0;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg2_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_4 = this->ar_length > 0 ? "..." : "";
+
+ /******************* APARENT *******************/
+
+ this->proc = this->proc->p_pptr;
+ this->pid3 = this->proc->p_pid;
+ this->uid3 = this->proc->p_ucred->cr_uid;
+ this->gid3 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc ? this->proc->p_args : 0;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg3_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg3_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg3_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg3_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg3_4 = this->ar_length > 0 ? "..." : "";
+
+ /***********************************************/
+
+ /*
+ * Print process, parent, and grandparent details
+ */
+
+ printf("%Y %s[%d]: ", timestamp + 1406598400000000000,
+ this->caller_execname, this->pid1);
+ printf("%s", this->arg0_0);
+ printf("%s%s", this->arg0_1 != "" ? " " : "", this->arg0_1);
+ printf("%s%s", this->arg0_2 != "" ? " " : "", this->arg0_2);
+ printf("%s%s", this->arg0_3 != "" ? " " : "", this->arg0_3);
+ printf("%s%s", this->arg0_4 != "" ? " " : "", this->arg0_4);
+ printf("\n");
+
+ printf(" -+= %05d %d.%d %s",
+ this->pid3, this->uid3, this->gid3, this->arg3_0);
+ printf("%s%s", this->arg3_1 != "" ? " " : "", this->arg3_1);
+ printf("%s%s", this->arg3_2 != "" ? " " : "", this->arg3_2);
+ printf("%s%s", this->arg3_3 != "" ? " " : "", this->arg3_3);
+ printf("%s%s", this->arg3_4 != "" ? " " : "", this->arg3_4);
+ printf("%s", this->arg3_0 != "" ? "\n" : "");
+
+ printf(" \-+= %05d %d.%d %s",
+ this->pid2, this->uid2, this->gid2, this->arg2_0);
+ printf("%s%s", this->arg2_1 != "" ? " " : "", this->arg2_1);
+ printf("%s%s", this->arg2_2 != "" ? " " : "", this->arg2_2);
+ printf("%s%s", this->arg2_3 != "" ? " " : "", this->arg2_3);
+ printf("%s%s", this->arg2_4 != "" ? " " : "", this->arg2_4);
+ printf("%s", this->arg2_0 != "" ? "\n" : "");
+
+ printf(" \-+= %05d %d.%d %s",
+ this->pid1, this->uid1, this->gid1, this->arg1_0);
+ printf("%s%s", this->arg1_1 != "" ? " " : "", this->arg1_1);
+ printf("%s%s", this->arg1_2 != "" ? " " : "", this->arg1_2);
+ printf("%s%s", this->arg1_3 != "" ? " " : "", this->arg1_3);
+ printf("%s%s", this->arg1_4 != "" ? " " : "", this->arg1_4);
+ printf("%s", this->arg1_0 != "" ? "\n" : "");
+
+ printf(" \-+= %05d %d.%d %s",
+ this->pid0, this->uid0, this->gid0, this->arg0_0);
+ printf("%s%s", this->arg0_1 != "" ? " " : "", this->arg0_1);
+ printf("%s%s", this->arg0_2 != "" ? " " : "", this->arg0_2);
+ printf("%s%s", this->arg0_3 != "" ? " " : "", this->arg0_3);
+ printf("%s%s", this->arg0_4 != "" ? " " : "", this->arg0_4);
+ printf("%s", this->arg0_0 != "" ? "\n" : "");
+}
diff --git a/share/dtrace/watch_kill b/share/dtrace/watch_kill
new file mode 100755
index 0000000..46f3cd8
--- /dev/null
+++ b/share/dtrace/watch_kill
@@ -0,0 +1,232 @@
+#!/usr/sbin/dtrace -s
+/* -
+ * Copyright (c) 2014-2016 Devin Teske <dteske@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.
+ *
+ * $Title: dtrace(1) script to log process(es) entering syscall::kill $
+ * $FreeBSD$
+ */
+
+#pragma D option quiet
+#pragma D option dynvarsize=16m
+#pragma D option switchrate=10hz
+
+/*********************************************************/
+
+syscall::execve:entry /* probe ID 1 */
+{
+ this->caller_execname = execname;
+}
+
+/*********************************************************/
+
+syscall::kill:entry /* probe ID 2 */
+{
+ this->pid_to_kill = (pid_t)arg0;
+ this->kill_signal = (int)arg1;
+
+ /*
+ * Examine process, parent process, and grandparent process details
+ */
+
+ /******************* CURPROC *******************/
+
+ this->proc = curthread->td_proc;
+ this->pid0 = this->proc->p_pid;
+ this->uid0 = this->proc->p_ucred->cr_uid;
+ this->gid0 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc->p_args;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg0_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_4 = this->ar_length > 0 ? "..." : "";
+
+ /******************* PPARENT *******************/
+
+ this->proc = this->proc->p_pptr;
+ this->pid1 = this->proc->p_pid;
+ this->uid1 = this->proc->p_ucred->cr_uid;
+ this->gid1 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc ? this->proc->p_args : 0;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg1_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_4 = this->ar_length > 0 ? "..." : "";
+
+ /******************* GPARENT *******************/
+
+ this->proc = this->proc->p_pptr;
+ this->pid2 = this->proc->p_pid;
+ this->uid2 = this->proc->p_ucred->cr_uid;
+ this->gid2 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc ? this->proc->p_args : 0;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg2_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_4 = this->ar_length > 0 ? "..." : "";
+
+ /******************* APARENT *******************/
+
+ this->proc = this->proc->p_pptr;
+ this->pid3 = this->proc->p_pid;
+ this->uid3 = this->proc->p_ucred->cr_uid;
+ this->gid3 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc ? this->proc->p_args : 0;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg3_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg3_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg3_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg3_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg3_4 = this->ar_length > 0 ? "..." : "";
+
+ /***********************************************/
+
+ /*
+ * Print process, parent, and grandparent details
+ */
+
+ printf("%Y %s[%d]: ", timestamp + 1406598400000000000,
+ this->caller_execname, this->pid1);
+ printf("%s", this->arg0_0);
+ printf("%s%s", this->arg0_1 != "" ? " " : "", this->arg0_1);
+ printf("%s%s", this->arg0_2 != "" ? " " : "", this->arg0_2);
+ printf("%s%s", this->arg0_3 != "" ? " " : "", this->arg0_3);
+ printf("%s%s", this->arg0_4 != "" ? " " : "", this->arg0_4);
+ printf(" (sending signal %u to pid %u)",
+ this->kill_signal, this->pid_to_kill);
+ printf("\n");
+
+ printf(" -+= %05d %d.%d %s",
+ this->pid3, this->uid3, this->gid3, this->arg3_0);
+ printf("%s%s", this->arg3_1 != "" ? " " : "", this->arg3_1);
+ printf("%s%s", this->arg3_2 != "" ? " " : "", this->arg3_2);
+ printf("%s%s", this->arg3_3 != "" ? " " : "", this->arg3_3);
+ printf("%s%s", this->arg3_4 != "" ? " " : "", this->arg3_4);
+ printf("%s", this->arg3_0 != "" ? "\n" : "");
+
+ printf(" \-+= %05d %d.%d %s",
+ this->pid2, this->uid2, this->gid2, this->arg2_0);
+ printf("%s%s", this->arg2_1 != "" ? " " : "", this->arg2_1);
+ printf("%s%s", this->arg2_2 != "" ? " " : "", this->arg2_2);
+ printf("%s%s", this->arg2_3 != "" ? " " : "", this->arg2_3);
+ printf("%s%s", this->arg2_4 != "" ? " " : "", this->arg2_4);
+ printf("%s", this->arg2_0 != "" ? "\n" : "");
+
+ printf(" \-+= %05d %d.%d %s",
+ this->pid1, this->uid1, this->gid1, this->arg1_0);
+ printf("%s%s", this->arg1_1 != "" ? " " : "", this->arg1_1);
+ printf("%s%s", this->arg1_2 != "" ? " " : "", this->arg1_2);
+ printf("%s%s", this->arg1_3 != "" ? " " : "", this->arg1_3);
+ printf("%s%s", this->arg1_4 != "" ? " " : "", this->arg1_4);
+ printf("%s", this->arg1_0 != "" ? "\n" : "");
+
+ printf(" \-+= %05d %d.%d %s",
+ this->pid0, this->uid0, this->gid0, this->arg0_0);
+ printf("%s%s", this->arg0_1 != "" ? " " : "", this->arg0_1);
+ printf("%s%s", this->arg0_2 != "" ? " " : "", this->arg0_2);
+ printf("%s%s", this->arg0_3 != "" ? " " : "", this->arg0_3);
+ printf("%s%s", this->arg0_4 != "" ? " " : "", this->arg0_4);
+ printf("%s", this->arg0_0 != "" ? "\n" : "");
+}
diff --git a/share/dtrace/watch_vop_remove b/share/dtrace/watch_vop_remove
new file mode 100755
index 0000000..6a5e7c4
--- /dev/null
+++ b/share/dtrace/watch_vop_remove
@@ -0,0 +1,476 @@
+#!/usr/sbin/dtrace -s
+/* -
+ * Copyright (c) 2014 Devin Teske <dteske@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.
+ *
+ * $Title: dtrace(1) script to log process(es) entering vfs::vop_remove $
+ * $FreeBSD$
+ */
+
+#pragma D option quiet
+#pragma D option dynvarsize=16m
+#pragma D option switchrate=10hz
+
+/*********************************************************/
+
+vfs::vop_remove:entry /* probe ID 1 */
+{
+ this->vp = (struct vnode *)arg0;
+ this->ncp = &(this->vp->v_cache_dst) != NULL ?
+ this->vp->v_cache_dst.tqh_first : 0;
+ this->fi_name = args[1] ? (
+ args[1]->a_cnp != NULL ?
+ stringof(args[1]->a_cnp->cn_nameptr) : ""
+ ) : "";
+ this->mount = this->vp->v_mount; /* ptr to vfs we are in */
+ this->fi_fs = this->mount != 0 ?
+ stringof(this->mount->mnt_stat.f_fstypename) : "";
+ this->fi_mount = this->mount != 0 ?
+ stringof(this->mount->mnt_stat.f_mntonname) : "";
+ this->d_name = args[0]->v_cache_dd != NULL ?
+ stringof(args[0]->v_cache_dd->nc_name) : "";
+}
+
+vfs::vop_remove:entry /this->vp == 0 || this->fi_fs == 0 ||
+ this->fi_fs == "devfs" || this->fi_fs == "" ||
+ this->fi_name == ""/ /* probe ID 2 */
+{
+ this->ncp = 0;
+}
+
+/*********************************************************/
+
+vfs::vop_remove:entry /this->ncp/ /* probe ID 3 (depth 1) */
+{
+ this->dvp = this->ncp->nc_dvp != NULL ? (
+ &(this->ncp->nc_dvp->v_cache_dst) != NULL ?
+ this->ncp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name1 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->name1 == 0 || this->fi_fs == 0 ||
+ this->fi_fs == "devfs" || this->fi_fs == "" ||
+ this->name1 == "/" || this->name1 == ""/ /* probe ID 4 */
+{
+ this->dvp = 0;
+}
+
+/*********************************************************/
+
+/*
+ * BEGIN Pathname-depth iterators (copy/paste as many times as-desired)
+ */
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 5 (depth 2) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name2 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 6 (depth 3) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name3 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 7 (depth 4) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name4 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 8 (depth 5) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name5 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 9 (depth 6) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name6 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 10 (depth 7) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name7 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 11 (depth 8) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name8 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 12 (depth 9) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name9 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 13 (depth 10) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name10 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 14 (depth 11) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name11 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 15 (depth 12) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name12 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 16 (depth 13) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name13 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 17 (depth 14) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name14 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 18 (depth 15) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name15 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 19 (depth 16) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name16 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 20 (depth 17) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name17 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 21 (depth 18) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name18 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 22 (depth 19) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name19 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+vfs::vop_remove:entry /this->dvp/ /* probe ID 23 (depth 20) */
+{
+ this->dvp = this->dvp->nc_dvp != NULL ? (
+ &(this->dvp->nc_dvp->v_cache_dst) != NULL ?
+ this->dvp->nc_dvp->v_cache_dst.tqh_first : 0
+ ) : 0;
+ this->name20 = this->dvp != 0 ? (
+ this->dvp->nc_name != 0 ? stringof(this->dvp->nc_name) : ""
+ ) : "";
+}
+
+/*
+ * END Pathname-depth iterators
+ */
+
+/*********************************************************/
+
+vfs::vop_remove:entry /this->fi_mount != 0/ /* probe ID 24 */
+{
+ printf("%Y %s[%d]: ", timestamp + 1406598400000000000, execname, pid);
+
+ /*
+ * Print full path of file to delete
+ * NB: Up-to but not including the parent directory (printed below)
+ */
+ printf("%s%s", this->fi_mount, this->fi_mount != 0 ? (
+ this->fi_mount == "/" ? "" : "/"
+ ) : "/");
+ printf("%s%s", this->name = this->name20, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name19, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name18, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name17, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name16, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name15, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name14, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name13, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name12, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name11, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name10, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name9, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name8, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name7, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name6, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name5, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name4, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name3, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name2, this->name != "" ? "/" : "");
+ printf("%s%s", this->name = this->name1, this->name != "" ? "/" : "");
+
+ /* Print the parent directory name */
+ this->name = this->d_name != 0 ? this->d_name : "";
+ printf("%s%s", this->name, this->name != "" ? "/" : "");
+
+ /* Print the entry name */
+ this->name = this->fi_name != 0 ? this->fi_name : "";
+ printf("%s", this->name);
+
+ printf("\n");
+
+ /*
+ * Examine process, parent process, and grandparent process details
+ */
+
+ /******************* CURPROC *******************/
+
+ this->proc = curthread->td_proc;
+ this->pid0 = this->proc->p_pid;
+ this->uid0 = this->proc->p_ucred->cr_uid;
+ this->gid0 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc->p_args;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg0_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg0_4 = this->ar_length > 0 ? "..." : "";
+
+ /******************* PPARENT *******************/
+
+ this->proc = this->proc->p_pptr;
+ this->pid1 = this->proc->p_pid;
+ this->uid1 = this->proc->p_ucred->cr_uid;
+ this->gid1 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc ? this->proc->p_args : 0;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg1_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg1_4 = this->ar_length > 0 ? "..." : "";
+
+ /******************* GPARENT *******************/
+
+ this->proc = this->proc->p_pptr;
+ this->pid2 = this->proc->p_pid;
+ this->uid2 = this->proc->p_ucred->cr_uid;
+ this->gid2 = this->proc->p_ucred->cr_rgid;
+ this->p_args = this->proc ? this->proc->p_args : 0;
+ this->ar_length = this->p_args ? this->p_args->ar_length : 0;
+ this->ar_args = (char *)(this->p_args ? this->p_args->ar_args : 0);
+
+ this->arg2_0 = this->ar_length > 0 ?
+ this->ar_args : stringof(this->proc->p_comm);
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_1 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_2 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_3 = this->ar_length > 0 ? this->ar_args : "";
+ this->len = this->ar_length > 0 ? strlen(this->ar_args) + 1 : 0;
+ this->ar_args += this->len;
+ this->ar_length -= this->len;
+
+ this->arg2_4 = this->ar_length > 0 ? "..." : "";
+
+ /***********************************************/
+
+ /*
+ * Print process, parent, and grandparent details
+ */
+
+ printf(" -+= %05d %d.%d %s",
+ this->pid2, this->uid2, this->gid2, this->arg2_0);
+ printf("%s%s", this->arg2_1 != "" ? " " : "", this->arg2_1);
+ printf("%s%s", this->arg2_2 != "" ? " " : "", this->arg2_2);
+ printf("%s%s", this->arg2_3 != "" ? " " : "", this->arg2_3);
+ printf("%s%s", this->arg2_4 != "" ? " " : "", this->arg2_4);
+ printf("%s", this->arg2_0 != "" ? "\n" : "");
+
+ printf(" \-+= %05d %d.%d %s",
+ this->pid1, this->uid1, this->gid1, this->arg1_0);
+ printf("%s%s", this->arg1_1 != "" ? " " : "", this->arg1_1);
+ printf("%s%s", this->arg1_2 != "" ? " " : "", this->arg1_2);
+ printf("%s%s", this->arg1_3 != "" ? " " : "", this->arg1_3);
+ printf("%s%s", this->arg1_4 != "" ? " " : "", this->arg1_4);
+ printf("%s", this->arg1_0 != "" ? "\n" : "");
+
+ printf(" \-+= %05d %d.%d %s",
+ this->pid0, this->uid0, this->gid0, this->arg0_0);
+ printf("%s%s", this->arg0_1 != "" ? " " : "", this->arg0_1);
+ printf("%s%s", this->arg0_2 != "" ? " " : "", this->arg0_2);
+ printf("%s%s", this->arg0_3 != "" ? " " : "", this->arg0_3);
+ printf("%s%s", this->arg0_4 != "" ? " " : "", this->arg0_4);
+ printf("%s", this->arg0_0 != "" ? "\n" : "");
+}
diff --git a/share/man/man4/splash.4 b/share/man/man4/splash.4
index 2a9a297..c53828f 100644
--- a/share/man/man4/splash.4
+++ b/share/man/man4/splash.4
@@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd November 29, 2010
+.Dd December 31, 2015
.Dt SPLASH 4
.Os
.Sh NAME
@@ -130,6 +130,8 @@ the screen will also be powered off.
Animated graphical
.Fx
logo.
+.It Pa plasma_saver.ko
+Draws an animated interference pattern.
.It Pa rain_saver.ko
Draws a shower on the screen.
.It Pa snake_saver.ko
@@ -282,6 +284,14 @@ based on the
code, with some additional inspiration from the
.Pa daemon_saver
code.
+The
+.Pa logo_saver ,
+.Pa plasma_saver ,
+.Pa rain_saver
+and
+.Pa warp_saver
+modules were written by
+.An Dag-Erling Sm\(/orgrav Aq Mt des@FreeBSD.org .
.Sh CAVEATS
Both the splash screen and the screen saver work with
.Xr syscons 4
diff --git a/share/mk/bsd.dep.mk b/share/mk/bsd.dep.mk
index d59ed28..3e49a6e 100644
--- a/share/mk/bsd.dep.mk
+++ b/share/mk/bsd.dep.mk
@@ -160,12 +160,25 @@ depend: beforedepend ${DEPENDFILE} afterdepend
# Tell bmake not to look for generated files via .PATH
.NOPATH: ${DEPENDFILE}
+# Capture -include from CFLAGS.
+# This could be simpler with bmake :tW but needs to support fmake for MFC.
+_CFLAGS_INCLUDES= ${CFLAGS:Q:S/\\ /,/g:C/-include,/-include%/g:C/,/ /g:M-include*:C/%/ /g}
+_CXXFLAGS_INCLUDES= ${CXXFLAGS:Q:S/\\ /,/g:C/-include,/-include%/g:C/,/ /g:M-include*:C/%/ /g}
+# XXX: Temporary hack to workaround .depend files not tracking -include
+.if !empty(_CFLAGS_INCLUDES)
+${OBJS} ${POBJS} ${SOBJS}: ${_CFLAGS_INCLUDES:M*.h}
+.endif
+.if !empty(_CXXFLAGS_INCLUDES)
+${OBJS} ${POBJS} ${SOBJS}: ${_CXXFLAGS_INCLUDES:M*.h}
+.endif
+
# Different types of sources are compiled with slightly different flags.
# Split up the sources, and filter out headers and non-applicable flags.
MKDEP_CFLAGS= ${CFLAGS:M-nostdinc*} ${CFLAGS:M-[BIDU]*} ${CFLAGS:M-std=*} \
- ${CFLAGS:M-ansi}
+ ${CFLAGS:M-ansi} ${_CFLAGS_INCLUDES}
MKDEP_CXXFLAGS= ${CXXFLAGS:M-nostdinc*} ${CXXFLAGS:M-[BIDU]*} \
- ${CXXFLAGS:M-std=*} ${CXXFLAGS:M-ansi} ${CXXFLAGS:M-stdlib=*}
+ ${CXXFLAGS:M-std=*} ${CXXFLAGS:M-ansi} ${CXXFLAGS:M-stdlib=*} \
+ ${_CXXFLAGS_INCLUDES}
DPSRCS+= ${SRCS}
${DEPENDFILE}: ${DPSRCS}
OpenPOWER on IntegriCloud