From: Sergey Poznyakoff Date: Mon, 17 Nov 2003 11:05:18 +0000 (+0000) Subject: (diff_archive): Use sparse_diff_file. X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=commitdiff_plain;h=bb798080beec25634f7552934324b5f5c995707f (diff_archive): Use sparse_diff_file. --- diff --git a/src/compare.c b/src/compare.c index a502544..5a91b90 100644 --- a/src/compare.c +++ b/src/compare.c @@ -62,7 +62,7 @@ diff_init (void) /* Sigh about something that differs by writing a MESSAGE to stdlis, given MESSAGE is nonzero. Also set the exit status if not already. */ void -report_difference (const char *fmt, ...) +report_difference (struct tar_stat_info *st, const char *fmt, ...) { if (fmt) { @@ -98,11 +98,12 @@ process_rawdata (size_t bytes, char *buffer) if (status < 0) { read_error (current_stat_info.file_name); - report_difference (NULL); + report_difference (¤t_stat_info, NULL); } else { - report_difference (ngettext ("Could only read %lu of %lu byte", + report_difference (¤t_stat_info, + ngettext ("Could only read %lu of %lu byte", "Could only read %lu of %lu bytes", bytes), (unsigned long) status, (unsigned long) bytes); @@ -112,7 +113,8 @@ process_rawdata (size_t bytes, char *buffer) if (memcmp (buffer, diff_buffer, bytes)) { - report_difference (_("Contents differ")); + report_difference (¤t_stat_info, + _("Contents differ")); return 0; } @@ -128,7 +130,7 @@ process_dumpdir (size_t bytes, char *buffer) { if (memcmp (buffer, dumpdir_cursor, bytes)) { - report_difference (_("Contents differ")); + report_difference (¤t_stat_info, _("Contents differ")); return 0; } @@ -171,12 +173,6 @@ read_and_process (off_t size, int (*processor) (size_t, char *)) } } -static void -diff_sparse_files (void) -{ - /*FIXME!!*/abort(); -} - /* Call either stat or lstat over STAT_DATA, depending on --dereference (-h), for a file which should exist. Diagnose any problem. Return nonzero for success, zero otherwise. */ @@ -191,7 +187,7 @@ get_stat_data (char const *file_name, struct stat *stat_data) stat_warn (file_name); else stat_error (file_name); - report_difference (NULL); + report_difference (¤t_stat_info, NULL); return 0; } @@ -244,22 +240,26 @@ diff_archive (void) if (!S_ISREG (stat_data.st_mode)) { - report_difference (_("File type differs")); + report_difference (¤t_stat_info, _("File type differs")); skip_member (); goto quit; } - if ((current_stat_info.stat.st_mode & MODE_ALL) != (stat_data.st_mode & MODE_ALL)) - report_difference (_("Mode differs")); + if ((current_stat_info.stat.st_mode & MODE_ALL) != + (stat_data.st_mode & MODE_ALL)) + report_difference (¤t_stat_info, _("Mode differs")); - sys_compare_uid_gid (&stat_data, ¤t_stat_info.stat); + if (!sys_compare_uid (&stat_data, ¤t_stat_info.stat)) + report_difference (¤t_stat_info, _("Uid differs")); + if (!sys_compare_gid (&stat_data, ¤t_stat_info.stat)) + report_difference (¤t_stat_info, _("Gid differs")); if (stat_data.st_mtime != current_stat_info.stat.st_mtime) - report_difference (_("Mod time differs")); + report_difference (¤t_stat_info, _("Mod time differs")); if (current_header->header.typeflag != GNUTYPE_SPARSE && stat_data.st_size != current_stat_info.stat.st_size) { - report_difference (_("Size differs")); + report_difference (¤t_stat_info, _("Size differs")); skip_member (); goto quit; } @@ -270,7 +270,7 @@ diff_archive (void) { open_error (current_stat_info.file_name); skip_member (); - report_difference (NULL); + report_difference (¤t_stat_info, NULL); goto quit; } @@ -280,7 +280,7 @@ diff_archive (void) /* Need to treat sparse files completely differently here. */ if (current_header->header.typeflag == GNUTYPE_SPARSE) - diff_sparse_files (); + sparse_diff_file (diff_handle, ¤t_stat_info); else { if (multi_volume_option) @@ -314,7 +314,10 @@ diff_archive (void) break; if (!get_stat_data (current_stat_info.link_name, &link_data)) break; - sys_compare_links (&stat_data, &link_data); + if (!sys_compare_links (&stat_data, &link_data)) + report_difference (¤t_stat_info, + _("Not linked to %s"), + quote (current_stat_info.link_name)); } break; @@ -332,11 +335,11 @@ diff_archive (void) readlink_warn (current_stat_info.file_name); else readlink_error (current_stat_info.file_name); - report_difference (NULL); + report_difference (¤t_stat_info, NULL); } else if (status != len || strncmp (current_stat_info.link_name, linkbuf, len) != 0) - report_difference (_("Symlink differs")); + report_difference (¤t_stat_info, _("Symlink differs")); break; } @@ -358,7 +361,7 @@ diff_archive (void) : /* current_header->header.typeflag == FIFOTYPE */ !S_ISFIFO (stat_data.st_mode)) { - report_difference (_("File type differs")); + report_difference (¤t_stat_info, _("File type differs")); break; } @@ -366,13 +369,13 @@ diff_archive (void) || current_header->header.typeflag == BLKTYPE) && current_stat_info.stat.st_rdev != stat_data.st_rdev) { - report_difference (_("Device number differs")); + report_difference (¤t_stat_info, _("Device number differs")); break; } if ((current_stat_info.stat.st_mode & MODE_ALL) != (stat_data.st_mode & MODE_ALL)) { - report_difference (_("Mode differs")); + report_difference (¤t_stat_info, _("Mode differs")); break; } @@ -410,13 +413,13 @@ diff_archive (void) if (!S_ISDIR (stat_data.st_mode)) { - report_difference (_("File type differs")); + report_difference (¤t_stat_info, _("File type differs")); break; } if ((current_stat_info.stat.st_mode & MODE_ALL) != (stat_data.st_mode & MODE_ALL)) { - report_difference (_("Mode differs")); + report_difference (¤t_stat_info, _("Mode differs")); break; } @@ -437,7 +440,7 @@ diff_archive (void) if (!S_ISREG (stat_data.st_mode)) { - report_difference (_("File type differs")); + report_difference (¤t_stat_info, _("File type differs")); skip_member (); break; } @@ -445,7 +448,7 @@ diff_archive (void) offset = OFF_FROM_HEADER (current_header->oldgnu_header.offset); if (stat_data.st_size != current_stat_info.stat.st_size + offset) { - report_difference (_("Size differs")); + report_difference (¤t_stat_info, _("Size differs")); skip_member (); break; } @@ -455,7 +458,7 @@ diff_archive (void) if (diff_handle < 0) { open_error (current_stat_info.file_name); - report_difference (NULL); + report_difference (¤t_stat_info, NULL); skip_member (); break; } @@ -463,7 +466,7 @@ diff_archive (void) if (lseek (diff_handle, offset, SEEK_SET) < 0) { seek_error_details (current_stat_info.file_name, offset); - report_difference (NULL); + report_difference (¤t_stat_info, NULL); break; }