X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fcreate.c;h=de81639e2244f7c89afd0d6e597f77c4624adcc2;hb=745832a280f635b26d67e2cb8d8882ac0432e5a0;hp=1b31a3d319cdf92587970ec6c12b1bab9fb0d558;hpb=250db35f17d7700f4d209fd086b7dbc5b7ebe88f;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index 1b31a3d..de81639 100644 --- a/src/create.c +++ b/src/create.c @@ -7,7 +7,7 @@ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any later + Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but @@ -58,7 +58,7 @@ add_exclusion_tag (const char *name, enum exclusion_tag_type type, exclusion_tags = tag; } -static void +void exclusion_tag_warning (const char *dirname, const char *tagname, const char *message) { @@ -70,19 +70,19 @@ exclusion_tag_warning (const char *dirname, const char *tagname, message)); } -static enum exclusion_tag_type +enum exclusion_tag_type check_exclusion_tags (char *dirname, const char **tag_file_name) { static char *tagname; static size_t tagsize; struct exclusion_tag *tag; size_t dlen = strlen (dirname); + int addslash = dirname[dlen-1] != '/'; char *nptr = NULL; - char *ret = NULL; for (tag = exclusion_tags; tag; tag = tag->next) { - size_t size = dlen + tag->length + 1; + size_t size = dlen + addslash + tag->length + 1; if (size > tagsize) { tagsize = size; @@ -93,6 +93,8 @@ check_exclusion_tags (char *dirname, const char **tag_file_name) { strcpy (tagname, dirname); nptr = tagname + dlen; + if (addslash) + *nptr++ = '/'; } strcpy (nptr, tag->name); if (access (tagname, F_OK) == 0 @@ -1064,8 +1066,7 @@ dump_regular_file (int fd, struct tar_stat_info *st) return dump_status_short; } size_left -= count; - if (count) - set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE); + set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE); if (count != bufsize) { @@ -1079,7 +1080,7 @@ dump_regular_file (int fd, struct tar_stat_info *st) STRINGIFY_BIGINT (size_left, buf))); if (! ignore_failed_read_option) exit_status = TAREXIT_DIFFERS; - pad_archive (size_left - (bufsize-count)); + pad_archive (size_left - (bufsize - count)); return dump_status_short; } } @@ -1183,8 +1184,11 @@ dump_dir0 (char *directory, switch (check_exclusion_tags (st->orig_file_name, &tag_file_name)) { - case exclusion_tag_none: case exclusion_tag_all: + /* Handled in dump_file0 */ + break; + + case exclusion_tag_none: { char const *entry; size_t entry_len; @@ -1418,6 +1422,8 @@ dump_hard_link (struct tar_stat_info *st) static void file_count_links (struct tar_stat_info *st) { + if (hard_dereference_option) + return; if (st->stat.st_nlink > 1) { struct link *duplicate;