/* vi: set sw=4 ts=4: */
/*
 * Mini tar implementation for busybox based on code taken from sash.
 *
 * Copyright (c) 1999 by David I. Bell
 * Permission is granted to use, distribute, or modify this source,
 * provided that this copyright notice remains intact.
 *
 * Permission to distribute this code under the GPL has been granted.
 *
 * Modified for busybox by Erik Andersen <andersee@debian.org>
 * Adjusted to grok stdin/stdout options.
 *
 * Modified to handle device special files by Matt Porter
 * <porter@debian.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */


#include "internal.h"
#include <stdio.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <time.h>
#include <utime.h>
#include <sys/types.h>
#include <sys/sysmacros.h>
#include <sys/param.h>			/* for PATH_MAX */


#ifdef BB_FEATURE_TAR_CREATE

static const char tar_usage[] =
	"tar -[cxtvOf] [tarFileName] [FILE] ...\n\n"
	"Create, extract, or list files from a tar file.\n\n"
	"Options:\n"

	"\tc=create, x=extract, t=list contents, v=verbose,\n"
	"\tO=extract to stdout, f=tarfile or \"-\" for stdin\n";

#else

static const char tar_usage[] =
	"tar -[xtvOf] [tarFileName] [FILE] ...\n\n"
	"Extract, or list files stored in a tar file.  This\n"
	"version of tar does not support creation of tar files.\n\n"
	"Options:\n"

	"\tx=extract, t=list contents, v=verbose,\n"
	"\tO=extract to stdout, f=tarfile or \"-\" for stdin\n";

#endif


/*
 * Tar file constants.
 */
#define TAR_BLOCK_SIZE	512
#define TAR_NAME_SIZE	100


/*
 * The POSIX (and basic GNU) tar header format.
 * This structure is always embedded in a TAR_BLOCK_SIZE sized block
 * with zero padding.  We only process this information minimally.
 */
typedef struct {
	char name[TAR_NAME_SIZE];
	char mode[8];
	char uid[8];
	char gid[8];
	char size[12];
	char mtime[12];
	char checkSum[8];
	char typeFlag;
	char linkName[TAR_NAME_SIZE];
	char magic[6];
	char version[2];
	char uname[32];
	char gname[32];
	char devMajor[8];
	char devMinor[8];
	char prefix[155];
} TarHeader;

#define	TAR_MAGIC	"ustar"
#define	TAR_VERSION	"00"

#define	TAR_TYPE_REGULAR	'0'
#define	TAR_TYPE_HARD_LINK	'1'
#define	TAR_TYPE_SOFT_LINK	'2'


/*
 * Static data.
 */
static int listFlag;
static int extractFlag;
static int createFlag;
static int verboseFlag;
static int tostdoutFlag;

static int inHeader;			// <- check me
static int badHeader;
static int errorFlag;
static int skipFileFlag;
static int warnedRoot;
static int eofFlag;
static long dataCc;
static int outFd;
static const char *outName;

static int mode;
static int uid;
static int gid;
static time_t mtime;

/*
 * Static data associated with the tar file.
 */
static const char *tarName;
static int tarFd;
static dev_t tarDev;
static ino_t tarInode;


/*
 * Local procedures to restore files from a tar file.
 */
static void readTarFile(int fileCount, char **fileTable);
static void readData(const char *cp, int count);
static long getOctal(const char *cp, int len);

static void readHeader(const TarHeader * hp,

					   int fileCount, char **fileTable);

static int wantFileName(const char *fileName,

						int fileCount, char **fileTable);

#ifdef BB_FEATURE_TAR_CREATE
/*
 * Local procedures to save files into a tar file.
 */
static void saveFile(const char *fileName, int seeLinks);

static void saveRegularFile(const char *fileName,

							const struct stat *statbuf);

static void saveDirectory(const char *fileName,

						  const struct stat *statbuf);

static void writeHeader(const char *fileName, const struct stat *statbuf);

