-2006-02-07 Jim Meyering <jim@meyering.net>
+2006-02-07 Paul Eggert <eggert@cs.ucla.edu>
+
+ * ChangeLog, NEWS, src/common.h, src/extract.c, src/incremen.c:
+ * src/list.c, src/names.c, src/tar.h, src/xheader.c:
+ Update copyright year to 2006.
+
+2006-02-07 Jim Meyering <jim@meyering.net>
* src/xheader.c (sparse_map_decoder): Fix misleading diagnostic.
(decode_header): Set stat_info->is_dumpdir
(skip_member): Do nothing if skipped is true
* src/tar.h (struct tar_stat_info): New members is_dumpdir and skipped.
-
+
2006-01-22 Sergey Poznyakoff <gray@gnu.org.ua>
* src/tar.c (decode_options): Refuse using --delete with
\f
-Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 Free Software
-Foundation, Inc.
+Copyright (C) 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006
+Free Software Foundation, Inc.
This file is part of GNU tar.
GNU tar NEWS - User visible changes.
-Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003,
-2004, 2005, 2006
-Free Software Foundation, Inc.
-See the end for copying conditions.
-
Please send GNU tar bug reports to <bug-tar@gnu.org>
\f
version 1.15.2 (CVS version -- unreleased)
\f
-Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003
-Free Software Foundation, Inc.
+Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003,
+2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU tar.
/* Common declarations for the tar program.
Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
- 2003, 2004, 2005 Free Software Foundation, Inc.
+ 2003, 2004, 2005, 2006 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
/* When creating archive in verbose mode, list member names as stored in the
archive */
-GLOBAL bool show_stored_names_option;
+GLOBAL bool show_stored_names_option;
/* Delay setting modification times and permissions of extracted directories
until the end of extraction. This variable helps correctly restore directory
timestamps from archives with an unusual member order. It is automatically
set for incremental archives. */
-GLOBAL bool delay_directory_restore_option;
+GLOBAL bool delay_directory_restore_option;
\f
/* Declarations for each module. */
void *page_aligned_alloc (void **, size_t);
int set_file_atime (int fd, char const *file,
struct timespec const timespec[2]);
-
+
/* Module names.c. */
extern struct name *gnu_list_name;
bool xheader_keyword_deleted_p (const char *kw);
char *xheader_format_name (struct tar_stat_info *st, const char *fmt,
size_t n);
-
+
/* Module system.c */
void sys_detect_dev_null_output (void);
/* Extract files from a tar archive.
Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
- 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
+ 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Written by John Gilmore, on 1985-11-19.
for (size = current_stat_info.stat.st_size; size > 0; )
{
mv_size_left (size);
-
+
/* Locate data, determine max length writeable, write it,
block that we have used the data, then check if the write
worked. */
-
+
data_block = find_next_block ();
if (! data_block)
{
ERROR ((0, 0, _("Unexpected EOF in archive")));
break; /* FIXME: What happens, then? */
}
-
+
written = available_space_after (data_block);
-
+
if (written > size)
written = size;
errno = 0;
count = full_write (fd, data_block->buffer, written);
size -= written;
-
+
set_next_block_after ((union block *)
(data_block->buffer + written - 1));
if (count != written)
skip_file (size);
mv_end ();
-
+
/* If writing to stdout, don't try to do anything to the filename;
it doesn't exist, or we don't want to touch it anyway. */
(see NOTICE in the comment to delay_set_stat above) */
if (!delay_directory_restore_option)
apply_nonancestor_delayed_set_stat (file_name, 0);
-
+
/* Take a safety backup of a previously existing file. */
if (backup_option)
/* GNU dump extensions to tar.
Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
- 2003, 2004, 2005 Free Software Foundation, Inc.
+ 2003, 2004, 2005, 2006 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
{
struct directory *directory;
char *p, *name_buffer;
-
+
p = dir_name (name);
name_buffer = xmalloc (strlen (p) + 2);
strcpy (name_buffer, p);
if (! ISSLASH (p[strlen (p) - 1]))
strcat (name_buffer, "/");
-
+
directory = find_directory (name_buffer);
free (name_buffer);
if (directory)
(*(char *const *) second) + 1);
}
-enum children
+enum children
procdir (char *name_buffer, struct stat *stat_data,
dev_t device,
enum children children,
bool verbose)
-{
+{
struct directory *directory;
bool nfs = NFS_FILE_STAT (*stat_data);
struct name *np;
-
+
if ((directory = find_directory (name_buffer)) != NULL)
{
/* With NFS, the same file can have two different devices
To avoid spurious incremental redumping of
directories, consider all NFS devices as equal,
relying on the i-node to establish differences. */
-
+
if (! (((directory->nfs & nfs)
|| directory->device_number == stat_data->st_dev)
&& directory->inode_number == stat_data->st_ino))
directory->children = NO_CHILDREN;
else if (children == ALL_CHILDREN)
directory->children = ALL_CHILDREN;
-
+
return directory->children;
}
}
else
children = procdir (name_buffer, &stat_data, device, NO_CHILDREN, false);
-
+
if (dirp && children != NO_CHILDREN)
for (entry = dirp;
(entrylen = strlen (entry)) != 0;
totsize += size;
p += size;
}
- return totsize + 1;
+ return totsize + 1;
}
\f
correctly and that tar will use the most conservative backup method among
possible alternatives (i.e. prefer ALL_CHILDREN over CHANGED_CHILDREN,
etc.) This ensures that the snapshots are updated to the recent version
- without any loss of data. */
+ without any loss of data. */
void
read_directory_file (void)
{
uintmax_t u;
time_t t = u;
int incremental_version;
-
+
if (strncmp (buf, PACKAGE_NAME, sizeof PACKAGE_NAME - 1) == 0)
{
ebuf = buf + sizeof PACKAGE_NAME - 1;
for (; *ebuf != '-'; ebuf++)
if (!*ebuf)
ERROR((1, 0, _("Bad incremental file format")));
-
+
incremental_version = (errno = 0, strtoumax (ebuf+1, &ebuf, 10));
if (getline (&buf, &bufsize, fp) <= 0)
{
if (incremental_version > TAR_INCREMENTAL_VERSION)
ERROR((1, 0, _("Unsupported incremental format version: %d"),
incremental_version));
-
+
t = u = (errno = 0, strtoumax (buf, &ebuf, 10));
if (buf == ebuf || (u == 0 && errno == EINVAL))
ERROR ((0, 0, "%s:%ld: %s",
else if (incremental_version == 1)
{
newer_mtime_option.tv_sec = t;
-
+
t = u = (errno = 0, strtoumax (buf, &ebuf, 10));
if (buf == ebuf || (u == 0 && errno == EINVAL))
ERROR ((0, 0, "%s:%ld: %s",
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
_("Invalid modification time (seconds)")));
- else if (mtime.tv_sec != u)
+ else if (mtime.tv_sec != u)
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
_("Modification time (seconds) out of range")));
strp = ebuf;
-
+
errno = 0;
mtime.tv_nsec = u = strtoumax (strp, &ebuf, 10);
if (!isspace (*ebuf))
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
_("Invalid modification time (nanoseconds)")));
- else if (mtime.tv_nsec != u)
+ else if (mtime.tv_nsec != u)
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
_("Modification time (nanoseconds) out of range")));
}
else
memset (&mtime, 0, sizeof mtime);
-
+
errno = 0;
dev = u = strtoumax (strp, &ebuf, 10);
if (!isspace (*ebuf))
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
_("Invalid device number")));
- else if (dev != u)
+ else if (dev != u)
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
_("Device number out of range")));
int e;
char buf[UINTMAX_STRSIZE_BOUND];
char *str = quote_copy_string (directory->name);
-
+
if (directory->nfs)
fprintf (fp, "+");
fprintf (fp, "%s ", umaxtostr (directory->mtime.tv_sec, buf));
fprintf (fp, "%s ", umaxtostr (directory->device_number, buf));
fprintf (fp, "%s ", umaxtostr (directory->inode_number, buf));
fprintf (fp, "%s\n", str ? str : directory->name);
-
+
e = errno;
if (str)
free (str);
fprintf (fp, "%s-%s-%d\n", PACKAGE_NAME, PACKAGE_VERSION,
TAR_INCREMENTAL_VERSION);
-
+
fprintf (fp, "%lu %lu\n",
(unsigned long int) start_time.tv_sec,
(unsigned long int) start_time.tv_nsec);
union block *data_block;
char *to;
char *archive_dir;
-
+
size = stat_info->stat.st_size;
archive_dir = xmalloc (size);
}
mv_end ();
-
+
stat_info->dumpdir = archive_dir;
stat_info->skipped = true; /* For skip_member() and friends
to work correctly */
skip_member ();
return;
}
-
+
current_dir = savedir (directory_name);
if (!current_dir)
buffer++;
size--;
break;
-
+
case 0:
fputc ('\n', stdlis);
buffer++;
size--;
break;
-
+
default:
fputc (*buffer, stdlis);
buffer++;
/* List a tar archive, with support routines for reading a tar archive.
Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
- 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
+ 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Written by John Gilmore, on 1985-08-26.
decode_header (current_header, ¤t_stat_info, ¤t_format, 0);
if (verbose_option)
print_header (¤t_stat_info, block_ordinal);
-
+
if (incremental_option)
{
if (verbose_option > 2)
}
else
temp_name = st->orig_file_name ? st->orig_file_name : st->file_name;
-
+
if (block_number_option)
{
char buf[UINTMAX_STRSIZE_BOUND];
}
mv_size_left (size);
-
+
while (size > 0)
{
x = find_next_block ();
/* Various processing of names.
Copyright (C) 1988, 1992, 1994, 1996, 1997, 1998, 1999, 2000, 2001,
- 2003, 2004, 2005 Free Software Foundation, Inc.
+ 2003, 2004, 2005, 2006 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
name->change_dir = change_dir;
name->dir_contents = 0;
name->explicit = 1;
-
+
if (string && is_pattern (string))
{
name->regexp = 1;
if (*string == 'D')
{
struct name *np;
-
+
if (allocated_length <= name_length + string_length)
{
do
/* This is like name_match, except that
1. It returns a pointer to the name it matched, and doesn't set FOUND
- in structure. The caller will have to do that if it wants to.
+ in structure. The caller will have to do that if it wants to.
2. If the namelist is empty, it returns null, unlike name_match, which
returns TRUE.
3. The second argument (EXACT) controls matching algorithm. If it
/* GNU tar Archive Format description.
Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
- 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
+ 2000, 2001, 2003, 2004, 2005, 2006 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
bool is_dumpdir; /* Is the member a dumpdir? */
bool skipped; /* The member contents is already read
(for GNUTYPE_DUMPDIR) */
- char *dumpdir; /* Contents of the dump directory */
+ char *dumpdir; /* Contents of the dump directory */
};
union block
/* POSIX extended headers for tar.
- Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004, 2005, 2006 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