soar_package/formats/
mod.rs1pub mod appimage;
7pub mod common;
8pub mod wrappe;
9
10use std::io::{BufReader, Read, Seek, SeekFrom};
11
12use crate::error::{PackageError, Result};
13
14pub const ELF_MAGIC_BYTES: [u8; 4] = [0x7f, 0x45, 0x4c, 0x46];
16
17pub const APPIMAGE_MAGIC_BYTES: [u8; 4] = [0x41, 0x49, 0x02, 0x00];
19
20pub const FLATIMAGE_MAGIC_BYTES: [u8; 4] = [0x46, 0x49, 0x01, 0x00];
22
23pub const RUNIMAGE_MAGIC_BYTES: [u8; 4] = [0x52, 0x49, 0x02, 0x00];
25
26pub const WRAPPE_MAGIC_BYTES: [u8; 8] = [0x50, 0x45, 0x33, 0x44, 0x41, 0x54, 0x41, 0x00];
28
29pub const PNG_MAGIC_BYTES: [u8; 8] = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
31
32pub const SVG_MAGIC_BYTES: [u8; 4] = [0x3c, 0x73, 0x76, 0x67];
34
35#[derive(Debug, Clone, Copy, PartialEq, Eq)]
37pub enum PackageFormat {
38 AppImage,
40 FlatImage,
42 RunImage,
44 Wrappe,
46 ELF,
48 Unknown,
50}
51
52pub fn get_file_type<T>(file: &mut BufReader<T>) -> Result<PackageFormat>
67where
68 T: Read + Seek,
69{
70 let mut magic_bytes = [0u8; 12];
71 file.read_exact(&mut magic_bytes)
72 .map_err(|_| PackageError::MagicBytesError)?;
73
74 if magic_bytes[8..] == APPIMAGE_MAGIC_BYTES {
75 return Ok(PackageFormat::AppImage);
76 }
77 if magic_bytes[8..] == FLATIMAGE_MAGIC_BYTES {
78 return Ok(PackageFormat::FlatImage);
79 }
80 if magic_bytes[8..] == RUNIMAGE_MAGIC_BYTES {
81 return Ok(PackageFormat::RunImage);
82 }
83
84 let file_size = file
86 .seek(SeekFrom::End(0))
87 .map_err(|_| PackageError::SeekError)?;
88
89 if file_size >= 801 {
91 let start = file_size - 801;
92 file.seek(SeekFrom::Start(start))
93 .map_err(|_| PackageError::SeekError)?;
94
95 let mut wrappe_magic = [0u8; 8];
96 file.read_exact(&mut wrappe_magic)
97 .map_err(|_| PackageError::MagicBytesError)?;
98
99 if wrappe_magic == WRAPPE_MAGIC_BYTES {
100 file.rewind().map_err(|_| PackageError::SeekError)?;
101 return Ok(PackageFormat::Wrappe);
102 }
103 }
104
105 file.rewind().map_err(|_| PackageError::SeekError)?;
106
107 if magic_bytes[..4] == ELF_MAGIC_BYTES {
108 return Ok(PackageFormat::ELF);
109 }
110
111 Ok(PackageFormat::Unknown)
112}