summaryrefslogtreecommitdiff
path: root/cli/standalone/binary.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/standalone/binary.rs')
-rw-r--r--cli/standalone/binary.rs62
1 files changed, 34 insertions, 28 deletions
diff --git a/cli/standalone/binary.rs b/cli/standalone/binary.rs
index f9d65fdaa..2b334ec46 100644
--- a/cli/standalone/binary.rs
+++ b/cli/standalone/binary.rs
@@ -3,6 +3,7 @@
use std::collections::BTreeMap;
use std::env::current_exe;
use std::fs;
+use std::future::Future;
use std::io::Read;
use std::io::Seek;
use std::io::SeekFrom;
@@ -236,49 +237,54 @@ pub fn is_standalone_binary(exe_path: &Path) -> bool {
/// binary by skipping over the trailer width at the end of the file,
/// then checking for the magic trailer string `d3n0l4nd`. If found,
/// the bundle is executed. If not, this function exits with `Ok(None)`.
-pub async fn extract_standalone(
+pub fn extract_standalone(
exe_path: &Path,
cli_args: Vec<String>,
-) -> Result<Option<(Metadata, eszip::EszipV2)>, AnyError> {
- let file = std::fs::File::open(exe_path)?;
-
- let mut bufreader =
- deno_core::futures::io::BufReader::new(AllowStdIo::new(file));
-
- let _trailer_pos = bufreader
- .seek(SeekFrom::End(-(TRAILER_SIZE as i64)))
- .await?;
+) -> Result<
+ Option<impl Future<Output = Result<(Metadata, eszip::EszipV2), AnyError>>>,
+ AnyError,
+> {
+ // We do the first part sync so it can complete quickly
+ let mut file = std::fs::File::open(exe_path)?;
+ file.seek(SeekFrom::End(-(TRAILER_SIZE as i64)))?;
let mut trailer = [0; TRAILER_SIZE];
- bufreader.read_exact(&mut trailer).await?;
+ file.read_exact(&mut trailer)?;
let trailer = match Trailer::parse(&trailer)? {
None => return Ok(None),
Some(trailer) => trailer,
};
- bufreader.seek(SeekFrom::Start(trailer.eszip_pos)).await?;
+ file.seek(SeekFrom::Start(trailer.eszip_pos))?;
+
+ // If we have an eszip, read it out
+ Ok(Some(async move {
+ let bufreader =
+ deno_core::futures::io::BufReader::new(AllowStdIo::new(file));
- let (eszip, loader) = eszip::EszipV2::parse(bufreader)
- .await
- .context("Failed to parse eszip header")?;
+ let (eszip, loader) = eszip::EszipV2::parse(bufreader)
+ .await
+ .context("Failed to parse eszip header")?;
- let mut bufreader = loader.await.context("Failed to parse eszip archive")?;
+ let mut bufreader =
+ loader.await.context("Failed to parse eszip archive")?;
- bufreader
- .seek(SeekFrom::Start(trailer.metadata_pos))
- .await?;
+ bufreader
+ .seek(SeekFrom::Start(trailer.metadata_pos))
+ .await?;
- let mut metadata = String::new();
+ let mut metadata = String::new();
- bufreader
- .take(trailer.metadata_len())
- .read_to_string(&mut metadata)
- .await
- .context("Failed to read metadata from the current executable")?;
+ bufreader
+ .take(trailer.metadata_len())
+ .read_to_string(&mut metadata)
+ .await
+ .context("Failed to read metadata from the current executable")?;
- let mut metadata: Metadata = serde_json::from_str(&metadata).unwrap();
- metadata.argv.append(&mut cli_args[1..].to_vec());
+ let mut metadata: Metadata = serde_json::from_str(&metadata).unwrap();
+ metadata.argv.append(&mut cli_args[1..].to_vec());
- Ok(Some((metadata, eszip)))
+ Ok((metadata, eszip))
+ }))
}
const TRAILER_SIZE: usize = std::mem::size_of::<Trailer>() + 8; // 8 bytes for the magic trailer string