From f645037ffb156dbca22296c1453f0b45383ff8ce Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 25 Oct 2009 01:32:45 +0200 Subject: [PATCH] tar: handle "tar fx TARFILE" etc function old new delta tar_main 702 751 +49 Signed-off-by: Denys Vlasenko --- archival/tar.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/archival/tar.c b/archival/tar.c index bd8e5dc99..3c0ceb70d 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -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"