match self.state.encode_error {
Some(EncodeError::IncompleteFile) => io_bail!("incomplete file"),
Some(EncodeError::IncompleteDirectory) => io_bail!("directory not finalized"),
- None => Ok(())
+ None => Ok(()),
}
}
target: &Path,
htype: u64,
) -> io::Result<()> {
- self.add_file_entry(metadata, file_name, htype, target.as_os_str().as_bytes())
- .await
+ self.add_file_entry(
+ metadata,
+ file_name,
+ Some((htype, target.as_os_str().as_bytes())),
+ )
+ .await
}
pub async fn add_device(
file_name: &Path,
device: format::Device,
) -> io::Result<()> {
+ if !metadata.is_device() {
+ io_bail!("entry added via add_device must have a device mode in its metadata");
+ }
+
let device = device.to_le();
let device = unsafe {
std::slice::from_raw_parts(
size_of::<format::Device>(),
)
};
- self.add_file_entry(metadata, file_name, format::PXAR_DEVICE, device)
+ self.add_file_entry(metadata, file_name, Some((format::PXAR_DEVICE, device)))
.await
}
+ pub async fn add_fifo(&mut self, metadata: &Metadata, file_name: &Path) -> io::Result<()> {
+ if !metadata.is_fifo() {
+ io_bail!("entry added via add_device must be of type fifo in its metadata");
+ }
+
+ self.add_file_entry(metadata, file_name, None).await
+ }
+
+ pub async fn add_socket(&mut self, metadata: &Metadata, file_name: &Path) -> io::Result<()> {
+ if !metadata.is_socket() {
+ io_bail!("entry added via add_device must be of type socket in its metadata");
+ }
+
+ self.add_file_entry(metadata, file_name, None).await
+ }
+
async fn add_file_entry(
&mut self,
metadata: &Metadata,
file_name: &Path,
- htype: u64,
- entry_data: &[u8],
+ entry_htype_data: Option<(u64, &[u8])>,
) -> io::Result<()> {
self.check()?;
let file_name = file_name.as_os_str().as_bytes();
self.start_file_do(metadata, file_name).await?;
- (&mut self.output as &mut dyn SeqWrite)
- .seq_write_pxar_entry_zero(htype, entry_data)
- .await?;
+ if let Some((htype, entry_data)) = entry_htype_data {
+ (&mut self.output as &mut dyn SeqWrite)
+ .seq_write_pxar_entry_zero(htype, entry_data)
+ .await?;
+ }
let end_offset = (&mut self.output as &mut dyn SeqWrite).position().await?;
.add_device(metadata, file_name.as_ref(), device)
.await
}
+
+ /// Add a device node to the archive.
+ pub async fn add_fifo<P: AsRef<Path>>(
+ &mut self,
+ metadata: &Metadata,
+ file_name: P,
+ ) -> io::Result<()> {
+ self.inner.add_fifo(metadata, file_name.as_ref()).await
+ }
+
+ /// Add a device node to the archive.
+ pub async fn add_socket<P: AsRef<Path>>(
+ &mut self,
+ metadata: &Metadata,
+ file_name: P,
+ ) -> io::Result<()> {
+ self.inner.add_socket(metadata, file_name.as_ref()).await
+ }
}
#[repr(transparent)]
) -> io::Result<()> {
poll_result_once(self.inner.add_device(metadata, file_name.as_ref(), device))
}
+
+ /// Add a fifo node to the archive.
+ pub fn add_fifo<P: AsRef<Path>>(
+ &mut self,
+ metadata: &Metadata,
+ file_name: P,
+ ) -> io::Result<()> {
+ poll_result_once(self.inner.add_fifo(metadata, file_name.as_ref()))
+ }
+
+ /// Add a socket node to the archive.
+ pub fn add_socket<P: AsRef<Path>>(
+ &mut self,
+ metadata: &Metadata,
+ file_name: P,
+ ) -> io::Result<()> {
+ poll_result_once(self.inner.add_socket(metadata, file_name.as_ref()))
+ }
}
#[repr(transparent)]