/* Update a tar archive.
Copyright (C) 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001, 2003,
- 2004, 2005 Free Software Foundation, Inc.
+ 2004, 2005, 2007, 2010 Free Software Foundation, Inc.
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
name_gather ();
open_archive (ACCESS_UPDATE);
- xheader_write_global ();
+ buffer_write_global_xheader ();
while (!found_end)
{
- enum read_header status = read_header (false);
+ enum read_header status = read_header (¤t_header,
+ ¤t_stat_info,
+ read_header_auto);
switch (status)
{
archive_format = current_format;
if (subcommand_option == UPDATE_SUBCOMMAND
- && (name = name_scan (current_stat_info.file_name, false)) != NULL)
+ && (name = name_scan (current_stat_info.file_name)) != NULL)
{
struct stat s;
chdir_do (name->change_dir);
if (deref_stat (dereference_option,
- current_stat_info.file_name, &s) == 0
- && (tar_timespec_cmp (get_stat_mtime (&s),
- current_stat_info.mtime)
- <= 0))
- add_avoided_name (current_stat_info.file_name);
+ current_stat_info.file_name, &s) == 0)
+ {
+ if (S_ISDIR (s.st_mode))
+ {
+ char *p, *dirp;
+ dirp = savedir (name->name);
+ if (!dirp)
+ savedir_error (name->name);
+ else
+ {
+ namebuf_t nbuf = namebuf_create (name->name);
+
+ for (p = dirp; *p; p += strlen (p) + 1)
+ addname (namebuf_name (nbuf, p),
+ 0, false, NULL);
+
+ namebuf_free (nbuf);
+ free (dirp);
+
+ remname (name);
+ }
+ }
+ else if (tar_timespec_cmp (get_stat_mtime (&s),
+ current_stat_info.mtime)
+ <= 0)
+ remname (name);
+ }
}
skip_member ();
}
tar_stat_destroy (¤t_stat_info);
- xheader_destroy (&extended_header);
previous_status = status;
}
output_start = current_block->buffer;
{
- char *file_name;
-
- while ((file_name = name_from_list ()) != NULL)
+ struct name const *p;
+ while ((p = name_from_list ()) != NULL)
{
+ char *file_name = p->name;
if (excluded_name (file_name))
continue;
if (interactive_option && !confirm ("add", file_name))
if (subcommand_option == CAT_SUBCOMMAND)
append_file (file_name);
else
- dump_file (file_name, 1, (dev_t) 0);
+ dump_file (0, file_name, file_name);
}
}
write_eot ();
close_archive ();
+ finish_deferred_unlinks ();
names_notfound ();
}