diff options
author | alfred <alfred@FreeBSD.org> | 2012-11-01 18:59:19 +0000 |
---|---|---|
committer | alfred <alfred@FreeBSD.org> | 2012-11-01 18:59:19 +0000 |
commit | feaa48d2461847ea8493e2adf55cefd9eda50922 (patch) | |
tree | 426c892bee4a9ac4675f3f885f35919db488ad1a /sbin/dumpon | |
parent | d41a37236203c5aea20f68a8813bc80ac296d57d (diff) | |
download | FreeBSD-src-feaa48d2461847ea8493e2adf55cefd9eda50922.zip FreeBSD-src-feaa48d2461847ea8493e2adf55cefd9eda50922.tar.gz |
Add an option to display the current dump device via dumpon -l.
MFC after: 2 weeks
Diffstat (limited to 'sbin/dumpon')
-rw-r--r-- | sbin/dumpon/dumpon.8 | 9 | ||||
-rw-r--r-- | sbin/dumpon/dumpon.c | 43 |
2 files changed, 49 insertions, 3 deletions
diff --git a/sbin/dumpon/dumpon.8 b/sbin/dumpon/dumpon.8 index ff47bcb..e60d5f8 100644 --- a/sbin/dumpon/dumpon.8 +++ b/sbin/dumpon/dumpon.8 @@ -41,6 +41,8 @@ .Nm .Op Fl v .Cm off +.Nm +.Fl l .Sh DESCRIPTION The .Nm @@ -72,6 +74,13 @@ total amount of physical memory as reported by the variable. .Pp The +.Fl l +flag causes +.Nm +to print the current dump device or _PATH_DEVNULL ("/dev/null") if no device is +configured. +.Pp +The .Fl v flag causes .Nm diff --git a/sbin/dumpon/dumpon.c b/sbin/dumpon/dumpon.c index 73d46b0..ac73399 100644 --- a/sbin/dumpon/dumpon.c +++ b/sbin/dumpon/dumpon.c @@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$"); #include <sys/sysctl.h> #include <err.h> +#include <errno.h> #include <fcntl.h> #include <paths.h> #include <stdint.h> @@ -60,9 +61,10 @@ static int verbose; static void usage(void) { - fprintf(stderr, "%s\n%s\n", + fprintf(stderr, "%s\n%s\n%s\n", "usage: dumpon [-v] special_file", - " dumpon [-v] off"); + " dumpon [-v] off", + " dumpon -l"); exit(EX_USAGE); } @@ -92,15 +94,45 @@ check_size(int fd, const char *fn) } } +static void +listdumpdev(void) +{ + char dumpdev[PATH_MAX]; + size_t len; + const char *sysctlname = "kern.shutdown.dumpdevname"; + + len = sizeof(dumpdev); + if (sysctlbyname(sysctlname, &dumpdev, &len, NULL, 0) != 0) { + if (errno == ENOMEM) { + err(EX_OSERR, "Kernel returned too large of a buffer for '%s'\n", + sysctlname); + } else { + err(EX_OSERR, "Sysctl get '%s'\n", sysctlname); + } + } + if (verbose) { + printf("kernel dumps on "); + } + if (strlen(dumpdev) == 0) { + printf("%s\n", _PATH_DEVNULL); + } else { + printf("%s\n", dumpdev); + } +} + int main(int argc, char *argv[]) { int ch; int i, fd; u_int u; + int do_listdumpdev = 0; - while ((ch = getopt(argc, argv, "v")) != -1) + while ((ch = getopt(argc, argv, "lv")) != -1) switch((char)ch) { + case 'l': + do_listdumpdev = 1; + break; case 'v': verbose = 1; break; @@ -111,6 +143,11 @@ main(int argc, char *argv[]) argc -= optind; argv += optind; + if (do_listdumpdev) { + listdumpdev(); + exit(EX_OK); + } + if (argc != 1) usage(); |