Mail Archives: cygwin/2003/10/27/06:46:40
Here is a fix for gnu tar incremental backup feature
for the most recent cygwin that uses a 64-bit value for
the type ion_t
This was done against the sources in release/tar/tar-1.13.25-3-src.tar.bz2
I am a fair C programmer but have no skill in GNU Autoconfig,
so I did not attempt to define the required "#if" parameters in
that way. But if you need a quick fix for the -g or --listed-incremental
feature of gnu tar this will do nicely.
I've provided both a regular diff and a patch diff, because regular diff
more clearly shows the minimal changes required.
The fix was quite easy due to a previous message to the cygwin mailing
list where the problem was clearly identified as having to do with
the inon_t size.
-George J. Carrette
===INCREMEN.C.DIFF===
133a134
>
367a369,381
> #define INO_T_SIZE 8
> #define LONG_SIZE 4
> #if INO_T_SIZE > LONG_SIZE
> #define INON_T unsigned long long
> #define DIRECTORY_FILE_ENTRY_FMT "+%lu %llu %s\n"
> #define STRTOINON strtoull
> #else
> #define INON_T unsigned long
> #define DIRECTORY_FILE_ENTRY_FMT "+%lu %lu %s\n"
> #define STRTOINON strtoul
> #endif
>
>
403c417
< unsigned long u = (errno = 0, strtoul (buf, &ebuf, 10));
---
> INON_T u = (errno = 0, STRTOINON (buf, &ebuf, 10));
427c441
< dev = u = strtoul (strp, &ebuf, 10);
---
> dev = u = STRTOINON (strp, &ebuf, 10);
439c453
< ino = u = strtoul (strp, &ebuf, 10);
---
> ino = u = STRTOINON (strp, &ebuf, 10);
472a487
>
474c489
< fprintf (fp, "+%lu %lu %s\n" + ! directory->nfs,
---
> fprintf (fp, DIRECTORY_FILE_ENTRY_FMT + ! directory->nfs,
476c491
< (unsigned long) directory->inode_number,
---
> (INON_T) directory->inode_number,
===INCREMEN.C.PATCH===
*** incremen.c.old Sun Oct 26 20:44:33 2003
--- incremen.c Mon Oct 27 06:24:18 2003
*************** note_directory (char const *name, dev_t
*** 131,136 ****
--- 131,137 ----
size_t size = offsetof (struct directory, name) + strlen (name) + 1;
struct directory *directory = xmalloc (size);
+
directory->device_number = dev;
directory->inode_number = ino;
directory->children = CHANGED_CHILDREN;
*************** get_directory_contents (char *path, dev_
*** 365,370 ****
--- 366,384 ----
}
}
+ #define INO_T_SIZE 8
+ #define LONG_SIZE 4
+ #if INO_T_SIZE > LONG_SIZE
+ #define INON_T unsigned long long
+ #define DIRECTORY_FILE_ENTRY_FMT "+%lu %llu %s\n"
+ #define STRTOINON strtoull
+ #else
+ #define INON_T unsigned long
+ #define DIRECTORY_FILE_ENTRY_FMT "+%lu %lu %s\n"
+ #define STRTOINON strtoul
+ #endif
+
+
static FILE *listed_incremental_stream;
void
*************** read_directory_file (void)
*** 400,406 ****
char *ebuf;
int n;
long lineno = 1;
! unsigned long u = (errno = 0, strtoul (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),
--- 414,420 ----
char *ebuf;
int n;
long lineno = 1;
! INON_T u = (errno = 0, STRTOINON (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),
*************** read_directory_file (void)
*** 424,430 ****
buf[n - 1] = '\0';
errno = 0;
! dev = u = strtoul (strp, &ebuf, 10);
if (strp == ebuf || (u == 0 && errno == EINVAL))
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
--- 438,444 ----
buf[n - 1] = '\0';
errno = 0;
! dev = u = STRTOINON (strp, &ebuf, 10);
if (strp == ebuf || (u == 0 && errno == EINVAL))
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
*************** read_directory_file (void)
*** 436,442 ****
strp = ebuf;
errno = 0;
! ino = u = strtoul (strp, &ebuf, 10);
if (strp == ebuf || (u == 0 && errno == EINVAL))
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
--- 450,456 ----
strp = ebuf;
errno = 0;
! ino = u = STRTOINON (strp, &ebuf, 10);
if (strp == ebuf || (u == 0 && errno == EINVAL))
ERROR ((0, 0, "%s:%ld: %s",
quotearg_colon (listed_incremental_option), lineno,
*************** write_directory_file_entry (void *entry,
*** 470,479 ****
if (directory->found)
{
int e;
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);
e = errno;
if (str)
--- 484,494 ----
if (directory->found)
{
int e;
+
char *str = quote_copy_string (directory->name);
! fprintf (fp, DIRECTORY_FILE_ENTRY_FMT + ! directory->nfs,
(unsigned long) directory->device_number,
! (INON_T) directory->inode_number,
str ? str : directory->name);
e = errno;
if (str)
=========================================
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -