catar: encode/decode sockets and fifos
This commit is contained in:
		@ -243,6 +243,28 @@ impl <'a, R: Read + Seek> CaTarDecoder<'a, R> {
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn restore_socket_at(&mut self, dirfd: RawFd, filename: &OsStr) -> Result<(), Error> {
 | 
			
		||||
 | 
			
		||||
        let mode = libc::S_IFSOCK | 0o0600;
 | 
			
		||||
        let res =  filename.with_nix_path(|cstr| unsafe {
 | 
			
		||||
            libc::mknodat(dirfd, cstr.as_ptr(), mode, 0)
 | 
			
		||||
        })?;
 | 
			
		||||
        Errno::result(res)?;
 | 
			
		||||
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn restore_fifo_at(&mut self, dirfd: RawFd, filename: &OsStr) -> Result<(), Error> {
 | 
			
		||||
 | 
			
		||||
        let mode = libc::S_IFIFO | 0o0600;
 | 
			
		||||
        let res =  filename.with_nix_path(|cstr| unsafe {
 | 
			
		||||
            libc::mkfifoat(dirfd, cstr.as_ptr(), mode)
 | 
			
		||||
        })?;
 | 
			
		||||
        Errno::result(res)?;
 | 
			
		||||
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn restore_sequential<F: Fn(&Path) -> Result<(), Error>>(
 | 
			
		||||
        &mut self,
 | 
			
		||||
        path: &mut PathBuf, // user for error reporting
 | 
			
		||||
@ -315,7 +337,29 @@ impl <'a, R: Read + Seek> CaTarDecoder<'a, R> {
 | 
			
		||||
 | 
			
		||||
            // self.restore_mode_at(&entry, parent_fd, filename)?; //not supported on symlinks
 | 
			
		||||
            self.restore_ugid_at(&entry, parent_fd, filename)?;
 | 
			
		||||
            self.restore_mtime_at(&entry,  parent_fd, filename)?;
 | 
			
		||||
            self.restore_mtime_at(&entry, parent_fd, filename)?;
 | 
			
		||||
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ifmt == libc::S_IFSOCK  {
 | 
			
		||||
 | 
			
		||||
            self.restore_socket_at(parent_fd, filename)?;
 | 
			
		||||
 | 
			
		||||
            self.restore_mode_at(&entry, parent_fd, filename)?;
 | 
			
		||||
            self.restore_ugid_at(&entry, parent_fd, filename)?;
 | 
			
		||||
            self.restore_mtime_at(&entry, parent_fd, filename)?;
 | 
			
		||||
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ifmt == libc::S_IFIFO  {
 | 
			
		||||
 | 
			
		||||
            self.restore_fifo_at(parent_fd, filename)?;
 | 
			
		||||
 | 
			
		||||
            self.restore_mode_at(&entry, parent_fd, filename)?;
 | 
			
		||||
            self.restore_ugid_at(&entry, parent_fd, filename)?;
 | 
			
		||||
            self.restore_mtime_at(&entry, parent_fd, filename)?;
 | 
			
		||||
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
@ -335,7 +379,7 @@ impl <'a, R: Read + Seek> CaTarDecoder<'a, R> {
 | 
			
		||||
 | 
			
		||||
            self.restore_mode_at(&entry, parent_fd, filename)?;
 | 
			
		||||
            self.restore_ugid_at(&entry, parent_fd, filename)?;
 | 
			
		||||
            self.restore_mtime_at(&entry,  parent_fd, filename)?;
 | 
			
		||||
            self.restore_mtime_at(&entry, parent_fd, filename)?;
 | 
			
		||||
 | 
			
		||||
            return Ok(());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -317,6 +317,8 @@ impl <'a, W: Write> CaTarEncoder<'a, W> {
 | 
			
		||||
                }
 | 
			
		||||
            } else if (ifmt == libc::S_IFBLK) || (ifmt == libc::S_IFCHR) {
 | 
			
		||||
                self.encode_device(&stat)?;
 | 
			
		||||
            } else if (ifmt == libc::S_IFIFO) || (ifmt == libc::S_IFSOCK) {
 | 
			
		||||
                // nothing do do - entry already contains all information
 | 
			
		||||
            } else {
 | 
			
		||||
                bail!("unsupported file type (mode {:o} {:?})", stat.st_mode, self.current_path);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user