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:
		@@ -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"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user