+ if (multi_volume_option)
+ {
+ assign_string (&save_name, current_stat_info.orig_file_name);
+ save_totsize = current_stat_info.stat.st_size;
+ /* save_sizeleft is set in read_and_process. */
+ }
+
+ if (dumpdir_buffer)
+ {
+ dumpdir_cursor = dumpdir_buffer;
+ read_and_process (current_stat_info.stat.st_size, process_dumpdir);
+ free (dumpdir_buffer);
+ }
+ else
+ read_and_process (current_stat_info.stat.st_size, process_noop);
+
+ if (multi_volume_option)
+ assign_string (&save_name, 0);
+}
+
+static void
+diff_multivol (void)
+{
+ struct stat stat_data;
+ int fd, status;
+ off_t offset;
+
+ if (current_stat_info.had_trailing_slash)
+ {
+ diff_dir ();
+ return;
+ }
+
+ if (!get_stat_data (current_stat_info.file_name, &stat_data))
+ return;
+
+ if (!S_ISREG (stat_data.st_mode))
+ {
+ report_difference (¤t_stat_info, _("File type differs"));
+ skip_member ();
+ return;
+ }
+
+ offset = OFF_FROM_HEADER (current_header->oldgnu_header.offset);
+ if (stat_data.st_size != current_stat_info.stat.st_size + offset)
+ {
+ report_difference (¤t_stat_info, _("Size differs"));
+ skip_member ();
+ return;
+ }
+
+ fd = open (current_stat_info.file_name, O_RDONLY | O_BINARY);
+
+ if (fd < 0)
+ {
+ open_error (current_stat_info.file_name);
+ report_difference (¤t_stat_info, NULL);
+ skip_member ();
+ return;
+ }
+
+ if (lseek (fd, offset, SEEK_SET) < 0)
+ {
+ seek_error_details (current_stat_info.file_name, offset);
+ report_difference (¤t_stat_info, NULL);
+ return;
+ }
+
+ if (multi_volume_option)
+ {
+ assign_string (&save_name, current_stat_info.orig_file_name);
+ save_totsize = stat_data.st_size;
+ /* save_sizeleft is set in read_and_process. */
+ }
+
+ read_and_process (current_stat_info.stat.st_size, process_rawdata);
+
+ if (multi_volume_option)
+ assign_string (&save_name, 0);
+
+ status = close (fd);
+ if (status != 0)
+ close_error (current_stat_info.file_name);