static void writeTarFile(int fileCount, char **fileTable);
static void writeTarBlock(const char *buf, int len);
static int putOctal(char *cp, int len, long value);

#endif


extern int tar_main(int argc, char **argv)
{
	const char *options;

	argc--;
	argv++;

	if (argc < 1)
		usage(tar_usage);


	errorFlag = FALSE;
	extractFlag = FALSE;
	createFlag = FALSE;
	listFlag = FALSE;
	verboseFlag = FALSE;
	tostdoutFlag = FALSE;
	tarName = NULL;
	tarDev = 0;
	tarInode = 0;
	tarFd = -1;

	/* 
	 * Parse the options.
	 */
	if (**argv == '-')
		options = (*argv++) + 1;
	else
		options = (*argv++);
	argc--;

	for (; *options; options++) {
		switch (*options) {
		case 'f':
			if (tarName != NULL) {
				fprintf(stderr, "Only one 'f' option allowed\n");

				exit(FALSE);
			}

			tarName = *argv++;
			argc--;

			break;

		case 't':
			if (extractFlag == TRUE || createFlag == TRUE)
				goto flagError;
			listFlag = TRUE;
			break;

		case 'x':
			if (listFlag == TRUE || createFlag == TRUE)
				goto flagError;
			extractFlag = TRUE;
			break;
		case 'c':
			if (extractFlag == TRUE || listFlag == TRUE)
				goto flagError;
			createFlag = TRUE;
			break;

		case 'v':
			verboseFlag = TRUE;
			break;

		case 'O':
			tostdoutFlag = TRUE;
			break;

		case '-':
			usage(tar_usage);
			break;

		default:
			fprintf(stderr, "Unknown tar flag '%c'\n"
					"Try `tar --help' for more information\n", *options);
			exit(FALSE);
		}
	}

	/* 
	 * Do the correct type of action supplying the rest of the
	 * command line arguments as the list of files to process.
	 */
	if (createFlag == TRUE) {
#ifndef BB_FEATURE_TAR_CREATE
		fprintf(stderr,
				"This version of tar was not compiled with tar creation support.\n");
		exit(FALSE);
#else
		writeTarFile(argc, argv);
#endif
	} else {
		readTarFile(argc, argv);
	}
	if (errorFlag == TRUE) {
		fprintf(stderr, "\n");
	}
	exit(!errorFlag);

  flagError:
	fprintf(stderr, "Exactly one of 'c', 'x' or 't' must be specified\n");
	exit(FALSE);
}


/*
 * Read a tar file and extract or list the specified files within it.
 * If the list is empty than all files are extracted or listed.
 */
