diff --git a/sbin/savecore/Makefile b/sbin/savecore/Makefile index 917c9c9a2c2e..e0d1d088db55 100644 --- a/sbin/savecore/Makefile +++ b/sbin/savecore/Makefile @@ -2,11 +2,10 @@ # $FreeBSD$ PROG= savecore -SRCS= savecore.c zopen.c +SRCS= savecore.c MAN= savecore.8 -ZOPENPATH= ${.CURDIR}/../../usr.bin/compress -.PATH: ${ZOPENPATH} -CFLAGS+= -I${ZOPENPATH} +DPADD+= ${LIBZ} +LDADD+= -lz .include diff --git a/sbin/savecore/savecore.8 b/sbin/savecore/savecore.8 index adab4148c429..0d99694e4fe1 100644 --- a/sbin/savecore/savecore.8 +++ b/sbin/savecore/savecore.8 @@ -72,7 +72,7 @@ as the kernel instead of the running kernel (as determined from Print out some additional debugging information. .It Fl z Compress the core dump and kernel (see -.Xr compress 1 ) . +.Xr gzip 1 ) . .El .Pp .Nm Savecore @@ -113,8 +113,8 @@ is meant to be called near the end of the initialization file .Sh BUGS The minfree code does not consider the effect of compression. .Sh SEE ALSO -.Xr compress 1 , .Xr getbootfile 3 , +.Xr gzip 1 , .Xr syslogd 8 .Sh HISTORY The diff --git a/sbin/savecore/savecore.c b/sbin/savecore/savecore.c index 5e1a00184ae1..966d18a2d227 100644 --- a/sbin/savecore/savecore.c +++ b/sbin/savecore/savecore.c @@ -63,7 +63,8 @@ static const char rcsid[] = #include #include #include -#include "zopen.h" + +extern FILE *zopen(const char *fname, const char *mode); #ifdef __alpha__ #define ok(number) ALPHA_K0SEG_TO_PHYS(number) @@ -138,7 +139,6 @@ void find_dev __P((dev_t)); int get_crashtime __P((void)); void get_dumpsize __P((void)); void kmem_setup __P((void)); -void log __P((int, char *, ...)) __printflike(2, 3); void Lseek __P((int, off_t, int)); int Open __P((const char *, int rw)); int Read __P((int, void *, int)); @@ -289,7 +289,7 @@ kmem_setup() if (kernel) return; - lseek(kmem, (off_t)current_nl[X_VERSION].n_value, SEEK_SET); + Lseek(kmem, (off_t)current_nl[X_VERSION].n_value, SEEK_SET); Read(kmem, vers, sizeof(vers)); vers[sizeof(vers) - 1] = '\0'; p = strchr(vers, '\n'); @@ -398,9 +398,9 @@ err1: syslog(LOG_WARNING, "%s: %m", path); /* Create the core file. */ oumask = umask(S_IRWXG|S_IRWXO); /* Restrict access to the core file.*/ (void)snprintf(path, sizeof(path), "%s/vmcore.%d%s", - savedir, bounds, compress ? ".Z" : ""); + savedir, bounds, compress ? ".gz" : ""); if (compress) - fp = zopen(path, "w", 0); + fp = zopen(path, "w"); else fp = fopen(path, "w"); if (fp == NULL) { @@ -427,41 +427,45 @@ err1: syslog(LOG_WARNING, "%s: %m", path); syslog(LOG_ERR, "%s: %m", ddname); goto err2; } - for (nw = 0; nw < nr; nw = he) { - /* find a contiguous block of zeroes */ - for (hs = nw; hs < nr; hs += BLOCKSIZE) { - for (he = hs; he < nr && buf[he] == 0; ++he) - /* nothing */ ; + if (compress) { + nw = fwrite(buf, 1, nr, fp); + } else { + for (nw = 0; nw < nr; nw = he) { + /* find a contiguous block of zeroes */ + for (hs = nw; hs < nr; hs += BLOCKSIZE) { + for (he = hs; he < nr && buf[he] == 0; ++he) + /* nothing */ ; /* is the hole long enough to matter? */ if (he >= hs + BLOCKSIZE) - break; - } + break; + } - /* back down to a block boundary */ - he &= BLOCKMASK; + /* back down to a block boundary */ + he &= BLOCKMASK; - /* - * 1) Don't go beyond the end of the buffer. - * 2) If the end of the buffer is less than - * BLOCKSIZE bytes away, we're at the end - * of the file, so just grab what's left. - */ - if (hs + BLOCKSIZE > nr) + /* + * 1) Don't go beyond the end of the buffer. + * 2) If the end of the buffer is less than + * BLOCKSIZE bytes away, we're at the end + * of the file, so just grab what's left. + */ + if (hs + BLOCKSIZE > nr) hs = he = nr; - /* - * At this point, we have a partial ordering: - * nw <= hs <= he <= nr - * If hs > nw, buf[nw..hs] contains non-zero data. - * If he > hs, buf[hs..he] is all zeroes. - */ - if (hs > nw) + /* + * At this point, we have a partial ordering: + * nw <= hs <= he <= nr + * If hs > nw, buf[nw..hs] contains non-zero data. + * If he > hs, buf[hs..he] is all zeroes. + */ + if (hs > nw) if (fwrite(buf + nw, hs - nw, 1, fp) != 1) - break; - if (he > hs) + break; + if (he > hs) if (fseek(fp, he - hs, SEEK_CUR) == -1) - break; + break; + } } if (nw != nr) { syslog(LOG_ERR, "%s: %m", path); @@ -477,9 +481,9 @@ err2: syslog(LOG_WARNING, /* Copy the kernel. */ ifd = Open(kernel ? kernel : getbootfile(), O_RDONLY); (void)snprintf(path, sizeof(path), "%s/kernel.%d%s", - savedir, bounds, compress ? ".Z" : ""); + savedir, bounds, compress ? ".gz" : ""); if (compress) - fp = zopen(path, "w", 0); + fp = zopen(path, "w"); else fp = fopen(path, "w"); if (fp == NULL) {