X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fincremen.c;h=9902d10a2bf9e0a4a51f0418c3f10b4ac133f243;hb=a5375b618ceac671af81d1d7e0cec7bfd813a76b;hp=6fb6e31ce4b874c9951e9c2fc78a091fbf22efd9;hpb=9b7c6df82bf95ade05148c59441e2e189515a11f;p=chaz%2Ftar diff --git a/src/incremen.c b/src/incremen.c index 6fb6e31..9902d10 100644 --- a/src/incremen.c +++ b/src/incremen.c @@ -1,7 +1,7 @@ /* GNU dump extensions to tar. Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, - 2003, 2004 Free Software Foundation, Inc. + 2003, 2004, 2005 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 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include @@ -344,16 +344,19 @@ read_directory_file (void) char *ebuf; int n; long lineno = 1; - unsigned long u = (errno = 0, strtoul (buf, &ebuf, 10)); + uintmax_t u = (errno = 0, strtoumax (buf, &ebuf, 10)); time_t t = u; + if (buf == ebuf || (u == 0 && errno == EINVAL)) ERROR ((0, 0, "%s:1: %s", quotearg_colon (listed_incremental_option), _("Invalid time stamp"))); - else if (t != u || (u == -1 && errno == ERANGE)) + else if (t != u) ERROR ((0, 0, "%s:1: %s", quotearg_colon (listed_incremental_option), _("Time stamp out of range"))); else { + /* FIXME: This should also input nanoseconds, but that will be a + change in file format. */ newer_mtime_option.tv_sec = t; newer_mtime_option.tv_nsec = 0; } @@ -371,24 +374,24 @@ read_directory_file (void) buf[n - 1] = '\0'; errno = 0; - dev = u = strtoul (strp, &ebuf, 10); - if (strp == ebuf || (u == 0 && errno == EINVAL)) + 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 || (u == -1 && errno == ERANGE)) + else if (dev != u) ERROR ((0, 0, "%s:%ld: %s", quotearg_colon (listed_incremental_option), lineno, _("Device number out of range"))); strp = ebuf; errno = 0; - ino = u = strtoul (strp, &ebuf, 10); - if (strp == ebuf || (u == 0 && errno == EINVAL)) + ino = u = strtoumax (strp, &ebuf, 10); + if (!isspace (*ebuf)) ERROR ((0, 0, "%s:%ld: %s", quotearg_colon (listed_incremental_option), lineno, _("Invalid inode number"))); - else if (ino != u || (u == -1 && errno == ERANGE)) + else if (ino != u) ERROR ((0, 0, "%s:%ld: %s", quotearg_colon (listed_incremental_option), lineno, _("Inode number out of range"))); @@ -417,11 +420,15 @@ write_directory_file_entry (void *entry, void *data) if (directory->found) { int e; + char buf[UINTMAX_STRSIZE_BOUND]; char *str = quote_copy_string (directory->name); - fprintf (fp, "+%lu %lu %s\n" + ! directory->nfs, - (unsigned long) directory->device_number, - (unsigned long) directory->inode_number, - str ? str : directory->name); + + if (directory->nfs) + fprintf (fp, "+"); + 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); @@ -444,7 +451,9 @@ write_directory_file (void) if (sys_truncate (fileno (fp)) != 0) truncate_error (listed_incremental_option); - fprintf (fp, "%lu\n", (unsigned long) start_time); + /* FIXME: This should also output nanoseconds, but that will be a + change in file format. */ + fprintf (fp, "%lu\n", (unsigned long int) start_time.tv_sec); if (! ferror (fp) && directory_table) hash_do_for_each (directory_table, write_directory_file_entry, fp); if (ferror (fp)) @@ -515,7 +524,7 @@ purge_directory (char const *directory_name) struct stat st; char *p = new_name (directory_name, cur); - if (deref_stat (true, p, &st)) + if (deref_stat (false, p, &st)) { stat_diag (p); WARN((0, 0, _("%s: Not purging directory: unable to stat"),