Fixed tar option parsing segfault, and make "tar xv" and "tar -xv"
authorEric Andersen <andersen@codepoet.org>
Tue, 30 May 2000 19:05:57 +0000 (19:05 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 30 May 2000 19:05:57 +0000 (19:05 -0000)
both work (i.e. it works with or w/o the "-").
 -Erik

Changelog
archival/tar.c
tar.c

index e9fbdd0438267b38ac4d38da16d777acae3947a1..44bcd37ffd86a8a2306e5acf92d9c56e2ee2afe0 100644 (file)
--- a/Changelog
+++ b/Changelog
        * Fixed ping warnings -- fix from Sascha Ziemann <szi@aibon.ping.de>
        * Fixed update segfault
        * Fixed mknod -- minor number was always 0
-       * Fixed tar option parsing.  In an attempt to accomodate the whiners
-           that wanted "tar cf foo.tar foo" (i.e. no "-" before options)
-           I broke creation of tarballs.  I reverted the change (so tar needs
-           the "-" for all options).
+       * Fixed tar option parsing, so both "tar xvf foo.tar" and "tar -xvf foo.tar"
+           now work (i.e. no "-" before options) (this was very broken in 0.43).
        * Several contributions from Randolph Chung <tausq@debian.org>.
            * cp/mv now accepts the -f flag
            * tail can now accept -<num> commands (e.g. -10) for better 
index c5aad45d6b568289f65f8e80aae47f01de1b9291..7d440f451c7c51ac426751100e8bc0c3a9976cd5 100644 (file)
@@ -173,7 +173,7 @@ extern int tar_main(int argc, char **argv)
 #if defined BB_FEATURE_TAR_EXCLUDE
        int excludeListSize=0;
 #endif
-       const char *tarName=NULL;
+       const char *tarName="-";
        int listFlag     = FALSE;
        int extractFlag  = FALSE;
        int createFlag   = FALSE;
@@ -187,13 +187,13 @@ extern int tar_main(int argc, char **argv)
        /* Parse any options */
        while (--argc > 0 && strspn(*(++argv), "-cxt") >0 ) {
                stopIt=FALSE;
-               while (stopIt==FALSE && *(++(*argv))) {
+               while (stopIt==FALSE && *argv && **argv) {
                        switch (**argv) {
                                case 'f':
                                        if (--argc == 0) {
                                                fatalError( "Option requires an argument: No file specified\n");
                                        }
-                                       if (tarName != NULL)
+                                       if (*tarName != '-')
                                                fatalError( "Only one 'f' option allowed\n");
                                        tarName = *(++argv);
                                        if (tarName == NULL)
@@ -252,6 +252,7 @@ extern int tar_main(int argc, char **argv)
                                        fatalError( "Unknown tar flag '%c'\n" 
                                                        "Try `tar --help' for more information\n", **argv);
                        }
+                       ++(*argv);
                }
        }
 
diff --git a/tar.c b/tar.c
index c5aad45d6b568289f65f8e80aae47f01de1b9291..7d440f451c7c51ac426751100e8bc0c3a9976cd5 100644 (file)
--- a/tar.c
+++ b/tar.c
@@ -173,7 +173,7 @@ extern int tar_main(int argc, char **argv)
 #if defined BB_FEATURE_TAR_EXCLUDE
        int excludeListSize=0;
 #endif
-       const char *tarName=NULL;
+       const char *tarName="-";
        int listFlag     = FALSE;
        int extractFlag  = FALSE;
        int createFlag   = FALSE;
@@ -187,13 +187,13 @@ extern int tar_main(int argc, char **argv)
        /* Parse any options */
        while (--argc > 0 && strspn(*(++argv), "-cxt") >0 ) {
                stopIt=FALSE;
-               while (stopIt==FALSE && *(++(*argv))) {
+               while (stopIt==FALSE && *argv && **argv) {
                        switch (**argv) {
                                case 'f':
                                        if (--argc == 0) {
                                                fatalError( "Option requires an argument: No file specified\n");
                                        }
-                                       if (tarName != NULL)
+                                       if (*tarName != '-')
                                                fatalError( "Only one 'f' option allowed\n");
                                        tarName = *(++argv);
                                        if (tarName == NULL)
@@ -252,6 +252,7 @@ extern int tar_main(int argc, char **argv)
                                        fatalError( "Unknown tar flag '%c'\n" 
                                                        "Try `tar --help' for more information\n", **argv);
                        }
+                       ++(*argv);
                }
        }