X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fcreate.c;h=4edf4882155cab8894530eacf4d2bbc580985154;hb=f2c8b1dff36bee31e4d943a409630543977d2db2;hp=bf2c76b620f5210fdb369318282a1e9dca953eb3;hpb=9fc348aae985244ea851ab149b4e3bdc3c68ab2d;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index bf2c76b..4edf488 100644 --- a/src/create.c +++ b/src/create.c @@ -1,7 +1,7 @@ /* Create a tar archive. Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, - 2003, 2004 Free Software Foundation, Inc. + 2003, 2004, 2005 Free Software Foundation, Inc. Written by John Gilmore, on 1985-08-25. @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -376,7 +376,7 @@ static void tar_name_copy_str (char *dst, const char *src, size_t len) { tar_copy_str (dst, src, len); - if (archive_format == OLDGNU_FORMAT) + if (archive_format == OLDGNU_FORMAT) dst[len-1] = 0; } @@ -420,7 +420,7 @@ write_short_name (struct tar_stat_info *st) memset(field, byte, sizeof(field)-1); \ (field)[sizeof(field)-1] = 0; \ } while (0) - + /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block. */ static void write_gnu_long_link (struct tar_stat_info *st, const char *p, char type) @@ -429,7 +429,7 @@ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type) size_t bufsize; union block *header; char *tmpname; - + header = start_private_header ("././@LongLink", size); FILL(header->header.mtime, '0'); FILL(header->header.mode, '0'); @@ -443,7 +443,7 @@ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type) gid_to_gname (0, &tmpname); GNAME_TO_CHARS (tmpname, header->header.gname); free (tmpname); - + strcpy (header->header.magic, OLDGNU_MAGIC); header->header.typeflag = type; finish_header (st, header, -1); @@ -630,8 +630,9 @@ start_header (struct tar_stat_info *st) if (group_option != (gid_t) -1) st->stat.st_gid = group_option; if (mode_option) - st->stat.st_mode = ((st->stat.st_mode & ~MODE_ALL) - | mode_adjust (st->stat.st_mode, mode_option)); + st->stat.st_mode = + ((st->stat.st_mode & ~MODE_ALL) + | mode_adjust (st->stat.st_mode, mode_option, initial_umask)); /* Paul Eggert tried the trivial test ($WRITER cf a b; $READER tvf a) for a few tars and came up with the following interoperability @@ -859,7 +860,7 @@ dump_regular_file (int fd, struct tar_stat_info *st) if (multi_volume_option) { - assign_string (&save_name, st->file_name); + assign_string (&save_name, st->orig_file_name); save_sizeleft = size_left; save_totsize = st->stat.st_size; } @@ -885,9 +886,9 @@ dump_regular_file (int fd, struct tar_stat_info *st) return dump_status_short; } size_left -= count; - - set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE); - + if (count) + set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE); + if (count != bufsize) { char buf[UINTMAX_STRSIZE_BOUND]; @@ -900,7 +901,7 @@ dump_regular_file (int fd, struct tar_stat_info *st) STRINGIFY_BIGINT (size_left, buf))); if (! ignore_failed_read_option) exit_status = TAREXIT_FAILURE; - pad_archive (size_left); + pad_archive (size_left - (bufsize-count)); return dump_status_short; } } @@ -961,7 +962,7 @@ check_cache_directory (char *dirname) if (fd >= 0) { static char tagbuf[CACHEDIR_SIGNATURE_SIZE]; - + if (read (fd, tagbuf, CACHEDIR_SIGNATURE_SIZE) == CACHEDIR_SIGNATURE_SIZE && memcmp (tagbuf, CACHEDIR_SIGNATURE, CACHEDIR_SIGNATURE_SIZE) == 0) @@ -1210,8 +1211,8 @@ create_archive (void) /* Calculate the hash of a link. */ -static unsigned -hash_link (void const *entry, unsigned n_buckets) +static size_t +hash_link (void const *entry, size_t n_buckets) { struct link const *l = entry; uintmax_t num = l->dev ^ l->ino; @@ -1262,7 +1263,8 @@ dump_hard_link (struct tar_stat_info *st) if ((duplicate = hash_lookup (link_table, &lp))) { /* We found a link. */ - char const *link_name = safer_name_suffix (duplicate->name, true); + char const *link_name = safer_name_suffix (duplicate->name, true, + absolute_names_option); duplicate->nlink--; @@ -1360,7 +1362,8 @@ dump_file0 (struct tar_stat_info *st, char *p, return; assign_string (&st->orig_file_name, p); - assign_string (&st->file_name, safer_name_suffix (p, false)); + assign_string (&st->file_name, + safer_name_suffix (p, false, absolute_names_option)); if (deref_stat (dereference_option, p, &st->stat) != 0) {