X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fcreate.c;h=0a6bacf183aac19b32ccb8acff57dd5696b39d30;hb=37ddfb0b;hp=ce7d966f6aec94e0652736f33eadbd372f53354b;hpb=09f039050e4c04f7344cdcaee15c817927de7c9c;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index ce7d966..0a6bacf 100644 --- a/src/create.c +++ b/src/create.c @@ -1265,6 +1265,12 @@ dump_dir (int fd, struct tar_stat_info *st, bool top_level, return true; } + +/* Number of links a file can have without having to be entered into + the link table. Typically this is 1, but in trickier circumstances + it is 0. */ +static nlink_t trivial_link_count; + /* Main functions of this module. */ @@ -1273,6 +1279,8 @@ create_archive (void) { struct name const *p; + trivial_link_count = name_count <= 1 && ! dereference_option; + open_archive (ACCESS_WRITE); buffer_write_global_xheader (); @@ -1380,7 +1388,8 @@ static Hash_table *link_table; static bool dump_hard_link (struct tar_stat_info *st) { - if (link_table && (st->stat.st_nlink > 1 || remove_files_option)) + if (link_table + && (trivial_link_count < st->stat.st_nlink || remove_files_option)) { struct link lp; struct link *duplicate; @@ -1427,7 +1436,7 @@ file_count_links (struct tar_stat_info *st) { if (hard_dereference_option) return; - if (st->stat.st_nlink > 1) + if (trivial_link_count < st->stat.st_nlink) { struct link *duplicate; char *linkname = NULL;