+
+ /* In multi-volume mode. */
+ /* ENXIO is for the UNIX PC. */
+ if (status < 0 && errno != ENOSPC && errno != EIO && errno != ENXIO)
+ archive_write_error (status);
+
+ if (!new_volume (ACCESS_WRITE))
+ return;
+
+ xheader_destroy (&extended_header);
+
+ increase_volume_number ();
+ prev_written += bytes_written;
+ bytes_written = 0;
+
+ copy_ptr = record_start->buffer + status;
+ copy_size = buffer_level - status;
+ /* Switch to the next buffer */
+ record_index = !record_index;
+ init_buffer ();
+
+ if (volume_label_option)
+ add_volume_label ();
+
+ if (real_s_name)
+ add_multi_volume_header ();
+
+ write_extended (true, NULL, find_next_block ());
+ if (real_s_name)
+ add_chunk_header ();
+ header = find_next_block ();
+ bufsize = available_space_after (header);
+ while (bufsize < copy_size)
+ {
+ memcpy (header->buffer, copy_ptr, bufsize);
+ copy_ptr += bufsize;
+ copy_size -= bufsize;
+ set_next_block_after (header + (bufsize - 1) / BLOCKSIZE);
+ header = find_next_block ();
+ bufsize = available_space_after (header);
+ }
+ memcpy (header->buffer, copy_ptr, copy_size);
+ memset (header->buffer + copy_size, 0, bufsize - copy_size);
+ set_next_block_after (header + (copy_size - 1) / BLOCKSIZE);
+ find_next_block ();