Cleanup headers and replace the zero padding with an even smaller version.

One of the pads turned out to be unnecessary: sizeof(struct TarHeader) is
TAR_BLOCK_SIZE, the padding's in the struct.  The others could be done inline
with bb_common_bufsiz1.

This is a cleanup I did to Denis' patch long ago, but got sidetracked by
what turned into svn 15660.
This commit is contained in:
Rob Landley 2006-09-10 03:20:37 +00:00
parent 9852d5a1e6
commit 1bfca7bac7

View File

@ -23,21 +23,10 @@
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/ */
#include <fcntl.h>
#include <getopt.h>
#include <search.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fnmatch.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/sysmacros.h> /* major() and minor() */
#include "unarchive.h"
#include "busybox.h" #include "busybox.h"
#include "unarchive.h"
#include <fnmatch.h>
#include <getopt.h>
#ifdef CONFIG_FEATURE_TAR_CREATE #ifdef CONFIG_FEATURE_TAR_CREATE
@ -192,26 +181,6 @@ static int putOctal(char *cp, int len, long value)
return TRUE; return TRUE;
} }
/* Pad file to TAR_BLOCK_SIZE with zeros */
static void block_write_zeroes(int fd, size_t size)
{
char zerobuf[TAR_BLOCK_SIZE];
memset(zerobuf, 0, size);
/* No point in trying to continue on error */
if (full_write(fd, zerobuf, size) < 0)
bb_perror_msg_and_die("write");
}
static size_t pad_block_write(int fd, size_t size)
{
size_t rem = (TAR_BLOCK_SIZE - size) & (TAR_BLOCK_SIZE-1);
if (rem) {
block_write_zeroes(fd, rem);
size += rem;
}
return size;
}
/* Write out a tar header for the specified file/directory/whatever */ /* Write out a tar header for the specified file/directory/whatever */
static int writeTarHeader(struct TarBallInfo *tbInfo, static int writeTarHeader(struct TarBallInfo *tbInfo,
const char *header_name, const char *fileName, struct stat *statbuf) const char *header_name, const char *fileName, struct stat *statbuf)
@ -221,7 +190,7 @@ static int writeTarHeader(struct TarBallInfo *tbInfo,
const unsigned char *cp = (const unsigned char *) &header; const unsigned char *cp = (const unsigned char *) &header;
ssize_t size = sizeof(struct TarHeader); ssize_t size = sizeof(struct TarHeader);
memset(&header, 0, size); bzero(&header, size);
safe_strncpy(header.name, header_name, sizeof(header.name)); safe_strncpy(header.name, header_name, sizeof(header.name));
@ -288,14 +257,7 @@ static int writeTarHeader(struct TarBallInfo *tbInfo,
putOctal(header.chksum, 7, chksum); putOctal(header.chksum, 7, chksum);
/* Now write the header out to disk */ /* Now write the header out to disk */
size = full_write(tbInfo->tarFd, (char *) &header, xwrite(tbInfo->tarFd, &header, sizeof(struct TarHeader));
sizeof(struct TarHeader));
if (size < 0) {
bb_error_msg(bb_msg_io_error, fileName);
return FALSE;
}
/* Pad the header up to the tar block size */
size = pad_block_write(tbInfo->tarFd, size);
/* Now do the verbose thing (or not) */ /* Now do the verbose thing (or not) */
@ -421,7 +383,9 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf,
close(inputFileFd); close(inputFileFd);
/* Pad the file up to the tar block size */ /* Pad the file up to the tar block size */
readSize = pad_block_write(tbInfo->tarFd, readSize); readSize = (TAR_BLOCK_SIZE - readSize) & (TAR_BLOCK_SIZE-1);
bzero(bb_common_bufsiz1, readSize);
xwrite(tbInfo->tarFd, bb_common_bufsiz1, readSize);
} }
return TRUE; return TRUE;
@ -516,8 +480,8 @@ static int writeTarFile(const int tar_fd, const int verboseFlag,
include = include->link; include = include->link;
} }
/* Write two empty blocks to the end of the archive */ /* Write two empty blocks to the end of the archive */
block_write_zeroes(tbInfo.tarFd, TAR_BLOCK_SIZE); bzero(bb_common_bufsiz1, 2*TAR_BLOCK_SIZE);
block_write_zeroes(tbInfo.tarFd, TAR_BLOCK_SIZE); xwrite(tbInfo.tarFd, bb_common_bufsiz1, 2*TAR_BLOCK_SIZE);
/* To be pedantically correct, we would check if the tarball /* To be pedantically correct, we would check if the tarball
* is smaller than 20 tar blocks, and pad it if it was smaller, * is smaller than 20 tar blocks, and pad it if it was smaller,