static void readTarFile(int fileCount, char **fileTable)
{
	const char *cp;
	int cc;
	int inCc;
	int blockSize;
	char buf[BUF_SIZE];

	skipFileFlag = FALSE;
	badHeader = FALSE;
	warnedRoot = FALSE;
	eofFlag = FALSE;
	inHeader = TRUE;
	inCc = 0;
	dataCc = 0;
	outFd = -1;
	blockSize = sizeof(buf);
	cp = buf;

	/* 
	 * Open the tar file for reading.
	 */
	if ((tarName == NULL) || !strcmp(tarName, "-")) {
		tarFd = fileno(stdin);
	} else
		tarFd = open(tarName, O_RDONLY);

	if (tarFd < 0) {
		perror(tarName);
		errorFlag = TRUE;
		return;
	}

	/* 
	 * Read blocks from the file until an end of file header block
	 * has been seen.  (A real end of file from a read is an error.)
	 */
	while (eofFlag == FALSE) {
		/* 
		 * Read the next block of data if necessary.
		 * This will be a large block if possible, which we will
		 * then process in the small tar blocks.
		 */
		if (inCc <= 0) {
			cp = buf;
			inCc = fullRead(tarFd, buf, blockSize);

			if (inCc < 0) {
				perror(tarName);
				errorFlag = TRUE;
				goto done;
			}

			if (inCc == 0) {
				fprintf(stderr,
						"Unexpected end of file from \"%s\"", tarName);
				errorFlag = TRUE;
				goto done;
			}
		}

		/* 
		 * If we are expecting a header block then examine it.
		 */
		if (inHeader == TRUE) {
			readHeader((const TarHeader *) cp, fileCount, fileTable);

			cp += TAR_BLOCK_SIZE;
			inCc -= TAR_BLOCK_SIZE;

			continue;
		}

		/* 
		 * We are currently handling the data for a file.
		 * Process the minimum of the amount of data we have available
		 * and the amount left to be processed for the file.
		 */
		cc = inCc;

		if (cc > dataCc)
			cc = dataCc;

		readData(cp, cc);

		/* 
		 * If the amount left isn't an exact multiple of the tar block
		 * size then round it up to the next block boundary since there
		 * is padding at the end of the file.
		 */
		if (cc % TAR_BLOCK_SIZE)
			cc += TAR_BLOCK_SIZE - (cc % TAR_BLOCK_SIZE);

		cp += cc;
		inCc -= cc;
	}

  done:
	/* 
	 * Close the tar file if needed.
	 */
	if ((tarFd >= 0) && (close(tarFd) < 0))
		perror(tarName);

	/* 
	 * Close the output file if needed.
	 * This is only done here on a previous error and so no
	 * message is required on errors.
	 */
	if (tostdoutFlag == FALSE) {
		if (outFd >= 0) {
			close(outFd);
		}
	}
}


/*
 * Examine the header block that was just read.
 * This can specify the information for another file, or it can mark
 * the end of the tar file.
 */
