summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen2000-12-13 15:28:48 +0000
committerEric Andersen2000-12-13 15:28:48 +0000
commit4836fd44f037c226e5eee83224cf090406602fae (patch)
treeffa01f7e6af37801d05fe3533006e4ae25199742
parentbd193a42a5624f0a72b5f99d554e9a8d2afc64cc (diff)
downloadbusybox-4836fd44f037c226e5eee83224cf090406602fae.zip
busybox-4836fd44f037c226e5eee83224cf090406602fae.tar.gz
Patch from Matt Kraai:
The following patch makes the -X option to tar behave like GNU, which reads one file per line. It also prevents the last file from being appended to the list twice (though that has no noticeable impact).
-rw-r--r--archival/tar.c51
-rw-r--r--tar.c51
2 files changed, 52 insertions, 50 deletions
diff --git a/archival/tar.c b/archival/tar.c
index 3a3b7f1..e1beee1 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -246,7 +246,8 @@ extern int tar_main(int argc, char **argv)
#if defined BB_FEATURE_TAR_EXCLUDE
case 'e':
if (strcmp(*argv, "xclude")==0) {
- excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
+ excludeList=xrealloc( excludeList,
+ sizeof(char *) * (excludeListSize+2));
excludeList[excludeListSize] = *(++argv);
if (excludeList[excludeListSize] == NULL)
error_msg_and_die( "Option requires an argument: No file specified\n");
@@ -258,30 +259,30 @@ extern int tar_main(int argc, char **argv)
stopIt=TRUE;
break;
}
- case 'X':
- if (*excludeFileName != '-')
- error_msg_and_die("Only one 'X' option allowed\n");
- excludeFileName = *(++argv);
- if (excludeFileName == NULL)
- error_msg_and_die("Option requires an argument: No file specified\n");
- fileList = fopen (excludeFileName, "rt");
- if (! fileList)
- error_msg_and_die("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;
+ case 'X':
+ if (*excludeFileName != '-')
+ error_msg_and_die("Only one 'X' option allowed\n");
+ excludeFileName = *(++argv);
+ if (excludeFileName == NULL)
+ error_msg_and_die("Option requires an argument: No file specified\n");
+ fileList = fopen (excludeFileName, "r");
+ if (! fileList)
+ error_msg_and_die("Exclude file: file not found\n");
+ while (fgets(file, sizeof(file), fileList) != NULL) {
+ excludeList = xrealloc(excludeList,
+ sizeof(char *) * (excludeListSize+2));
+ if (file[strlen(file)-1] == '\n')
+ file[strlen(file)-1] = '\0';
+ excludeList[excludeListSize] = xstrdup(file);
+ /* Remove leading "/"s */
+ while (*excludeList[excludeListSize] == '/')
+ excludeList[excludeListSize]++;
+ /* 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 3a3b7f1..e1beee1 100644
--- a/tar.c
+++ b/tar.c
@@ -246,7 +246,8 @@ extern int tar_main(int argc, char **argv)
#if defined BB_FEATURE_TAR_EXCLUDE
case 'e':
if (strcmp(*argv, "xclude")==0) {
- excludeList=xrealloc( excludeList, sizeof(char**) * (excludeListSize+2));
+ excludeList=xrealloc( excludeList,
+ sizeof(char *) * (excludeListSize+2));
excludeList[excludeListSize] = *(++argv);
if (excludeList[excludeListSize] == NULL)
error_msg_and_die( "Option requires an argument: No file specified\n");
@@ -258,30 +259,30 @@ extern int tar_main(int argc, char **argv)
stopIt=TRUE;
break;
}
- case 'X':
- if (*excludeFileName != '-')
- error_msg_and_die("Only one 'X' option allowed\n");
- excludeFileName = *(++argv);
- if (excludeFileName == NULL)
- error_msg_and_die("Option requires an argument: No file specified\n");
- fileList = fopen (excludeFileName, "rt");
- if (! fileList)
- error_msg_and_die("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;
+ case 'X':
+ if (*excludeFileName != '-')
+ error_msg_and_die("Only one 'X' option allowed\n");
+ excludeFileName = *(++argv);
+ if (excludeFileName == NULL)
+ error_msg_and_die("Option requires an argument: No file specified\n");
+ fileList = fopen (excludeFileName, "r");
+ if (! fileList)
+ error_msg_and_die("Exclude file: file not found\n");
+ while (fgets(file, sizeof(file), fileList) != NULL) {
+ excludeList = xrealloc(excludeList,
+ sizeof(char *) * (excludeListSize+2));
+ if (file[strlen(file)-1] == '\n')
+ file[strlen(file)-1] = '\0';
+ excludeList[excludeListSize] = xstrdup(file);
+ /* Remove leading "/"s */
+ while (*excludeList[excludeListSize] == '/')
+ excludeList[excludeListSize]++;
+ /* Tack a NULL onto the end of the list */
+ excludeList[++excludeListSize] = NULL;
+ }
+ fclose(fileList);
+ stopIt=TRUE;
+ break;
#endif
case '-':
break;