aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Config.h2
-rw-r--r--applets/usage.c2
-rw-r--r--archival/tar.c29
-rw-r--r--tar.c29
-rw-r--r--usage.c2
5 files changed, 61 insertions, 3 deletions
diff --git a/Config.h b/Config.h
index 0f31ae16b..e07044690 100644
--- a/Config.h
+++ b/Config.h
@@ -222,7 +222,7 @@
// Enable support for creation of tar files.
#define BB_FEATURE_TAR_CREATE
//
-// Enable support for "--exclude" for excluding files
+// Enable support for "--exclude" and "-X" for excluding files
#define BB_FEATURE_TAR_EXCLUDE
//
//// Enable reverse sort
diff --git a/applets/usage.c b/applets/usage.c
index bab6d21b3..bd2321fbc 100644
--- a/applets/usage.c
+++ b/applets/usage.c
@@ -1218,6 +1218,7 @@ const char tar_usage[] =
#endif
#if defined BB_FEATURE_TAR_EXCLUDE
"[--exclude File] "
+ "[-X File]"
#endif
"[-f tarFile] [FILE(s)] ...\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
@@ -1234,6 +1235,7 @@ const char tar_usage[] =
"\tO\t\textract to stdout\n"
#if defined BB_FEATURE_TAR_EXCLUDE
"\texclude\t\tfile to exclude\n"
+ "\tX\t\tfile with names to exclude\n"
#endif
"\nInformative output:\n"
"\tv\t\tverbosely list files processed\n"
diff --git a/archival/tar.c b/archival/tar.c
index 6d8e633b0..7e56fb99a 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -147,6 +147,9 @@ extern int tar_main(int argc, char **argv)
char** extractList=NULL;
#if defined BB_FEATURE_TAR_EXCLUDE
int excludeListSize=0;
+ char *excludeFileName ="-";
+ FILE *fileList;
+ char file[256];
#endif
const char *tarName="-";
int listFlag = FALSE;
@@ -198,7 +201,7 @@ extern int tar_main(int argc, char **argv)
break;
#if defined BB_FEATURE_TAR_EXCLUDE
case 'e':
- if (strcmp(*argv, "exclude")==0) {
+ if (strcmp(*argv, "xclude")==0) {
excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
excludeList[excludeListSize] = *(++argv);
if (excludeList[excludeListSize] == NULL)
@@ -211,6 +214,30 @@ extern int tar_main(int argc, char **argv)
stopIt=TRUE;
break;
}
+ case 'X':
+ if (*excludeFileName != '-')
+ fatalError("Only one 'X' option allowed\n");
+ excludeFileName = *(++argv);
+ if (excludeFileName == NULL)
+ fatalError("Option requires an argument: No file specified\n");
+ fileList = fopen (excludeFileName, "rt");
+ if (! fileList)
+ fatalError("Exclude file: file not found\n");
+ while (!feof(fileList)) {
+ fscanf(fileList, "%s", file);
+ excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
+ excludeList[excludeListSize] = malloc(sizeof(char) * (strlen(file)+1));
+ strcpy(excludeList[excludeListSize],file);
+ /* Remove leading "/"s */
+ if (*excludeList[excludeListSize] == '/')
+ excludeList[excludeListSize] = (excludeList[excludeListSize])+1;
+ /* Tack a NULL onto the end of the list */
+ excludeList[++excludeListSize] = NULL;
+ }
+
+ fclose(fileList);
+ stopIt=TRUE;
+ break;
#endif
case '-':
break;
diff --git a/tar.c b/tar.c
index 6d8e633b0..7e56fb99a 100644
--- a/tar.c
+++ b/tar.c
@@ -147,6 +147,9 @@ extern int tar_main(int argc, char **argv)
char** extractList=NULL;
#if defined BB_FEATURE_TAR_EXCLUDE
int excludeListSize=0;
+ char *excludeFileName ="-";
+ FILE *fileList;
+ char file[256];
#endif
const char *tarName="-";
int listFlag = FALSE;
@@ -198,7 +201,7 @@ extern int tar_main(int argc, char **argv)
break;
#if defined BB_FEATURE_TAR_EXCLUDE
case 'e':
- if (strcmp(*argv, "exclude")==0) {
+ if (strcmp(*argv, "xclude")==0) {
excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
excludeList[excludeListSize] = *(++argv);
if (excludeList[excludeListSize] == NULL)
@@ -211,6 +214,30 @@ extern int tar_main(int argc, char **argv)
stopIt=TRUE;
break;
}
+ case 'X':
+ if (*excludeFileName != '-')
+ fatalError("Only one 'X' option allowed\n");
+ excludeFileName = *(++argv);
+ if (excludeFileName == NULL)
+ fatalError("Option requires an argument: No file specified\n");
+ fileList = fopen (excludeFileName, "rt");
+ if (! fileList)
+ fatalError("Exclude file: file not found\n");
+ while (!feof(fileList)) {
+ fscanf(fileList, "%s", file);
+ excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
+ excludeList[excludeListSize] = malloc(sizeof(char) * (strlen(file)+1));
+ strcpy(excludeList[excludeListSize],file);
+ /* Remove leading "/"s */
+ if (*excludeList[excludeListSize] == '/')
+ excludeList[excludeListSize] = (excludeList[excludeListSize])+1;
+ /* Tack a NULL onto the end of the list */
+ excludeList[++excludeListSize] = NULL;
+ }
+
+ fclose(fileList);
+ stopIt=TRUE;
+ break;
#endif
case '-':
break;
diff --git a/usage.c b/usage.c
index bab6d21b3..bd2321fbc 100644
--- a/usage.c
+++ b/usage.c
@@ -1218,6 +1218,7 @@ const char tar_usage[] =
#endif
#if defined BB_FEATURE_TAR_EXCLUDE
"[--exclude File] "
+ "[-X File]"
#endif
"[-f tarFile] [FILE(s)] ...\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
@@ -1234,6 +1235,7 @@ const char tar_usage[] =
"\tO\t\textract to stdout\n"
#if defined BB_FEATURE_TAR_EXCLUDE
"\texclude\t\tfile to exclude\n"
+ "\tX\t\tfile with names to exclude\n"
#endif
"\nInformative output:\n"
"\tv\t\tverbosely list files processed\n"