diff options
Diffstat (limited to 'libexec/rc/rc.d/savecore')
-rwxr-xr-x | libexec/rc/rc.d/savecore | 85 |
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" |