static void
readHeader(const TarHeader * hp, int fileCount, char **fileTable)
{
	int checkSum;
	int cc;
	int hardLink;
	int softLink;
	int devFileFlag;
	unsigned int major;
	unsigned int minor;
	long size;
	struct utimbuf utb;

	/* 
	 * If the block is completely empty, then this is the end of the
	 * archive file.  If the name is null, then just skip this header.
	 */
	outName = hp->name;

	if (*outName == '\0') {
		for (cc = TAR_BLOCK_SIZE; cc > 0; cc--) {
			if (*outName++)
				return;
		}

		eofFlag = TRUE;

		return;
	}

	/* 
	 * There is another file in the archive to examine.
	 * Extract the encoded information and check it.
	 */
	mode = getOctal(hp->mode, sizeof(hp->mode));
	uid = getOctal(hp->uid, sizeof(hp->uid));
	gid = getOctal(hp->gid, sizeof(hp->gid));
	size = getOctal(hp->size, sizeof(hp->size));
	mtime = getOctal(hp->mtime, sizeof(hp->mtime));
	checkSum = getOctal(hp->checkSum, sizeof(hp->checkSum));
	major = getOctal(hp->devMajor, sizeof(hp->devMajor));
	minor = getOctal(hp->devMinor, sizeof(hp->devMinor));

	if ((mode < 0) || (uid < 0) || (gid < 0) || (size < 0)) {
		if (badHeader == FALSE)
			fprintf(stderr, "Bad tar header, skipping\n");

		badHeader = TRUE;

		return;
	}

	badHeader = FALSE;
	skipFileFlag = FALSE;
	devFileFlag = FALSE;

	/* 
	 * Check for the file modes.
	 */
	hardLink = ((hp->typeFlag == TAR_TYPE_HARD_LINK) ||
				(hp->typeFlag == TAR_TYPE_HARD_LINK - '0'));

	softLink = ((hp->typeFlag == TAR_TYPE_SOFT_LINK) ||
				(hp->typeFlag == TAR_TYPE_SOFT_LINK - '0'));

	/* 
	 * Check for a directory.
	 */
	if (outName[strlen(outName) - 1] == '/')
		mode |= S_IFDIR;

	/* 
	 * Check for absolute paths in the file.
	 * If we find any, then warn the user and make them relative.
	 */
	if (*outName == '/') {
		while (*outName == '/')
			outName++;

		if (warnedRoot == FALSE) {
			fprintf(stderr,
					"Absolute path detected, removing leading slashes\n");
		}

		warnedRoot = TRUE;
	}

	/* 
	 * See if we want this file to be restored.
	 * If not, then set up to skip it.
	 */
	if (wantFileName(outName, fileCount, fileTable) == FALSE) {
		if (!hardLink && !softLink && (S_ISREG(mode) || S_ISCHR(mode)
									   || S_ISBLK(mode) || S_ISSOCK(mode)
									   || S_ISFIFO(mode))) {
			inHeader = (size == 0) ? TRUE : FALSE;
			dataCc = size;
		}

		skipFileFlag = TRUE;

		return;
	}

	/* 
	 * This file is to be handled.
	 * If we aren't extracting then just list information about the file.
	 */
	if (extractFlag == FALSE) {
		if (verboseFlag == TRUE) {
			printf("%s %3d/%-d ", modeString(mode), uid, gid);
			if (S_ISCHR(mode) || S_ISBLK(mode))
				printf("%4d,%4d %s ", major, minor, timeString(mtime));
			else
				printf("%9ld %s ", size, timeString(mtime));
		}
		printf("%s", outName);

		if (hardLink)
			printf(" (link to \"%s\")", hp->linkName);
		else if (softLink)
			printf(" (symlink to \"%s\")", hp->linkName);
		else if (S_ISREG(mode) || S_ISCHR(mode) || S_ISBLK(mode) ||
				 S_ISSOCK(mode) || S_ISFIFO(mode)) {
			inHeader = (size == 0) ? TRUE : FALSE;
			dataCc = size;
		}

		printf("\n");

		return;
	}

	/* 
	 * We really want to extract the file.
	 */
	if (verboseFlag == TRUE)
		printf("x %s\n", outName);

	if (hardLink) {
		if (link(hp->linkName, outName) < 0) {
			perror(outName);
			return;
		}
		/* Set the file time */
		utb.actime = mtime;
		utb.modtime = mtime;
		utime(outName, &utb);
		/* Set the file permissions */
		chown(outName, uid, gid);
		chmod(outName, mode);
		return;
	}

	if (softLink) {
#ifdef	S_ISLNK
		if (symlink(hp->linkName, outName) < 0) {
			perror(outName);
			return;
		}
		/* Try to change ownership of the symlink.
		 * If libs doesn't support that, don't bother.
		 * Changing the pointed-to file is the Wrong Thing(tm).
		 */
#if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1)
		lchown(outName, uid, gid);
#endif

		/* Do not change permissions or date on symlink,
		 * since it changes the pointed to file instead.  duh. */
#else
		fprintf(stderr, "Cannot create symbolic links\n");
#endif
		return;
	}

	/* Set the umask for this process so it doesn't 
	 * screw things up. */
	umask(0);

	/* 
	 * If the file is a directory, then just create the path.
	 */
	if (S_ISDIR(mode)) {
		if (createPath(outName, mode) == TRUE) {
			/* make the final component, just in case it was
			 * omitted by createPath() (which will skip the
			 * directory if it doesn't have a terminating '/')
			 */
			mkdir(outName, mode);

			/* Set the file time */
			utb.actime = mtime;
			utb.modtime = mtime;
			utime(outName, &utb);
			/* Set the file permissions */
			chown(outName, uid, gid);
			chmod(outName, mode);
			return;
		}
		return;
	}

	/* 
	 * There is a file to write.
	 * First create the path to it if necessary with default permissions.
	 */
	createPath(outName, 0777);

	inHeader = (size == 0) ? TRUE : FALSE;
	dataCc = size;

	/* 
	 * Start the output file.
	 */
	if (tostdoutFlag == TRUE)
		outFd = fileno(stdout);
	else {
		if (S_ISCHR(mode) || S_ISBLK(mode) || S_ISSOCK(mode)) {
			devFileFlag = TRUE;
			outFd = mknod(outName, mode, makedev(major, minor));
		} else if (S_ISFIFO(mode)) {
			devFileFlag = TRUE;
			outFd = mkfifo(outName, mode);
		} else {
			outFd = open(outName, O_WRONLY | O_CREAT | O_TRUNC, mode);
		}
		if (outFd < 0) {
			perror(outName);
			skipFileFlag = TRUE;
			return;
		}
		/* Set the file time */
		utb.actime = mtime;
		utb.modtime = mtime;
		utime(outName, &utb);
		/* Set the file permissions */
		chown(outName, uid, gid);
		chmod(outName, mode);
	}


	/* 
	 * If the file is empty, then that's all we need to do.
	 */
	if (size == 0 && (tostdoutFlag == FALSE) && (devFileFlag == FALSE)) {
		close(outFd);
		outFd = -1;
	}
}


