finish_header (st, header, -1);
header = find_next_block ();
-
+
bufsize = available_space_after (header);
while (bufsize < size)
return write_short_name (st);
}
-static union block *
-write_extended (struct tar_stat_info *st, union block *old_header)
+union block *
+write_extended (bool global, struct tar_stat_info *st, union block *old_header)
{
union block *header, hp;
char *p;
-
+ int type;
+
if (extended_header.buffer || extended_header.stk == NULL)
return old_header;
xheader_finish (&extended_header);
memcpy (hp.buffer, old_header, sizeof (hp));
- p = xheader_xhdr_name (st);
- xheader_write (XHDTYPE, p, &extended_header);
+ if (global)
+ {
+ type = XGLTYPE;
+ p = xheader_ghdr_name ();
+ }
+ else
+ {
+ type = XHDTYPE;
+ p = xheader_xhdr_name (st);
+ }
+ xheader_write (type, p, &extended_header);
free (p);
header = find_next_block ();
memcpy (header, &hp.buffer, sizeof (hp.buffer));
print_header (st, block_ordinal);
}
- header = write_extended (st, header);
+ header = write_extended (false, st, header);
simple_finish_header (header);
}
\f
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);
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);
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;
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;
}
}
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;