On Saturday 24 October 2009 12:44, Andreas Schwab wrote: > Bernhard Reutner-Fischer <rep.dot.nop@xxxxxxxxx> writes: > > > On Sat, Oct 24, 2009 at 11:49:10AM +0200, Andreas Schwab wrote: > >>Bernhard Reutner-Fischer <rep.dot.nop@xxxxxxxxx> writes: > >> > >>> I suppose xf - -o would work? > >> > >>Isn't that the same as 'xfo -'? > > > > Not really (if you do not permute the arguments which we don't in > > busybox, for size reasons). > > There is no argument permutation. The traditional argument parsing of > tar does not cluster option letters with option arguments. > > Of course, just using 'xof -' will work around this busybox bug. From my side, I prefer to squash that busybox bug. This is the second time people complain about it, so it is a reoccurring problem. The attached patch has been pushed to busybox git. function old new delta tar_main 702 751 +49 -- vda
diff -d -urpN busybox.0/archival/tar.c busybox.1/archival/tar.c --- busybox.0/archival/tar.c 2009-10-20 22:11:09.000000000 +0200 +++ busybox.1/archival/tar.c 2009-10-25 01:27:38.000000000 +0200 @@ -841,6 +841,33 @@ int tar_main(int argc UNUSED_PARAM, char #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" IF_FEATURE_TAR_CREATE( "ch" )