/*
 * Handle a data block of some specified size that was read.
 */
static void readData(const char *cp, int count)
{
	/* 
	 * Reduce the amount of data left in this file.
	 * If there is no more data left, then we need to read
	 * the header again.
	 */
	dataCc -= count;

	if (dataCc <= 0)
		inHeader = TRUE;

	/* 
	 * If we aren't extracting files or this file is being
	 * skipped then do nothing more.
	 */
	if (extractFlag == FALSE || skipFileFlag == TRUE)
		return;

	/* 
	 * Write the data to the output file.
	 */
	if (fullWrite(outFd, cp, count) < 0) {
		perror(outName);
		if (tostdoutFlag == FALSE) {
			close(outFd);
			outFd = -1;
		}
		skipFileFlag = TRUE;
		return;
	}

	/* 
	 * Check if we are done writing to the file now.
	 */
	if (dataCc <= 0 && tostdoutFlag == FALSE) {
		struct utimbuf utb;

		if (close(outFd))
			perror(outName);

		/* Set the file time */
		utb.actime = mtime;
		utb.modtime = mtime;
		utime(outName, &utb);
		/* Set the file permissions */
		chown(outName, uid, gid);
		chmod(outName, mode);

		outFd = -1;
	}
}


/*
 * See if the specified file name belongs to one of the specified list
 * of path prefixes.  An empty list implies that all files are wanted.
 * Returns TRUE if the file is selected.
 */
static int
wantFileName(const char *fileName, int fileCount, char **fileTable)
{
	const char *pathName;
	int fileLength;
	int pathLength;

	/* 
	 * If there are no files in the list, then the file is wanted.
	 */
	if (fileCount == 0)
		return TRUE;

	fileLength = strlen(fileName);

	/* 
	 * Check each of the test paths.
	 */
	while (fileCount-- > 0) {
		pathName = *fileTable++;

		pathLength = strlen(pathName);

		if (fileLength < pathLength)
			continue;

		if (memcmp(fileName, pathName, pathLength) != 0)
			continue;

		if ((fileLength == pathLength) || (fileName[pathLength] == '/')) {
			return TRUE;
		}
	}

	return FALSE;
}

/*
 * Read an octal value in a field of the specified width, with optional
 * spaces on both sides of the number and with an optional null character
 * at the end.  Returns -1 on an illegal format.
 */
static long getOctal(const char *cp, int len)
{
	long val;

	while ((len > 0) && (*cp == ' ')) {
		cp++;
		len--;
	}

	if ((len == 0) || !isOctal(*cp))
		return -1;

	val = 0;

	while ((len > 0) && isOctal(*cp)) {
		val = val * 8 + *cp++ - '0';
		len--;
	}

	while ((len > 0) && (*cp == ' ')) {
		cp++;
		len--;
	}

	if ((len > 0) && *cp)
		return -1;

	return val;
}




/* From here to the end of the file is the tar writing stuff.
 * If you do not have BB_FEATURE_TAR_CREATE defined, this will
 * not be built.
 * */
