aboutsummaryrefslogtreecommitdiff
path: root/libexec/rc/rc.d/savecore
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/rc/rc.d/savecore')
-rwxr-xr-xlibexec/rc/rc.d/savecore85
1 files changed, 85 insertions, 0 deletions
diff --git a/libexec/rc/rc.d/savecore b/libexec/rc/rc.d/savecore
new file mode 100755
index 000000000000..889476591dac
--- /dev/null
+++ b/libexec/rc/rc.d/savecore
@@ -0,0 +1,85 @@
+#!/bin/sh
+#
+#
+
+# PROVIDE: savecore
+# REQUIRE: dumpon ddb syslogd
+# KEYWORD: nojail
+
+. /etc/rc.subr
+
+name="savecore"
+rcvar="savecore_enable"
+desc="Save a core dump of the operating system"
+start_cmd="savecore_start"
+start_precmd="savecore_prestart"
+stop_cmd=":"
+
+savecore_prestart()
+{
+ # Quit if we have no dump device
+ case ${dumpdev} in
+ [Nn][Oo])
+ debug 'No dump device. Quitting.'
+ return 1
+ ;;
+ [Aa][Uu][Tt][Oo] | '')
+ if [ ! -L /dev/dumpdev ]; then
+ return 1
+ fi
+ dumpdev=`/bin/realpath /dev/dumpdev`
+ ;;
+ esac
+
+ # If there is no crash directory set it now
+ case ${dumpdir} in
+ '')
+ dumpdir='/var/crash'
+ ;;
+ [Nn][Oo])
+ dumpdir='NO'
+ ;;
+ esac
+
+ if [ ! -c "${dumpdev}" ]; then
+ warn "Dump device does not exist. Savecore not run."
+ return 1
+ fi
+
+ if [ ! -d "${dumpdir}" ]; then
+ warn "Dump directory does not exist. Savecore not run."
+ return 1
+ fi
+ return 0
+}
+
+savecore_start()
+{
+ local dev
+
+ case "${dumpdev}" in
+ [Aa][Uu][Tt][Oo])
+ dev=
+ ;;
+ *)
+ dev="${dumpdev}"
+ ;;
+ esac
+
+ if savecore -C "${dev}" >/dev/null; then
+ savecore ${savecore_flags} ${dumpdir} ${dumpdev}
+ if checkyesno crashinfo_enable; then
+ ${crashinfo_program} -b -d ${dumpdir}
+ fi
+ sync
+ else
+ startmsg 'No core dumps found.'
+ fi
+}
+
+load_rc_config $name
+
+# doesn't make sense to run in a svcj
+savecore_svcj="NO"
+
+run_rc_command "$1"