diff options
author | dougb <dougb@FreeBSD.org> | 2003-09-04 10:07:01 +0000 |
---|---|---|
committer | dougb <dougb@FreeBSD.org> | 2003-09-04 10:07:01 +0000 |
commit | 724364937f46aff1745c4eb77eac7867eb5cddf1 (patch) | |
tree | 331b17dab23808bef2db1a9cff5cda15a4366424 /sbin/savecore/savecore.c | |
parent | 480778ce65fd1888aac1652a022fa301036ad443 (diff) | |
download | FreeBSD-src-724364937f46aff1745c4eb77eac7867eb5cddf1.zip FreeBSD-src-724364937f46aff1745c4eb77eac7867eb5cddf1.tar.gz |
Add a flag that reports the existence of a dump, and does nothing else.
The immediate purpose for this option is to use it in rc.d so that we
can make savecore behavior conditional.
Tremendous assistance with ideas and sanity checking provided by tjr
and b@etek.chalmers.se.
Diffstat (limited to 'sbin/savecore/savecore.c')
-rw-r--r-- | sbin/savecore/savecore.c | 24 |
1 files changed, 20 insertions, 4 deletions
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"); |