#ifdef BB_FEATURE_TAR_CREATE

/*
 * Write a tar file containing the specified files.
 */
static void writeTarFile(int fileCount, char **fileTable)
{
	struct stat statbuf;

	/* 
	 * Make sure there is at least one file specified.
	 */
	if (fileCount <= 0) {
		fprintf(stderr, "No files specified to be saved\n");
		errorFlag = TRUE;
	}

	/* 
	 * Create the tar file for writing.
	 */
	if ((tarName == NULL) || !strcmp(tarName, "-")) {
		tostdoutFlag = TRUE;
		tarFd = fileno(stdout);
	} else
		tarFd = open(tarName, O_WRONLY | O_CREAT | O_TRUNC, 0666);

	if (tarFd < 0) {
		perror(tarName);
		errorFlag = TRUE;
		return;
	}

	/* 
	 * Get the device and inode of the tar file for checking later.
	 */
	if (fstat(tarFd, &statbuf) < 0) {
		perror(tarName);
		errorFlag = TRUE;
		goto done;
	}

	tarDev = statbuf.st_dev;
	tarInode = statbuf.st_ino;

	/* 
	 * Append each file name into the archive file.
	 * Follow symbolic links for these top level file names.
	 */
	while (errorFlag == FALSE && (fileCount-- > 0)) {
		saveFile(*fileTable++, FALSE);
	}

	/* 
	 * Now write an empty block of zeroes to end the archive.
	 */
	writeTarBlock("", 1);


  done:
	/* 
	 * Close the tar file and check for errors if it was opened.
	 */
	if ((tostdoutFlag == FALSE) && (tarFd >= 0) && (close(tarFd) < 0))
		perror(tarName);
}

/*
 * Save one file into the tar file.
 * If the file is a directory, then this will recursively save all of
 * the files and directories within the directory.  The seeLinks
 * flag indicates whether or not we want to see symbolic links as
 * they really are, instead of blindly following them.
 */
static void saveFile(const char *fileName, int seeLinks)
{
	int status;
	struct stat statbuf;

	if (verboseFlag == TRUE)
		printf("a %s\n", fileName);

	/* 
	 * Check that the file name will fit in the header.
	 */
	if (strlen(fileName) >= TAR_NAME_SIZE) {
		fprintf(stderr, "%s: File name is too long\n", fileName);

		return;
	}

	/* 
	 * Find out about the file.
	 */
#ifdef	S_ISLNK
	if (seeLinks == TRUE)
		status = lstat(fileName, &statbuf);
	else
#endif
		status = stat(fileName, &statbuf);

	if (status < 0) {
		perror(fileName);

		return;
	}

	/* 
	 * Make sure we aren't trying to save our file into itself.
	 */
	if ((statbuf.st_dev == tarDev) && (statbuf.st_ino == tarInode)) {
		fprintf(stderr, "Skipping saving of archive file itself\n");

		return;
	}

	/* 
	 * Check the type of file.
	 */
	mode = statbuf.st_mode;

	if (S_ISDIR(mode)) {
		saveDirectory(fileName, &statbuf);

		return;
	}
	if (S_ISREG(mode)) {
		saveRegularFile(fileName, &statbuf);

		return;
	}

	/* Some day add support for tarring these up... but not today. :) */
//  if (S_ISLNK(mode) || S_ISFIFO(mode) || S_ISBLK(mode) || S_ISCHR (mode) ) {
//  fprintf (stderr, "%s: This version of tar can't store this type of file\n", fileName);
//  }

	/* 
	 * The file is a strange type of file, ignore it.
	 */
	fprintf(stderr, "%s: not a directory or regular file\n", fileName);
}


/*
 * Save a regular file to the tar file.
 */
