+ diff_handle = open (current_stat_info.file_name, O_RDONLY | O_BINARY);
+
+ if (diff_handle < 0)
+ {
+ open_error (current_stat_info.file_name);
+ skip_member ();
+ report_difference (¤t_stat_info, NULL);
+ }
+ else
+ {
+ int status;
+
+ if (current_stat_info.is_sparse)
+ sparse_diff_file (diff_handle, ¤t_stat_info);
+ else
+ {
+ 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. */
+ }
+
+ read_and_process (current_stat_info.stat.st_size,
+ process_rawdata);
+
+ if (multi_volume_option)
+ assign_string (&save_name, 0);
+ }
+
+ status = close (diff_handle);
+ if (status != 0)
+ close_error (current_stat_info.file_name);
+
+ if (atime_preserve_option)
+ {
+ struct timespec ts[2];
+ ts[0] = get_stat_atime (&stat_data);
+ ts[1] = get_stat_mtime (&stat_data);
+ if (utimens (current_stat_info.file_name, ts) != 0)
+ utime_error (current_stat_info.file_name);
+ }
+ }