src/catar/decoder.rs: dir_mkdirat - add create_new flag
This commit is contained in:
parent
e9c9409a99
commit
656b23e107
@ -212,6 +212,7 @@ impl <'a, R: Read> CaTarDecoder<'a, R> {
|
|||||||
path: &mut PathBuf, // used for error reporting
|
path: &mut PathBuf, // used for error reporting
|
||||||
filename: &OsStr, // repeats path last component
|
filename: &OsStr, // repeats path last component
|
||||||
parent: &nix::dir::Dir,
|
parent: &nix::dir::Dir,
|
||||||
|
create_new: bool,
|
||||||
callback: &F,
|
callback: &F,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
|
|
||||||
@ -227,7 +228,7 @@ impl <'a, R: Read> CaTarDecoder<'a, R> {
|
|||||||
let ifmt = mode & libc::S_IFMT;
|
let ifmt = mode & libc::S_IFMT;
|
||||||
|
|
||||||
if ifmt == libc::S_IFDIR {
|
if ifmt == libc::S_IFDIR {
|
||||||
let dir = match dir_mkdirat(parent_fd, filename) {
|
let dir = match dir_mkdirat(parent_fd, filename, create_new) {
|
||||||
Ok(dir) => dir,
|
Ok(dir) => dir,
|
||||||
Err(err) => bail!("unable to open directory {:?} - {}", path, err),
|
Err(err) => bail!("unable to open directory {:?} - {}", path, err),
|
||||||
};
|
};
|
||||||
@ -238,7 +239,8 @@ impl <'a, R: Read> CaTarDecoder<'a, R> {
|
|||||||
let name = self.read_filename(head.size)?;
|
let name = self.read_filename(head.size)?;
|
||||||
path.push(&name);
|
path.push(&name);
|
||||||
println!("NAME: {:?}", path);
|
println!("NAME: {:?}", path);
|
||||||
self.restore_sequential(path, &name, &dir, callback)?;
|
|
||||||
|
self.restore_sequential(path, &name, &dir, true, callback)?;
|
||||||
path.pop();
|
path.pop();
|
||||||
|
|
||||||
head = self.read_item()?;
|
head = self.read_item()?;
|
||||||
@ -393,13 +395,23 @@ fn file_openat(parent: RawFd, filename: &OsStr, flags: OFlag, mode: Mode) -> Res
|
|||||||
Ok(file)
|
Ok(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn dir_mkdirat(parent: RawFd, filename: &OsStr) -> Result<nix::dir::Dir, Error> {
|
fn dir_mkdirat(parent: RawFd, filename: &OsStr, create_new: bool) -> Result<nix::dir::Dir, nix::Error> {
|
||||||
|
|
||||||
// call mkdirat first
|
// call mkdirat first
|
||||||
let res = filename.with_nix_path(|cstr| unsafe {
|
let res = filename.with_nix_path(|cstr| unsafe {
|
||||||
libc::mkdirat(parent, cstr.as_ptr(), libc::S_IRWXU)
|
libc::mkdirat(parent, cstr.as_ptr(), libc::S_IRWXU)
|
||||||
})?;
|
})?;
|
||||||
Errno::result(res)?;
|
|
||||||
|
match Errno::result(res) {
|
||||||
|
Ok(_) => {},
|
||||||
|
Err(err) => {
|
||||||
|
if err == nix::Error::Sys(nix::errno::Errno::EEXIST) {
|
||||||
|
if create_new { return Err(err); }
|
||||||
|
} else {
|
||||||
|
return Err(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let dir = nix::dir::Dir::openat(parent, filename, OFlag::O_DIRECTORY, Mode::empty())?;
|
let dir = nix::dir::Dir::openat(parent, filename, OFlag::O_DIRECTORY, Mode::empty())?;
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ impl CaTarBackupWriter {
|
|||||||
let mut decoder = CaTarDecoder::new(&mut reader);
|
let mut decoder = CaTarDecoder::new(&mut reader);
|
||||||
|
|
||||||
|
|
||||||
if let Err(err) = decoder.restore_sequential(&mut path, &subdir, &dir, & |path| {
|
if let Err(err) = decoder.restore_sequential(&mut path, &subdir, &dir, false, & |path| {
|
||||||
println!("RESTORE: {:?}", path);
|
println!("RESTORE: {:?}", path);
|
||||||
Ok(())
|
Ok(())
|
||||||
}) {
|
}) {
|
||||||
|
Loading…
Reference in New Issue
Block a user