diff --git a/src/api2/helpers.rs b/src/api2/helpers.rs index 41391b77..52f80bad 100644 --- a/src/api2/helpers.rs +++ b/src/api2/helpers.rs @@ -48,7 +48,7 @@ pub fn list_dir_content( let mut components = path.clone(); components.push(b'/'); components.extend(&direntry.name); - let mut entry = ArchiveEntry::new(&components, &direntry.attr); + let mut entry = ArchiveEntry::new(&components, Some(&direntry.attr)); if let DirEntryAttribute::File { size, mtime } = direntry.attr { entry.size = size.into(); entry.mtime = mtime.into(); diff --git a/src/api2/types/mod.rs b/src/api2/types/mod.rs index 19186ea2..9d1bd301 100644 --- a/src/api2/types/mod.rs +++ b/src/api2/types/mod.rs @@ -1354,19 +1354,22 @@ pub struct ArchiveEntry { } impl ArchiveEntry { - pub fn new(filepath: &[u8], entry_type: &DirEntryAttribute) -> Self { + pub fn new(filepath: &[u8], entry_type: Option<&DirEntryAttribute>) -> Self { Self { filepath: base64::encode(filepath), text: String::from_utf8_lossy(filepath.split(|x| *x == b'/').last().unwrap()) .to_string(), - entry_type: CatalogEntryType::from(entry_type).to_string(), - leaf: !matches!(entry_type, DirEntryAttribute::Directory { .. }), + entry_type: match entry_type { + Some(entry_type) => CatalogEntryType::from(entry_type).to_string(), + None => "v".to_owned(), + }, + leaf: !matches!(entry_type, None | Some(DirEntryAttribute::Directory { .. })), size: match entry_type { - DirEntryAttribute::File { size, .. } => Some(*size), + Some(DirEntryAttribute::File { size, .. }) => Some(*size), _ => None }, mtime: match entry_type { - DirEntryAttribute::File { mtime, .. } => Some(*mtime), + Some(DirEntryAttribute::File { mtime, .. }) => Some(*mtime), _ => None }, } diff --git a/src/bin/proxmox-file-restore.rs b/src/bin/proxmox-file-restore.rs index 36fdd391..7799a76d 100644 --- a/src/bin/proxmox-file-restore.rs +++ b/src/bin/proxmox-file-restore.rs @@ -174,8 +174,13 @@ async fn list( continue; } let path = format!("/{}", file.filename); - let attr = DirEntryAttribute::Directory { start: 0 }; - entries.push(ArchiveEntry::new(path.as_bytes(), &attr)); + let attr = if file.filename.ends_with(".pxar.didx") { + // a pxar file is a file archive, so it's root is also a directory root + Some(&DirEntryAttribute::Directory { start: 0 }) + } else { + None + }; + entries.push(ArchiveEntry::new(path.as_bytes(), attr)); } Ok(entries) diff --git a/src/bin/proxmox_restore_daemon/api.rs b/src/bin/proxmox_restore_daemon/api.rs index 7ac70278..82ead647 100644 --- a/src/bin/proxmox_restore_daemon/api.rs +++ b/src/bin/proxmox_restore_daemon/api.rs @@ -148,7 +148,7 @@ fn list( match root_entry { DirEntryAttribute::File { .. } => { // list on file, return details - res.push(ArchiveEntry::new(¶m_path, &root_entry)); + res.push(ArchiveEntry::new(¶m_path, Some(&root_entry))); } DirEntryAttribute::Directory { .. } => { // list on directory, return all contained files/dirs @@ -176,7 +176,7 @@ fn list( if let Ok(entry) = entry { res.push(ArchiveEntry::new( full_path.as_os_str().as_bytes(), - &entry, + Some(&entry), )); } } @@ -192,7 +192,7 @@ fn list( t_path.extend(t.as_bytes()); res.push(ArchiveEntry::new( &t_path[..], - &DirEntryAttribute::Directory { start: 0 }, + None, )); } } @@ -203,7 +203,8 @@ fn list( c_path.extend(c.as_bytes()); res.push(ArchiveEntry::new( &c_path[..], - &DirEntryAttribute::Directory { start: 0 }, + // this marks the beginning of a filesystem, i.e. '/', so this is a Directory + Some(&DirEntryAttribute::Directory { start: 0 }), )); } }