X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fcreate.c;h=6f553fe1077a280778658b2f22092942041456b1;hb=f3a24a7a51d10c301441690c9302300e5410c260;hp=c5a5d712ad4603f6933c7bbeff976a620e8b9ab4;hpb=3209329337c87a102fa12d7eb60a3df323ba56c1;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index c5a5d71..6f553fe 100644 --- a/src/create.c +++ b/src/create.c @@ -452,7 +452,7 @@ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type) finish_header (st, header, -1); header = find_next_block (); - + bufsize = available_space_after (header); while (bufsize < size) @@ -576,8 +576,8 @@ write_long_name (struct tar_stat_info *st) return write_short_name (st); } -static union block * -write_extended (struct tar_stat_info *st, union block *old_header) +union block * +write_extended (char type, struct tar_stat_info *st, union block *old_header) { union block *header, hp; char *p; @@ -588,7 +588,7 @@ write_extended (struct tar_stat_info *st, union block *old_header) xheader_finish (&extended_header); memcpy (hp.buffer, old_header, sizeof (hp)); p = xheader_xhdr_name (st); - xheader_write (XHDTYPE, p, &extended_header); + xheader_write (type, p, &extended_header); free (p); header = find_next_block (); memcpy (header, &hp.buffer, sizeof (hp.buffer)); @@ -852,7 +852,7 @@ finish_header (struct tar_stat_info *st, print_header (st, block_ordinal); } - header = write_extended (st, header); + header = write_extended (XHDTYPE, st, header); simple_finish_header (header); } @@ -863,7 +863,7 @@ pad_archive (off_t size_left) union block *blk; while (size_left > 0) { - save_sizeleft = size_left; + mv_size_left (size_left); blk = find_next_block (); memset (blk->buffer, 0, BLOCKSIZE); set_next_block_after (blk); @@ -889,16 +889,13 @@ dump_regular_file (int fd, struct tar_stat_info *st) finish_header (st, blk, block_ordinal); + mv_begin (st); while (size_left > 0) { size_t bufsize, count; - if (multi_volume_option) - { - assign_string (&save_name, st->orig_file_name); - save_sizeleft = size_left; - save_totsize = st->stat.st_size; - } + mv_size_left (size_left); + blk = find_next_block (); bufsize = available_space_after (blk); @@ -1029,7 +1026,7 @@ dump_dir0 (char *directory, if (!blk) return; - if (incremental_option) + if (incremental_option && archive_format != POSIX_FORMAT) blk->header.typeflag = GNUTYPE_DUMPDIR; else /* if (standard_option) */ blk->header.typeflag = DIRTYPE; @@ -1040,51 +1037,51 @@ dump_dir0 (char *directory, finish_header (st, blk, block_ordinal); else if (gnu_list_name->dir_contents) { - off_t size_left; - off_t totsize; - size_t bufsize; - ssize_t count; - const char *buffer, *p_buffer; - - block_ordinal = current_block_ordinal (); - buffer = gnu_list_name->dir_contents; /* FOO */ - totsize = 0; - if (buffer) - for (p_buffer = buffer; *p_buffer; ) - { - size_t size = strlen (p_buffer) + 1; - totsize += size; - p_buffer += size; - } - totsize++; - OFF_TO_CHARS (totsize, blk->header.size); - finish_header (st, blk, block_ordinal); - p_buffer = buffer; - size_left = totsize; - while (size_left > 0) + if (archive_format == POSIX_FORMAT) { - if (multi_volume_option) - { - assign_string (&save_name, st->orig_file_name); - save_sizeleft = size_left; - save_totsize = totsize; - } - blk = find_next_block (); - bufsize = available_space_after (blk); - if (size_left < bufsize) + xheader_store ("GNU.dumpdir", st, gnu_list_name->dir_contents); + finish_header (st, blk, block_ordinal); + } + else + { + off_t size_left; + off_t totsize; + size_t bufsize; + ssize_t count; + const char *buffer, *p_buffer; + + block_ordinal = current_block_ordinal (); + buffer = gnu_list_name->dir_contents; + if (buffer) + totsize = dumpdir_size (buffer); + else + totsize = 0; + OFF_TO_CHARS (totsize, blk->header.size); + finish_header (st, blk, block_ordinal); + p_buffer = buffer; + size_left = totsize; + + mv_begin (st); + mv_total_size (totsize); + while (size_left > 0) { - bufsize = size_left; - count = bufsize % BLOCKSIZE; - if (count) - memset (blk->buffer + size_left, 0, BLOCKSIZE - count); + mv_size_left (size_left); + blk = find_next_block (); + bufsize = available_space_after (blk); + if (size_left < bufsize) + { + bufsize = size_left; + count = bufsize % BLOCKSIZE; + if (count) + memset (blk->buffer + size_left, 0, BLOCKSIZE - count); + } + memcpy (blk->buffer, p_buffer, bufsize); + size_left -= bufsize; + p_buffer += bufsize; + set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE); } - memcpy (blk->buffer, p_buffer, bufsize); - size_left -= bufsize; - p_buffer += bufsize; - set_next_block_after (blk + (bufsize - 1) / BLOCKSIZE); + mv_end (); } - if (multi_volume_option) - assign_string (&save_name, 0); return; } } @@ -1501,14 +1498,12 @@ dump_file0 (struct tar_stat_info *st, char *p, switch (status) { case dump_status_ok: - if (multi_volume_option) - assign_string (&save_name, 0); + mv_end (); dump_regular_finish (fd, st, original_ctime); break; case dump_status_short: - if (multi_volume_option) - assign_string (&save_name, 0); + mv_end (); close (fd); break; @@ -1622,5 +1617,7 @@ dump_file (char *p, int top_level, dev_t parent_device) struct tar_stat_info st; tar_stat_init (&st); dump_file0 (&st, p, top_level, parent_device); + if (listed_incremental_option) + update_parent_directory (p); tar_stat_destroy (&st); }