tar creation support is now optional.
-Erik
This commit is contained in:
parent
83865e3e90
commit
05100cd477
@ -1,3 +1,8 @@
|
|||||||
|
0.42
|
||||||
|
* Made tar creation support in busybox tar optional.
|
||||||
|
|
||||||
|
-Erik Andersen
|
||||||
|
|
||||||
0.41
|
0.41
|
||||||
* New Apps: wc, hostid, logname, tty, whoami, yes -- all contributed
|
* New Apps: wc, hostid, logname, tty, whoami, yes -- all contributed
|
||||||
by Edward Betts <edward@debian.org>
|
by Edward Betts <edward@debian.org>
|
||||||
|
212
archival/tar.c
212
archival/tar.c
@ -42,13 +42,26 @@
|
|||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
|
|
||||||
static const char tar_usage[] =
|
static const char tar_usage[] =
|
||||||
"tar -[cxtvOf] [tarFileName] [FILE] ...\n\n"
|
"tar -[cxtvOf] [tarFileName] [FILE] ...\n\n"
|
||||||
"Create, extract, or list files from a tar file\n\n"
|
"Create, extract, or list files from a tar file.\n\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
"\tc=create, x=extract, t=list contents, v=verbose,\n"
|
"\tc=create, x=extract, t=list contents, v=verbose,\n"
|
||||||
"\tO=extract to stdout, f=tarfile or \"-\" for stdin\n";
|
"\tO=extract to stdout, f=tarfile or \"-\" for stdin\n";
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static const char tar_usage[] =
|
||||||
|
"tar -[cxtvOf] [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
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -95,7 +108,9 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
static int listFlag;
|
static int listFlag;
|
||||||
static int extractFlag;
|
static int extractFlag;
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
static int createFlag;
|
static int createFlag;
|
||||||
|
#endif
|
||||||
static int verboseFlag;
|
static int verboseFlag;
|
||||||
static int tostdoutFlag;
|
static int tostdoutFlag;
|
||||||
|
|
||||||
@ -133,7 +148,10 @@ static long getOctal (const char *cp, int len);
|
|||||||
static void readHeader (const TarHeader * hp,
|
static void readHeader (const TarHeader * hp,
|
||||||
int fileCount, char **fileTable);
|
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.
|
* Local procedures to save files into a tar file.
|
||||||
*/
|
*/
|
||||||
@ -145,15 +163,14 @@ static void saveRegularFile (const char *fileName,
|
|||||||
static void saveDirectory (const char *fileName,
|
static void saveDirectory (const char *fileName,
|
||||||
const struct stat *statbuf);
|
const struct stat *statbuf);
|
||||||
|
|
||||||
static int wantFileName (const char *fileName,
|
|
||||||
int fileCount, char **fileTable);
|
|
||||||
|
|
||||||
static void writeHeader (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 writeTarFile (int fileCount, char **fileTable);
|
||||||
static void writeTarBlock (const char *buf, int len);
|
static void writeTarBlock (const char *buf, int len);
|
||||||
static int putOctal (char *cp, int len, long value);
|
static int putOctal (char *cp, int len, long value);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
extern int tar_main (int argc, char **argv)
|
extern int tar_main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -168,7 +185,9 @@ extern int tar_main (int argc, char **argv)
|
|||||||
|
|
||||||
errorFlag = FALSE;
|
errorFlag = FALSE;
|
||||||
extractFlag = FALSE;
|
extractFlag = FALSE;
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
createFlag = FALSE;
|
createFlag = FALSE;
|
||||||
|
#endif
|
||||||
listFlag = FALSE;
|
listFlag = FALSE;
|
||||||
verboseFlag = FALSE;
|
verboseFlag = FALSE;
|
||||||
tostdoutFlag = FALSE;
|
tostdoutFlag = FALSE;
|
||||||
@ -204,10 +223,16 @@ extern int tar_main (int argc, char **argv)
|
|||||||
case 'x':
|
case 'x':
|
||||||
extractFlag = TRUE;
|
extractFlag = TRUE;
|
||||||
break;
|
break;
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
case 'c':
|
case 'c':
|
||||||
createFlag = TRUE;
|
createFlag = TRUE;
|
||||||
break;
|
break;
|
||||||
|
#else
|
||||||
|
case 'c':
|
||||||
|
fprintf (stderr, "This version of tar was not compiled with tar creation support.\n" );
|
||||||
|
|
||||||
|
exit (FALSE);
|
||||||
|
#endif
|
||||||
|
|
||||||
case 'v':
|
case 'v':
|
||||||
verboseFlag = TRUE;
|
verboseFlag = TRUE;
|
||||||
@ -234,7 +259,11 @@ extern int tar_main (int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Validate the options.
|
* Validate the options.
|
||||||
*/
|
*/
|
||||||
if (extractFlag + listFlag + createFlag != (TRUE+FALSE+FALSE)) {
|
if (extractFlag + listFlag
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
|
+ createFlag
|
||||||
|
#endif
|
||||||
|
!= (TRUE+FALSE+FALSE)) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"Exactly one of 'c', 'x' or 't' must be specified\n");
|
"Exactly one of 'c', 'x' or 't' must be specified\n");
|
||||||
|
|
||||||
@ -245,9 +274,11 @@ extern int tar_main (int argc, char **argv)
|
|||||||
* Do the correct type of action supplying the rest of the
|
* Do the correct type of action supplying the rest of the
|
||||||
* command line arguments as the list of files to process.
|
* command line arguments as the list of files to process.
|
||||||
*/
|
*/
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
if (createFlag==TRUE)
|
if (createFlag==TRUE)
|
||||||
writeTarFile (argc, argv);
|
writeTarFile (argc, argv);
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
readTarFile (argc, argv);
|
readTarFile (argc, argv);
|
||||||
if (errorFlag==TRUE)
|
if (errorFlag==TRUE)
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
@ -677,6 +708,92 @@ static void readData (const char *cp, int count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
* Write a tar file containing the specified files.
|
||||||
*/
|
*/
|
||||||
@ -741,7 +858,6 @@ static void writeTarFile (int fileCount, char **fileTable)
|
|||||||
perror (tarName);
|
perror (tarName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save one file into the tar file.
|
* Save one file into the tar file.
|
||||||
* If the file is a directory, then this will recursively save all of
|
* If the file is a directory, then this will recursively save all of
|
||||||
@ -1106,42 +1222,6 @@ static void writeTarBlock (const char *buf, int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Put an octal string into the specified buffer.
|
* Put an octal string into the specified buffer.
|
||||||
* The number is zero and space padded and possibly null padded.
|
* The number is zero and space padded and possibly null padded.
|
||||||
@ -1190,50 +1270,6 @@ static int putOctal (char *cp, int len, long value)
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* END CODE */
|
/* END CODE */
|
||||||
|
@ -136,3 +136,6 @@
|
|||||||
// Enable support for loop devices in mount
|
// Enable support for loop devices in mount
|
||||||
#define BB_FEATURE_MOUNT_LOOP
|
#define BB_FEATURE_MOUNT_LOOP
|
||||||
//
|
//
|
||||||
|
// Enable support for creation of tar files.
|
||||||
|
//#define BB_FEATURE_TAR_CREATE
|
||||||
|
//
|
||||||
|
@ -6,8 +6,8 @@ Summary: BusyBox is a tiny suite of Unix utilities in a multi-call binary.
|
|||||||
Copyright: GPL
|
Copyright: GPL
|
||||||
Packager : Erik Andersen <andersen@lineo.com>
|
Packager : Erik Andersen <andersen@lineo.com>
|
||||||
Conflicts: fileutils grep shellutils
|
Conflicts: fileutils grep shellutils
|
||||||
Buildroot: /tmp/%{Name}-%{Version}
|
Buildroot: /tmp/%{name}-%{version}
|
||||||
Source: %{Name}-%{Version}.tar.gz
|
Source: %{name}-%{version}.tar.gz
|
||||||
|
|
||||||
%Description
|
%Description
|
||||||
BusyBox is a suite of "tiny" Unix utilities in a multi-call binary. It
|
BusyBox is a suite of "tiny" Unix utilities in a multi-call binary. It
|
||||||
@ -18,7 +18,7 @@ is makes an excellent environment for a "rescue" disk or any small or
|
|||||||
embedded system.
|
embedded system.
|
||||||
|
|
||||||
%Prep
|
%Prep
|
||||||
%setup -q -n %{Name}-%{Version}
|
%setup -q -n %{name}-%{version}
|
||||||
|
|
||||||
%Build
|
%Build
|
||||||
make
|
make
|
||||||
|
@ -6,8 +6,8 @@ Summary: BusyBox is a tiny suite of Unix utilities in a multi-call binary.
|
|||||||
Copyright: GPL
|
Copyright: GPL
|
||||||
Packager : Erik Andersen <andersen@lineo.com>
|
Packager : Erik Andersen <andersen@lineo.com>
|
||||||
Conflicts: fileutils grep shellutils
|
Conflicts: fileutils grep shellutils
|
||||||
Buildroot: /tmp/%{Name}-%{Version}
|
Buildroot: /tmp/%{name}-%{version}
|
||||||
Source: %{Name}-%{Version}.tar.gz
|
Source: %{name}-%{version}.tar.gz
|
||||||
|
|
||||||
%Description
|
%Description
|
||||||
BusyBox is a suite of "tiny" Unix utilities in a multi-call binary. It
|
BusyBox is a suite of "tiny" Unix utilities in a multi-call binary. It
|
||||||
@ -18,7 +18,7 @@ is makes an excellent environment for a "rescue" disk or any small or
|
|||||||
embedded system.
|
embedded system.
|
||||||
|
|
||||||
%Prep
|
%Prep
|
||||||
%setup -q -n %{Name}-%{Version}
|
%setup -q -n %{name}-%{version}
|
||||||
|
|
||||||
%Build
|
%Build
|
||||||
make
|
make
|
||||||
|
212
tar.c
212
tar.c
@ -42,13 +42,26 @@
|
|||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
|
|
||||||
static const char tar_usage[] =
|
static const char tar_usage[] =
|
||||||
"tar -[cxtvOf] [tarFileName] [FILE] ...\n\n"
|
"tar -[cxtvOf] [tarFileName] [FILE] ...\n\n"
|
||||||
"Create, extract, or list files from a tar file\n\n"
|
"Create, extract, or list files from a tar file.\n\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
"\tc=create, x=extract, t=list contents, v=verbose,\n"
|
"\tc=create, x=extract, t=list contents, v=verbose,\n"
|
||||||
"\tO=extract to stdout, f=tarfile or \"-\" for stdin\n";
|
"\tO=extract to stdout, f=tarfile or \"-\" for stdin\n";
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static const char tar_usage[] =
|
||||||
|
"tar -[cxtvOf] [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
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -95,7 +108,9 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
static int listFlag;
|
static int listFlag;
|
||||||
static int extractFlag;
|
static int extractFlag;
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
static int createFlag;
|
static int createFlag;
|
||||||
|
#endif
|
||||||
static int verboseFlag;
|
static int verboseFlag;
|
||||||
static int tostdoutFlag;
|
static int tostdoutFlag;
|
||||||
|
|
||||||
@ -133,7 +148,10 @@ static long getOctal (const char *cp, int len);
|
|||||||
static void readHeader (const TarHeader * hp,
|
static void readHeader (const TarHeader * hp,
|
||||||
int fileCount, char **fileTable);
|
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.
|
* Local procedures to save files into a tar file.
|
||||||
*/
|
*/
|
||||||
@ -145,15 +163,14 @@ static void saveRegularFile (const char *fileName,
|
|||||||
static void saveDirectory (const char *fileName,
|
static void saveDirectory (const char *fileName,
|
||||||
const struct stat *statbuf);
|
const struct stat *statbuf);
|
||||||
|
|
||||||
static int wantFileName (const char *fileName,
|
|
||||||
int fileCount, char **fileTable);
|
|
||||||
|
|
||||||
static void writeHeader (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 writeTarFile (int fileCount, char **fileTable);
|
||||||
static void writeTarBlock (const char *buf, int len);
|
static void writeTarBlock (const char *buf, int len);
|
||||||
static int putOctal (char *cp, int len, long value);
|
static int putOctal (char *cp, int len, long value);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
extern int tar_main (int argc, char **argv)
|
extern int tar_main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -168,7 +185,9 @@ extern int tar_main (int argc, char **argv)
|
|||||||
|
|
||||||
errorFlag = FALSE;
|
errorFlag = FALSE;
|
||||||
extractFlag = FALSE;
|
extractFlag = FALSE;
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
createFlag = FALSE;
|
createFlag = FALSE;
|
||||||
|
#endif
|
||||||
listFlag = FALSE;
|
listFlag = FALSE;
|
||||||
verboseFlag = FALSE;
|
verboseFlag = FALSE;
|
||||||
tostdoutFlag = FALSE;
|
tostdoutFlag = FALSE;
|
||||||
@ -204,10 +223,16 @@ extern int tar_main (int argc, char **argv)
|
|||||||
case 'x':
|
case 'x':
|
||||||
extractFlag = TRUE;
|
extractFlag = TRUE;
|
||||||
break;
|
break;
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
case 'c':
|
case 'c':
|
||||||
createFlag = TRUE;
|
createFlag = TRUE;
|
||||||
break;
|
break;
|
||||||
|
#else
|
||||||
|
case 'c':
|
||||||
|
fprintf (stderr, "This version of tar was not compiled with tar creation support.\n" );
|
||||||
|
|
||||||
|
exit (FALSE);
|
||||||
|
#endif
|
||||||
|
|
||||||
case 'v':
|
case 'v':
|
||||||
verboseFlag = TRUE;
|
verboseFlag = TRUE;
|
||||||
@ -234,7 +259,11 @@ extern int tar_main (int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Validate the options.
|
* Validate the options.
|
||||||
*/
|
*/
|
||||||
if (extractFlag + listFlag + createFlag != (TRUE+FALSE+FALSE)) {
|
if (extractFlag + listFlag
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
|
+ createFlag
|
||||||
|
#endif
|
||||||
|
!= (TRUE+FALSE+FALSE)) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"Exactly one of 'c', 'x' or 't' must be specified\n");
|
"Exactly one of 'c', 'x' or 't' must be specified\n");
|
||||||
|
|
||||||
@ -245,9 +274,11 @@ extern int tar_main (int argc, char **argv)
|
|||||||
* Do the correct type of action supplying the rest of the
|
* Do the correct type of action supplying the rest of the
|
||||||
* command line arguments as the list of files to process.
|
* command line arguments as the list of files to process.
|
||||||
*/
|
*/
|
||||||
|
#ifdef BB_FEATURE_TAR_CREATE
|
||||||
if (createFlag==TRUE)
|
if (createFlag==TRUE)
|
||||||
writeTarFile (argc, argv);
|
writeTarFile (argc, argv);
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
readTarFile (argc, argv);
|
readTarFile (argc, argv);
|
||||||
if (errorFlag==TRUE)
|
if (errorFlag==TRUE)
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
@ -677,6 +708,92 @@ static void readData (const char *cp, int count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
* Write a tar file containing the specified files.
|
||||||
*/
|
*/
|
||||||
@ -741,7 +858,6 @@ static void writeTarFile (int fileCount, char **fileTable)
|
|||||||
perror (tarName);
|
perror (tarName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save one file into the tar file.
|
* Save one file into the tar file.
|
||||||
* If the file is a directory, then this will recursively save all of
|
* If the file is a directory, then this will recursively save all of
|
||||||
@ -1106,42 +1222,6 @@ static void writeTarBlock (const char *buf, int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Put an octal string into the specified buffer.
|
* Put an octal string into the specified buffer.
|
||||||
* The number is zero and space padded and possibly null padded.
|
* The number is zero and space padded and possibly null padded.
|
||||||
@ -1190,50 +1270,6 @@ static int putOctal (char *cp, int len, long value)
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* END CODE */
|
/* END CODE */
|
||||||
|
Loading…
Reference in New Issue
Block a user