|  | @@ -472,9 +472,27 @@ read_header (bool raw_extended_headers)
 | 
	
		
			
				|  |  |  static char *
 | 
	
		
			
				|  |  |  decode_xform (char *file_name, void *data)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -  bool link_target = *(bool*)data;
 | 
	
		
			
				|  |  | -  file_name = safer_name_suffix (file_name, link_target,
 | 
	
		
			
				|  |  | -				 absolute_names_option);
 | 
	
		
			
				|  |  | +  xform_type type = *(xform_type*)data;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  switch (type)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    case xform_symlink:
 | 
	
		
			
				|  |  | +      /* FIXME: It is not quite clear how and to which extent are the symbolic
 | 
	
		
			
				|  |  | +	 links subject to filename transformation.  In the absence of another
 | 
	
		
			
				|  |  | +	 solution, symbolic links are exempt from component stripping and
 | 
	
		
			
				|  |  | +	 name suffix normalization, but subject to filename transformation
 | 
	
		
			
				|  |  | +	 proper. */ 
 | 
	
		
			
				|  |  | +      return file_name;
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +    case xform_link:
 | 
	
		
			
				|  |  | +      file_name = safer_name_suffix (file_name, true, absolute_names_option);
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +    case xform_regfile:
 | 
	
		
			
				|  |  | +      file_name = safer_name_suffix (file_name, false, absolute_names_option);
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  |    if (strip_name_components)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |        size_t prefix_len = stripped_prefix_len (file_name,
 | 
	
	
		
			
				|  | @@ -487,9 +505,9 @@ decode_xform (char *file_name, void *data)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  bool
 | 
	
		
			
				|  |  | -transform_member_name (char **pinput, bool lnk)
 | 
	
		
			
				|  |  | +transform_member_name (char **pinput, xform_type type)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -  return transform_name_fp (pinput, decode_xform, &lnk);
 | 
	
		
			
				|  |  | +  return transform_name_fp (pinput, decode_xform, &type);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define ISOCTAL(c) ((c)>='0'&&(c)<='7')
 | 
	
	
		
			
				|  | @@ -610,7 +628,7 @@ decode_header (union block *header, struct tar_stat_info *stat_info,
 | 
	
		
			
				|  |  |  	stat_info->is_dumpdir = true;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  transform_member_name (&stat_info->file_name, false);
 | 
	
		
			
				|  |  | +  transform_member_name (&stat_info->file_name, xform_regfile);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* Convert buffer at WHERE0 of size DIGS from external format to
 |