This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

here is a patch for gnu tar incremental backup (-g) or (--listed-incremental)


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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]