X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fupdate.c;h=6db902ba9b2356de1e640606cea5b6e763195821;hb=c4e054673b8fe8b84a4ac1fb8af14334f6a75f6b;hp=6b33529b5cf3682f611a7c56d5576d73037ff12c;hpb=2bda83b48d8a6807632312403561b11b79048443;p=chaz%2Ftar diff --git a/src/update.c b/src/update.c index 6b33529..6db902b 100644 --- a/src/update.c +++ b/src/update.c @@ -42,22 +42,22 @@ bool time_to_start_writing; first part of the record. */ char *output_start; -/* Catenate file PATH to the archive without creating a header for it. +/* Catenate file FILE_NAME to the archive without creating a header for it. It had better be a tar file or the archive is screwed. */ static void -append_file (char *path) +append_file (char *file_name) { - int handle = open (path, O_RDONLY | O_BINARY); + int handle = open (file_name, O_RDONLY | O_BINARY); struct stat stat_data; if (handle < 0) { - open_error (path); + open_error (file_name); return; } if (fstat (handle, &stat_data) != 0) - stat_error (path); + stat_error (file_name); else { off_t bytes_left = stat_data.st_size; @@ -79,14 +79,14 @@ append_file (char *path) status = safe_read (handle, start->buffer, buffer_size); if (status == SAFE_READ_ERROR) - read_fatal_details (path, stat_data.st_size - bytes_left, + read_fatal_details (file_name, stat_data.st_size - bytes_left, buffer_size); if (status == 0) FATAL_ERROR ((0, 0, ngettext ("%s: File shrank by %s byte", "%s: File shrank by %s bytes", bytes_left), - quotearg_colon (path), + quotearg_colon (file_name), STRINGIFY_BIGINT (bytes_left, buf))); bytes_left -= status; @@ -96,7 +96,7 @@ append_file (char *path) } if (close (handle) != 0) - close_error (path); + close_error (file_name); } /* Implement the 'r' (add files to end of archive), and 'u' (add files @@ -106,7 +106,7 @@ void update_archive (void) { enum read_header previous_status = HEADER_STILL_UNREAD; - int found_end = 0; + bool found_end = false; name_gather (); open_archive (ACCESS_UPDATE); @@ -126,30 +126,33 @@ update_archive (void) { struct name *name; + decode_header (current_header, ¤t_stat_info, + ¤t_format, 0); + archive_format = current_format; + if (subcommand_option == UPDATE_SUBCOMMAND && (name = name_scan (current_stat_info.file_name)) != NULL) { struct stat s; - enum archive_format unused; - decode_header (current_header, ¤t_stat_info, &unused, 0); chdir_do (name->change_dir); if (deref_stat (dereference_option, current_stat_info.file_name, &s) == 0 && s.st_mtime <= current_stat_info.stat.st_mtime) add_avoided_name (current_stat_info.file_name); } + skip_member (); break; } case HEADER_ZERO_BLOCK: current_block = current_header; - found_end = 1; + found_end = true; break; case HEADER_END_OF_FILE: - found_end = 1; + found_end = true; break; case HEADER_FAILURE: @@ -175,6 +178,8 @@ update_archive (void) break; } + tar_stat_destroy (¤t_stat_info); + xheader_destroy (&extended_header); previous_status = status; } @@ -183,18 +188,18 @@ update_archive (void) output_start = current_block->buffer; { - char *path; + char *file_name; - while ((path = name_from_list ()) != NULL) + while ((file_name = name_from_list ()) != NULL) { - if (excluded_name (path)) + if (excluded_name (file_name)) continue; - if (interactive_option && !confirm ("add", path)) + if (interactive_option && !confirm ("add", file_name)) continue; if (subcommand_option == CAT_SUBCOMMAND) - append_file (path); + append_file (file_name); else - dump_file (path, 1, (dev_t) 0); + dump_file (file_name, 1, (dev_t) 0); } }