static void
saveRegularFile(const char *fileName, const struct stat *statbuf)
{
	int sawEof;
	int fileFd;
	int cc;
	int dataCount;
	long fullDataCount;
	char data[TAR_BLOCK_SIZE * 16];

	/* 
	 * Open the file for reading.
	 */
	fileFd = open(fileName, O_RDONLY);

	if (fileFd < 0) {
		perror(fileName);

		return;
	}

	/* 
	 * Write out the header for the file.
	 */
	writeHeader(fileName, statbuf);

	/* 
	 * Write the data blocks of the file.
	 * We must be careful to write the amount of data that the stat
	 * buffer indicated, even if the file has changed size.  Otherwise
	 * the tar file will be incorrect.
	 */
	fullDataCount = statbuf->st_size;
	sawEof = FALSE;

	while (fullDataCount > 0) {
		/* 
		 * Get the amount to write this iteration which is
		 * the minumum of the amount left to write and the
		 * buffer size.
		 */
		dataCount = sizeof(data);

		if (dataCount > fullDataCount)
			dataCount = (int) fullDataCount;

		/* 
		 * Read the data from the file if we haven't seen the
		 * end of file yet.
		 */
		cc = 0;

		if (sawEof == FALSE) {
			cc = fullRead(fileFd, data, dataCount);

			if (cc < 0) {
				perror(fileName);

				(void) close(fileFd);
				errorFlag = TRUE;

				return;
			}

			/* 
			 * If the file ended too soon, complain and set
			 * a flag so we will zero fill the rest of it.
			 */
			if (cc < dataCount) {
				fprintf(stderr, "%s: Short read - zero filling", fileName);

				sawEof = TRUE;
			}
		}

		/* 
		 * Zero fill the rest of the data if necessary.
		 */
		if (cc < dataCount)
			memset(data + cc, 0, dataCount - cc);

		/* 
		 * Write the buffer to the TAR file.
		 */
		writeTarBlock(data, dataCount);

		fullDataCount -= dataCount;
	}

	/* 
	 * Close the file.
	 */
	if ((tostdoutFlag == FALSE) && close(fileFd) < 0)
		fprintf(stderr, "%s: close: %s\n", fileName, strerror(errno));
}


/*
 * Save a directory and all of its files to the tar file.
 */
static void saveDirectory(const char *dirName, const struct stat *statbuf)
{
	DIR *dir;
	struct dirent *entry;
	int needSlash;
	char fullName[PATH_MAX + 1];

	/* 
	 * Construct the directory name as used in the tar file by appending
	 * a slash character to it.
	 */
	strcpy(fullName, dirName);
	strcat(fullName, "/");

	/* 
	 * Write out the header for the directory entry.
	 */
	writeHeader(fullName, statbuf);

	/* 
	 * Open the directory.
	 */
	dir = opendir(dirName);

	if (dir == NULL) {
		fprintf(stderr, "Cannot read directory \"%s\": %s\n",
				dirName, strerror(errno));

		return;
	}

	/* 
	 * See if a slash is needed.
	 */
	needSlash = (*dirName && (dirName[strlen(dirName) - 1] != '/'));

	/* 
	 * Read all of the directory entries and check them,
	 * except for the current and parent directory entries.
	 */
	while (errorFlag == FALSE && ((entry = readdir(dir)) != NULL)) {
		if ((strcmp(entry->d_name, ".") == 0) ||
			(strcmp(entry->d_name, "..") == 0)) {
			continue;
		}

		/* 
		 * Build the full path name to the file.
		 */
		strcpy(fullName, dirName);

		if (needSlash)
			strcat(fullName, "/");

		strcat(fullName, entry->d_name);

		/* 
		 * Write this file to the tar file, noticing whether or not
		 * the file is a symbolic link.
		 */
		saveFile(fullName, TRUE);
	}

	/* 
	 * All done, close the directory.
	 */
	closedir(dir);
}


/*
 * Write a tar header for the specified file name and status.
 * It is assumed that the file name fits.
 */
