tar: handle "tar fx TARFILE" etc

function                                             old     new   delta
tar_main                                             702     751     +49

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-10-25 01:32:45 +02:00
parent b87d972817
commit f645037ffb

View 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_NOT_FEATURE_TAR_CREATE("t--x:x--t"); // mutually exclusive
#if ENABLE_FEATURE_TAR_LONG_OPTIONS #if ENABLE_FEATURE_TAR_LONG_OPTIONS
applet_long_options = tar_longopts; 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 #endif
opt = getopt32(argv, opt = getopt32(argv,
"txC:f:Opvk" "txC:f:Opvk"