--- origsrc/tar-1.25/lib/rmt.h 2009-10-21 10:12:40.000000000 -0600 +++ src/tar-1.25/lib/rmt.h 2010-12-28 11:55:50.406250000 -0700 @@ -62,7 +62,7 @@ extern bool force_local_option; #define rmtcreat(dev_name, mode, command) \ (_remdev (dev_name) \ ? rmt_open__ (dev_name, O_CREAT | O_WRONLY, __REM_BIAS, command) \ - : creat (dev_name, mode)) + : open (dev_name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, mode)) #define rmtlstat(dev_name, muffer) \ (_remdev (dev_name) ? (errno = EOPNOTSUPP), -1 : lstat (dev_name, buffer)) --- origsrc/tar-1.25/rmt/rmt.c 2010-09-14 04:11:10.000000000 -0600 +++ src/tar-1.25/rmt/rmt.c 2010-12-28 11:55:50.437500000 -0700 @@ -334,7 +334,7 @@ open_device (char *str) if (device_fd >= 0) close (device_fd); - device_fd = open (device, flag, MODE_RW); + device_fd = open (device, flag | O_BINARY, MODE_RW); if (device_fd < 0) rmt_error (errno); else --- origsrc/tar-1.25/src/buffer.c 2010-11-05 02:16:25.000000000 -0600 +++ src/tar-1.25/src/buffer.c 2010-12-28 11:55:50.546875000 -0700 @@ -696,6 +696,7 @@ _open_archive (enum access_mode wanted_a enum compress_type type; archive = STDIN_FILENO; + freopen (NULL, "rb", stdin); type = check_compressed_archive (&shortfile); if (type != ct_tar && type != ct_none) FATAL_ERROR ((0, 0, @@ -709,12 +710,19 @@ _open_archive (enum access_mode wanted_a case ACCESS_WRITE: archive = STDOUT_FILENO; + freopen (NULL, + fcntl (STDOUT_FILENO, F_GETFL) & O_APPEND ? "ab" : "wb", + stdout); if (!index_file_name) stdlis = stderr; break; case ACCESS_UPDATE: archive = STDIN_FILENO; + freopen (NULL, "rb", stdin); + freopen (NULL, + fcntl (STDOUT_FILENO, F_GETFL) & O_APPEND ? "ab" : "wb", + stdout); write_archive_to_stdout = true; record_end = record_start; /* set up for 1st record = # 0 */ if (!index_file_name) @@ -1085,7 +1093,7 @@ init_volume_number (void) void closeout_volume_number (void) { - FILE *file = fopen (volno_file_option, "w"); + FILE *file = fopen (volno_file_option, "wb"); if (file) { --- origsrc/tar-1.25/src/incremen.c 2010-10-24 12:07:55.000000000 -0600 +++ src/tar-1.25/src/incremen.c 2010-12-28 11:55:50.750000000 -0700 @@ -997,7 +997,14 @@ read_incr_db_01 (int version, const char lineno++; if (buf[n - 1] == '\n') - buf[n - 1] = '\0'; + { + buf[n - 1] = '\0'; + /* Cygwin hack - older tars created incremental files with \r\n + line endings, so strip the \r. This breaks on managed mount + on directories with a trailing \r, oh well. */ + if (buf[n - 2] == '\r') + buf[n - 2] = '\0'; + } if (version == 1) { @@ -1284,7 +1291,7 @@ read_directory_file (void) int fd; char *buf = NULL; size_t bufsize = 0; - int flags = O_RDWR | O_CREAT; + int flags = O_RDWR | O_CREAT | O_BINARY; if (incremental_level == 0) flags |= O_TRUNC; @@ -1298,7 +1305,7 @@ read_directory_file (void) return; } - listed_incremental_stream = fdopen (fd, "r+"); + listed_incremental_stream = fdopen (fd, "rb+"); if (! listed_incremental_stream) { open_error (listed_incremental_option); --- origsrc/tar-1.25/src/system.c 2010-11-05 02:16:25.000000000 -0600 +++ src/tar-1.25/src/system.c 2010-12-28 11:55:50.859375000 -0700 @@ -352,7 +352,8 @@ sys_child_open_for_compress (void) compressor. */ if (strcmp (archive_name_array[0], "-")) { - archive = creat (archive_name_array[0], MODE_RW); + archive = open (archive_name_array[0], + O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, MODE_RW); if (archive < 0) { int saved_errno = errno; @@ -396,7 +397,11 @@ sys_child_open_for_compress (void) xclose (child_pipe[PWRITE]); if (strcmp (archive_name_array[0], "-") == 0) - archive = STDOUT_FILENO; + { + archive = STDOUT_FILENO; + freopen (NULL, fcntl (STDOUT_FILENO, F_GETFL) & O_APPEND ? "ab" : "wb", + stdout); + } else { archive = rmtcreat (archive_name_array[0], MODE_RW, rsh_command_option);