diff options
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/savecore/savecore.8 | 12 | ||||
-rw-r--r-- | sbin/savecore/savecore.c | 24 |
2 files changed, 32 insertions, 4 deletions
diff --git a/sbin/savecore/savecore.8 b/sbin/savecore/savecore.8 index 5ec8799..cd8518b 100644 --- a/sbin/savecore/savecore.8 +++ b/sbin/savecore/savecore.8 @@ -42,6 +42,10 @@ .Nm .Fl c .Nm +.Fl C +.Op Fl v +.Op Ar directory device +.Nm .Op Fl fkvz .Op Ar directory Op Ar device ... .Sh DESCRIPTION @@ -58,6 +62,14 @@ the system log. .Pp The options are as follows: .Bl -tag -width indent +.It Fl C +Check to see if a dump exists, +and display a brief message to indicate the status. +An exit status of 0 indicates that a dump is there, +1 indicates that none exists. +This option is compatible only with the +.Op Fl v +option. .It Fl c Clear the dump, so that future invocations of .Nm diff --git a/sbin/savecore/savecore.c b/sbin/savecore/savecore.c index 019d184..c7b4f1f 100644 --- a/sbin/savecore/savecore.c +++ b/sbin/savecore/savecore.c @@ -88,7 +88,7 @@ __FBSDID("$FreeBSD$"); /* The size of the buffer used for I/O. */ #define BUFFERSIZE (1024*1024) -int compress, clear, force, keep, verbose; /* flags */ +int checkfor, compress, clear, force, keep, verbose; /* flags */ int nfound, nsaved, nerr; /* statistics */ extern FILE *zopen(const char *, const char *); @@ -321,6 +321,12 @@ DoFile(char *savedir, const char *device) goto closefd; } + if (checkfor) { + printf("A dump exists on %s\n", device); + close(fd); + exit(0); + } + if (kdhl.panicstring[0]) syslog(LOG_ALERT, "reboot after panic: %s", kdhl.panicstring); else @@ -478,7 +484,7 @@ closefd: static void usage(void) { - fprintf(stderr, "usage: savecore [-cfkv] [directory [device...]]\n"); + fprintf(stderr, "usage: savecore [-Cv|-cfkv] [directory [device...]]\n"); exit (1); } @@ -496,8 +502,11 @@ main(int argc, char **argv) syslog(LOG_ERR, "Cannot allocate memory"); exit(1); } - while ((ch = getopt(argc, argv, "cdfkN:vz")) != -1) + while ((ch = getopt(argc, argv, "CcdfkN:vz")) != -1) switch(ch) { + case 'C': + checkfor = 1; + break; case 'c': clear = 1; break; @@ -519,6 +528,8 @@ main(int argc, char **argv) default: usage(); } + if (checkfor && (clear || force || keep)) + usage(); argc -= optind; argv += optind; if (argc >= 1) { @@ -547,8 +558,13 @@ main(int argc, char **argv) } /* Emit minimal output. */ - if (nfound == 0) + if (nfound == 0) { + if (checkfor) { + printf("No dump exists\n"); + exit(1); + } syslog(LOG_WARNING, "no dumps found"); + } else if (nsaved == 0) { if (nerr != 0) syslog(LOG_WARNING, "unsaved dumps found but not saved"); |