X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=blobdiff_plain;f=src%2Flist.c;h=36552607336730428fe5aeedcc9f1e9e7b9066c5;hp=3a59f2993abbb6ef3c397641558f0cb458062268;hb=1689ed43885c8418c29d1365ae3a06450a460830;hpb=2af87fa2776c8125a587a9b0c2c4fae3bf921ff7 diff --git a/src/list.c b/src/list.c index 3a59f29..3655260 100644 --- a/src/list.c +++ b/src/list.c @@ -115,6 +115,30 @@ transform_member_name (char **pinput, int type) return transform_name_fp (pinput, type, decode_xform, &type); } +static void +enforce_one_top_level (char **pfile_name) +{ + char *file_name = *pfile_name; + char *p; + + for (p = file_name; *p && (ISSLASH (*p) || *p == '.'); p++) + ; + + if (!*p) + return; + + if (strncmp (p, one_top_level_dir, strlen (one_top_level_dir)) == 0) + { + int pos = strlen (one_top_level_dir); + if (ISSLASH (p[pos]) || p[pos] == 0) + return; + } + + *pfile_name = new_name (one_top_level_dir, file_name); + normalize_filename_x (*pfile_name); + free (file_name); +} + void transform_stat_info (int typeflag, struct tar_stat_info *stat_info) { @@ -132,6 +156,9 @@ transform_stat_info (int typeflag, struct tar_stat_info *stat_info) case LNKTYPE: transform_member_name (&stat_info->link_name, XFORM_LINK); } + + if (one_top_level_option) + enforce_one_top_level (¤t_stat_info.file_name); } /* Main loop for reading an archive. */ @@ -194,6 +221,7 @@ read_and (void (*do_something) (void)) continue; } } + transform_stat_info (current_header->header.typeflag, ¤t_stat_info); (*do_something) ();