summaryrefslogtreecommitdiffstats
path: root/sbin/savecore
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2002-04-03 07:24:12 +0000
committermarcel <marcel@FreeBSD.org>2002-04-03 07:24:12 +0000
commit0dbbe50955903ed143bea85061e98780e7fb4da4 (patch)
treeb6dcb5afbd5f2f972055f768371369118ac773e8 /sbin/savecore
parent8d96cdfea385d755723b1d9b0f2d33d9b3a368a5 (diff)
downloadFreeBSD-src-0dbbe50955903ed143bea85061e98780e7fb4da4.zip
FreeBSD-src-0dbbe50955903ed143bea85061e98780e7fb4da4.tar.gz
Make the kernel dump header endianness invariant by always dumping
in dump byte order (=network byte order). Swap blocksize and dumptime to avoid extraneous padding on 64-bit architectures. Use CTASSERT instead of runtime checks to make sure the header is 512 bytes large. Various style(9) fixes. Reviewed by: phk, bde, mike
Diffstat (limited to 'sbin/savecore')
-rw-r--r--sbin/savecore/savecore.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/sbin/savecore/savecore.c b/sbin/savecore/savecore.c
index 846aaac..078bb3a 100644
--- a/sbin/savecore/savecore.c
+++ b/sbin/savecore/savecore.c
@@ -48,24 +48,28 @@
#include <sys/kerneldump.h>
static void
-printheader(FILE *f, const struct kerneldumpheader *h, const char *devname, const char *md5)
+printheader(FILE *f, const struct kerneldumpheader *h, const char *devname,
+ const char *md5)
{
+ uint64_t dumplen;
time_t t;
fprintf(f, "Good dump found on device %s\n", devname);
fprintf(f, " Architecture: %s\n", h->architecture);
- fprintf(f, " Architecture version: %d\n", h->architectureversion);
- fprintf(f, " Dump length: %lldB (%lld MB)\n",
- (long long)h->dumplength, (long long)h->dumplength / (1024 * 1024));
- fprintf(f, " Blocksize: %d\n", h->blocksize);
- t = h->dumptime;
+ fprintf(f, " Architecture version: %d\n",
+ dtoh32(h->architectureversion));
+ dumplen = dtoh64(h->dumplength);
+ fprintf(f, " Dump length: %lldB (%lld MB)\n", (long long)dumplen,
+ (long long)(dumplen >> 20));
+ fprintf(f, " Blocksize: %d\n", dtoh32(h->blocksize));
+ t = dtoh64(h->dumptime);
fprintf(f, " Dumptime: %s", ctime(&t));
fprintf(f, " Hostname: %s\n", h->hostname);
fprintf(f, " Versionstring: %s", h->versionstring);
fprintf(f, " Panicstring: %s\n", h->panicstring);
fprintf(f, " MD5: %s\n", md5);
}
-
+
static void
DoFile(const char *devname)
@@ -109,12 +113,13 @@ DoFile(const char *devname)
warnx("Magic mismatch on last dump header on %s\n", devname);
return;
}
- if (kdhl.version != KERNELDUMPVERSION) {
+ if (dtoh32(kdhl.version) != KERNELDUMPVERSION) {
warnx("Unknown version (%d) in last dump header on %s\n",
- kdhl.version, devname);
+ dtoh32(kdhl.version), devname);
return;
}
- firsthd = lasthd - kdhl.dumplength - sizeof kdhf;
+ dumpsize = dtoh64(kdhl.dumplength);
+ firsthd = lasthd - dumpsize - sizeof kdhf;
lseek(fd, firsthd, SEEK_SET);
error = read(fd, &kdhf, sizeof kdhf);
if (error != sizeof kdhf) {
@@ -146,7 +151,6 @@ DoFile(const char *devname)
info = fdopen(fdinfo, "w");
printheader(stdout, &kdhl, devname, md5);
printheader(info, &kdhl, devname, md5);
- dumpsize = kdhl.dumplength;
printf("Saving dump to file...\n");
while (dumpsize > 0) {
wl = sizeof(buf);
OpenPOWER on IntegriCloud