tar: handle "tar fx TARFILE" etc
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 24 Oct 2009 23:32:45 +0000 (01:32 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 24 Oct 2009 23:32:45 +0000 (01:32 +0200)
function                                             old     new   delta
tar_main                                             702     751     +49

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
archival/tar.c

index bd8e5dc99b993b4cb6881ba04d635fb9b66d61e3..3c0ceb70d62a5c70ce9377637b9090f199d3c112 100644 (file)
@@ -840,6 +840,33 @@ int tar_main(int argc UNUSED_PARAM, char **argv)
                IF_NOT_FEATURE_TAR_CREATE("t--x:x--t"); // mutually exclusive
 #if ENABLE_FEATURE_TAR_LONG_OPTIONS
        applet_long_options = tar_longopts;
+#endif
+#if ENABLE_DESKTOP
+       if (argv[1][0] != '-') {
+               /* Compat:
+                * 1st argument without dash handles options with parameters
+                * differently from dashed one: it takes *next argv[i]*
+                * as paramenter even if there are more chars in 1st argument:
+                *  "tar fx TARFILE" - "x" is not taken as f's param
+                *  but is interpreted as -x option
+                *  "tar -xf TARFILE" - dashed equivalent of the above
+                *  "tar -fx ..." - "x" is taken as f's param
+                * getopt32 wouldn't handle 1st command correctly.
+                * Unfortunately, people do use such commands.
+                * We massage argv[1] to work around it by moving 'f'
+                * to the end of the string.
+                * More contrived "tar fCx TARFILE DIR" still fails,
+                * but such commands are much less likely to be used.
+                */
+               char *f = strchr(argv[1], 'f');
+               if (f) {
+                       while (f[1] != '\0') {
+                               *f = f[1];
+                               f++;
+                       }
+                       *f = 'f';
+               }
+       }
 #endif
        opt = getopt32(argv,
                "txC:f:Opvk"