static void writeHeader(const char *fileName, const struct stat *statbuf)
{
	long checkSum;
	const unsigned char *cp;
	int len;
	TarHeader header;

	/* 
	 * Zero the header block in preparation for filling it in.
	 */
	memset((char *) &header, 0, sizeof(header));

	/* 
	 * Fill in the header.
	 */
	strcpy(header.name, fileName);

	strncpy(header.magic, TAR_MAGIC, sizeof(header.magic));
	strncpy(header.version, TAR_VERSION, sizeof(header.version));

	putOctal(header.mode, sizeof(header.mode), statbuf->st_mode & 0777);
	putOctal(header.uid, sizeof(header.uid), statbuf->st_uid);
	putOctal(header.gid, sizeof(header.gid), statbuf->st_gid);
	putOctal(header.size, sizeof(header.size), statbuf->st_size);
	putOctal(header.mtime, sizeof(header.mtime), statbuf->st_mtime);

	header.typeFlag = TAR_TYPE_REGULAR;

	/* 
	 * Calculate and store the checksum.
	 * This is the sum of all of the bytes of the header,
	 * with the checksum field itself treated as blanks.
	 */
	memset(header.checkSum, ' ', sizeof(header.checkSum));

	cp = (const unsigned char *) &header;
	len = sizeof(header);
	checkSum = 0;

	while (len-- > 0)
		checkSum += *cp++;

	putOctal(header.checkSum, sizeof(header.checkSum), checkSum);

	/* 
	 * Write the tar header.
	 */
	writeTarBlock((const char *) &header, sizeof(header));
}


/*
 * Write data to one or more blocks of the tar file.
 * The data is always padded out to a multiple of TAR_BLOCK_SIZE.
 * The errorFlag static variable is set on an error.
 */
static void writeTarBlock(const char *buf, int len)
{
	int partialLength;
	int completeLength;
	char fullBlock[TAR_BLOCK_SIZE];

	/* 
	 * If we had a write error before, then do nothing more.
	 */
	if (errorFlag == TRUE)
		return;

	/* 
	 * Get the amount of complete and partial blocks.
	 */
	partialLength = len % TAR_BLOCK_SIZE;
	completeLength = len - partialLength;

	/* 
	 * Write all of the complete blocks.
	 */
	if ((completeLength > 0) && !fullWrite(tarFd, buf, completeLength)) {
		perror(tarName);

		errorFlag = TRUE;

		return;
	}

	/* 
	 * If there are no partial blocks left, we are done.
	 */
	if (partialLength == 0)
		return;

	/* 
	 * Copy the partial data into a complete block, and pad the rest
	 * of it with zeroes.
	 */
	memcpy(fullBlock, buf + completeLength, partialLength);
	memset(fullBlock + partialLength, 0, TAR_BLOCK_SIZE - partialLength);

	/* 
	 * Write the last complete block.
	 */
	if (!fullWrite(tarFd, fullBlock, TAR_BLOCK_SIZE)) {
		perror(tarName);

		errorFlag = TRUE;
	}
}


/*
 * Put an octal string into the specified buffer.
 * The number is zero and space padded and possibly null padded.
 * Returns TRUE if successful.
 */
static int putOctal(char *cp, int len, long value)
{
	int tempLength;
	char *tempString;
	char tempBuffer[32];

	/* 
	 * Create a string of the specified length with an initial space,
	 * leading zeroes and the octal number, and a trailing null.
	 */
	tempString = tempBuffer;

	sprintf(tempString, " %0*lo", len - 2, value);

	tempLength = strlen(tempString) + 1;

	/* 
	 * If the string is too large, suppress the leading space.
	 */
	if (tempLength > len) {
		tempLength--;
		tempString++;
	}

	/* 
	 * If the string is still too large, suppress the trailing null.
	 */
	if (tempLength > len)
		tempLength--;

	/* 
	 * If the string is still too large, fail.
	 */
	if (tempLength > len)
		return FALSE;

	/* 
	 * Copy the string to the field.
	 */
	memcpy(cp, tempString, len);

	return TRUE;
}
#endif

/* END CODE */
