2019-06-06 15:59:15 +00:00
|
|
|
use super::*;
|
2020-06-09 10:47:34 +00:00
|
|
|
use crate::{preproc::rga_preproc, print_bytes};
|
2019-06-06 15:59:15 +00:00
|
|
|
use ::tar::EntryType::Regular;
|
2020-06-06 10:57:43 +00:00
|
|
|
use anyhow::*;
|
2019-06-06 15:59:15 +00:00
|
|
|
use lazy_static::lazy_static;
|
2019-06-18 10:14:09 +00:00
|
|
|
use log::*;
|
2019-06-06 15:59:15 +00:00
|
|
|
use std::path::PathBuf;
|
|
|
|
|
2019-06-16 09:07:29 +00:00
|
|
|
static EXTENSIONS: &[&str] = &["tar"];
|
2019-06-06 15:59:15 +00:00
|
|
|
|
|
|
|
lazy_static! {
|
|
|
|
static ref METADATA: AdapterMeta = AdapterMeta {
|
|
|
|
name: "tar".to_owned(),
|
|
|
|
version: 1,
|
2019-06-07 22:04:48 +00:00
|
|
|
description: "Reads a tar file as a stream and recurses down into its contents".to_owned(),
|
2019-06-16 10:19:01 +00:00
|
|
|
recurses: true,
|
2019-06-11 11:34:04 +00:00
|
|
|
fast_matchers: EXTENSIONS
|
2019-06-06 15:59:15 +00:00
|
|
|
.iter()
|
2019-06-11 11:34:04 +00:00
|
|
|
.map(|s| FastMatcher::FileExtension(s.to_string()))
|
2019-06-06 15:59:15 +00:00
|
|
|
.collect(),
|
2019-06-11 11:34:04 +00:00
|
|
|
slow_matchers: None
|
2019-06-06 15:59:15 +00:00
|
|
|
};
|
|
|
|
}
|
2019-06-06 21:43:30 +00:00
|
|
|
#[derive(Default)]
|
2019-06-06 15:59:15 +00:00
|
|
|
pub struct TarAdapter;
|
|
|
|
|
|
|
|
impl TarAdapter {
|
|
|
|
pub fn new() -> TarAdapter {
|
|
|
|
TarAdapter
|
|
|
|
}
|
|
|
|
}
|
|
|
|
impl GetMetadata for TarAdapter {
|
2019-06-06 21:43:30 +00:00
|
|
|
fn metadata(&self) -> &AdapterMeta {
|
2019-06-06 15:59:15 +00:00
|
|
|
&METADATA
|
|
|
|
}
|
|
|
|
}
|
2019-06-06 21:19:59 +00:00
|
|
|
|
2019-06-06 15:59:15 +00:00
|
|
|
impl FileAdapter for TarAdapter {
|
2020-06-06 10:57:43 +00:00
|
|
|
fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Result<()> {
|
2019-06-06 15:59:15 +00:00
|
|
|
let AdaptInfo {
|
|
|
|
filepath_hint,
|
|
|
|
mut inp,
|
|
|
|
oup,
|
|
|
|
line_prefix,
|
2019-06-07 13:43:19 +00:00
|
|
|
archive_recursion_depth,
|
2019-06-07 17:00:24 +00:00
|
|
|
config,
|
2019-06-06 15:59:15 +00:00
|
|
|
..
|
|
|
|
} = ai;
|
2019-06-16 09:07:29 +00:00
|
|
|
let mut archive = ::tar::Archive::new(&mut inp);
|
2019-06-06 15:59:15 +00:00
|
|
|
for entry in archive.entries()? {
|
2019-06-16 20:48:28 +00:00
|
|
|
let mut file = entry?;
|
2019-06-06 15:59:15 +00:00
|
|
|
if Regular == file.header().entry_type() {
|
2019-06-11 18:35:20 +00:00
|
|
|
let path = PathBuf::from(file.path()?.to_owned());
|
2019-06-18 10:14:09 +00:00
|
|
|
debug!(
|
2020-06-09 10:47:34 +00:00
|
|
|
"{}|{}: {}",
|
2019-06-11 18:35:20 +00:00
|
|
|
filepath_hint.display(),
|
|
|
|
path.display(),
|
2020-06-09 10:47:34 +00:00
|
|
|
print_bytes(file.header().size()? as f64),
|
2019-06-11 18:35:20 +00:00
|
|
|
);
|
2019-06-06 15:59:15 +00:00
|
|
|
let line_prefix = &format!("{}{}: ", line_prefix, path.display());
|
2019-06-06 21:19:59 +00:00
|
|
|
let ai2: AdaptInfo = AdaptInfo {
|
|
|
|
filepath_hint: &path,
|
2019-06-06 21:43:30 +00:00
|
|
|
is_real_file: false,
|
2019-06-07 13:43:19 +00:00
|
|
|
archive_recursion_depth: archive_recursion_depth + 1,
|
2019-06-06 21:19:59 +00:00
|
|
|
inp: &mut file,
|
2019-06-06 21:43:30 +00:00
|
|
|
oup,
|
2019-06-06 21:19:59 +00:00
|
|
|
line_prefix,
|
2019-06-07 18:12:24 +00:00
|
|
|
config: config.clone(),
|
2019-06-06 21:19:59 +00:00
|
|
|
};
|
2019-06-07 17:00:24 +00:00
|
|
|
rga_preproc(ai2)?;
|
2019-06-06 15:59:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|