diff options
Diffstat (limited to 'archival')
-rw-r--r-- | archival/tar.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/archival/tar.c b/archival/tar.c index bd8e5dc99..3c0ceb70d 100644 --- a/archival/tar.c +++ b/archival/tar.c | |||
@@ -841,6 +841,33 @@ int tar_main(int argc UNUSED_PARAM, char **argv) | |||
841 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS | 841 | #if ENABLE_FEATURE_TAR_LONG_OPTIONS |
842 | applet_long_options = tar_longopts; | 842 | applet_long_options = tar_longopts; |
843 | #endif | 843 | #endif |
844 | #if ENABLE_DESKTOP | ||
845 | if (argv[1][0] != '-') { | ||
846 | /* Compat: | ||
847 | * 1st argument without dash handles options with parameters | ||
848 | * differently from dashed one: it takes *next argv[i]* | ||
849 | * as paramenter even if there are more chars in 1st argument: | ||
850 | * "tar fx TARFILE" - "x" is not taken as f's param | ||
851 | * but is interpreted as -x option | ||
852 | * "tar -xf TARFILE" - dashed equivalent of the above | ||
853 | * "tar -fx ..." - "x" is taken as f's param | ||
854 | * getopt32 wouldn't handle 1st command correctly. | ||
855 | * Unfortunately, people do use such commands. | ||
856 | * We massage argv[1] to work around it by moving 'f' | ||
857 | * to the end of the string. | ||
858 | * More contrived "tar fCx TARFILE DIR" still fails, | ||
859 | * but such commands are much less likely to be used. | ||
860 | */ | ||
861 | char *f = strchr(argv[1], 'f'); | ||
862 | if (f) { | ||
863 | while (f[1] != '\0') { | ||
864 | *f = f[1]; | ||
865 | f++; | ||
866 | } | ||
867 | *f = 'f'; | ||
868 | } | ||
869 | } | ||
870 | #endif | ||
844 | opt = getopt32(argv, | 871 | opt = getopt32(argv, |
845 | "txC:f:Opvk" | 872 | "txC:f:Opvk" |
846 | IF_FEATURE_TAR_CREATE( "ch" ) | 873 | IF_FEATURE_TAR_CREATE( "ch" ) |