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
exclusion_tags = tag;
}
-static void
+void
exclusion_tag_warning (const char *dirname, const char *tagname,
const char *message)
{
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;
{
strcpy (tagname, dirname);
nptr = tagname + dlen;
+ if (addslash)
+ *nptr++ = '/';
}
strcpy (nptr, tag->name);
if (access (tagname, F_OK) == 0
char *p;
int type;
- if (extended_header.buffer || extended_header.stk == NULL)
+ if (st->xhdr.buffer || st->xhdr.stk == NULL)
return old_header;
- xheader_finish (&extended_header);
+ xheader_finish (&st->xhdr);
memcpy (hp.buffer, old_header, sizeof (hp));
if (global)
{
type = XHDTYPE;
p = xheader_xhdr_name (st);
}
- xheader_write (type, p, &extended_header);
+ xheader_write (type, p, &st->xhdr);
free (p);
header = find_next_block ();
memcpy (header, &hp.buffer, sizeof (hp.buffer));
while (size_left > 0)
{
size_t bufsize, count;
-
+
mv_size_left (size_left);
blk = find_next_block ();
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)
{
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;
}
}
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;
/* Now output all the files in the directory. */
/* FIXME: Should speed this up by cd-ing into the dir. */
-
for (entry = directory; (entry_len = strlen (entry)) != 0;
entry += entry_len + 1)
{
const char *p;
open_archive (ACCESS_WRITE);
- xheader_write_global ();
+ buffer_write_global_xheader ();
if (incremental_option)
{
static void
file_count_links (struct tar_stat_info *st)
{
+ if (hard_dereference_option)
+ return;
if (st->stat.st_nlink > 1)
{
struct link *duplicate;
case dump_status_ok:
case dump_status_short:
mv_end ();
+ file_count_links (st);
break;
case dump_status_fail:
abort ();
}
- file_count_links (st);
-
ok = status == dump_status_ok;
}
if (ok)
{
- if (timespec_cmp (get_stat_ctime (&final_stat), original_ctime) != 0
+ if ((timespec_cmp (get_stat_ctime (&final_stat), original_ctime) != 0
+ /* Original ctime will change if the file is a directory and
+ --remove-files is given */
+ && !(remove_files_option && is_dir))
|| original_size < final_stat.st_size)
{
WARN ((0, 0, _("%s: file changed as we read it"),
}
buffer[size] = '\0';
assign_string (&st->link_name, buffer);
+ if (transform_symlinks_option)
+ transform_name (&st->link_name);
if (NAME_FIELD_SIZE - (archive_format == OLDGNU_FORMAT) < size)
write_long_link (st);
header = start_header (st);
if (!header)
return;
- tar_copy_str (header->header.linkname, buffer, NAME_FIELD_SIZE);
+ tar_copy_str (header->header.linkname, st->link_name, NAME_FIELD_SIZE);
header->header.typeflag = SYMTYPE;
finish_header (st, header, block_ordinal);
/* nothing more to do to it */