@@ -5,23 +5,19 @@ use std::io::{self, Write};
55use std:: os:: unix:: fs:: PermissionsExt ;
66use std:: path:: { Path , PathBuf } ;
77use std:: process:: Command ;
8- use xz2:: write:: XzEncoder ;
98use zstd:: stream:: write:: Encoder ;
109
1110const MAGIC_MARKER : [ u8 ; 10 ] = * b"REX_BUNDLE" ;
1211
1312#[ repr( C , packed) ]
1413struct BundleMetadata {
1514 payload_size : u64 ,
16- compression_type : u32 ,
1715 target_bin_name_len : u32 ,
1816}
1917
2018#[ derive( Debug ) ]
2119pub struct BundleArgs {
2220 pub target_binary : PathBuf ,
23- pub output : PathBuf ,
24- pub compression : String ,
2521 pub compression_level : i32 ,
2622 pub extra_libs : Vec < PathBuf > ,
2723 pub additional_files : Vec < String > ,
@@ -31,12 +27,8 @@ pub struct BundleArgs {
3127fn find_system_loader ( ) -> Option < PathBuf > {
3228 let possible_paths = [
3329 "/lib64/ld-linux-x86-64.so.2" ,
34- "/usr/lib64/ld-linux-x86-64.so.2" ,
35- "/lib/ld-linux-x86-64.so.2" ,
36- "/usr/lib/ld-linux-x86-64.so.2" ,
37- "/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2" ,
38- "/lib/ld-musl-x86_64.so.1" ,
39- "/usr/lib/ld-musl-x86_64.so.1"
30+ "/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2" ,
31+ "/lib/ld-musl-x86_64.so.1"
4032 ] ;
4133
4234 for path in possible_paths. iter ( ) {
@@ -55,35 +47,25 @@ fn create_temp_dir(base_name: &str) -> Result<PathBuf, Box<dyn Error>> {
5547 Ok ( path)
5648}
5749
58- fn create_compressed_payload ( path : & Path , target : & str , cmp : & str , l : i32 ) -> Result < PathBuf , Box < dyn Error > > {
59- println ! ( "\n [Packaging] Starting TAR archiving and {} compression (level {})..." , cmp, l) ;
60-
50+ fn create_compressed_payload ( path : & Path , target : & str , l : i32 ) -> Result < PathBuf , Box < dyn Error > > {
6151 let tmp_dir = std:: env:: temp_dir ( ) . join ( format ! ( "{}_bundle_tmp" , target) ) ;
6252 if tmp_dir. exists ( ) {
6353 fs:: remove_dir_all ( & tmp_dir) ?;
6454 }
6555 fs:: create_dir_all ( & tmp_dir) ?;
6656
67- let payload = tmp_dir. join ( format ! ( "{}.tar.{}" , target , cmp ) ) ;
57+ let payload = tmp_dir. join ( format ! ( "{target }.tar.zstd" ) ) ;
6858 let file_writer = File :: create ( & payload) ?;
6959
70- let encoder: Box < dyn Write > = match cmp {
71- "zstd" => {
72- let mut enc = Encoder :: new ( file_writer, l) ?;
73- enc. long_distance_matching ( true ) ?;
74- Box :: new ( enc. auto_finish ( ) )
75- }
76- "xz" => {
77- let enc = XzEncoder :: new ( file_writer, l as u32 ) ;
78- Box :: new ( enc)
79- }
80- other => return Err ( format ! ( "Unknown compression format: {}" , other) . into ( ) ) ,
81- } ;
60+ println ! ( "\n [Packaging] Starting TAR archiving and ZSTD compression (level {l}) to:\n {}" , payload. display( ) ) ;
61+
62+ let mut enc = Encoder :: new ( file_writer, l) ?;
63+ enc. long_distance_matching ( true ) ?;
64+ let encoder: Box < dyn Write > =Box :: new ( enc. auto_finish ( ) ) ;
8265
8366 let bundle_dir_name = format ! ( "{}_bundle" , target) ;
8467 let mut builder = tar:: Builder :: new ( encoder) ;
8568 builder. append_dir_all ( & bundle_dir_name, path) ?;
86- fs:: remove_dir_all ( & tmp_dir) ?;
8769
8870 Ok ( payload)
8971}
@@ -222,35 +204,27 @@ pub fn generate_bundle(args: BundleArgs) -> Result<(), Box<dyn Error>> {
222204 fs_extra:: copy_items ( & entry_refs, root_path, & options) ?;
223205 }
224206
225- let compressed_payload_path = create_compressed_payload ( root_path, & target_name, & args . compression , args. compression_level ) ?;
207+ let compressed_payload_path = create_compressed_payload ( root_path, & target_name, args. compression_level ) ?;
226208 let payload_size = compressed_payload_path. metadata ( ) ?. len ( ) ;
209+ let out = format ! ( "{}.Rex" , args. target_binary. file_name( ) . unwrap( ) . display( ) ) ;
227210
228- println ! ( "\n [Output] Creating final bundle file: {}" , args . output . display ( ) ) ;
211+ println ! ( "\n [Output] Creating final bundle file: {}" , out ) ;
229212
230213 let exec = std:: env:: current_exe ( ) ?;
231- fs:: copy ( & exec, & args . output ) ?;
214+ fs:: copy ( & exec, & out ) ?;
232215
233- #[ cfg( unix) ]
234- {
235- use std:: fs:: Permissions ;
236- let perms = Permissions :: from_mode ( 0o755 ) ;
237- fs:: set_permissions ( & args. output , perms) ?;
238- }
216+ use std:: fs:: Permissions ;
217+
218+ let perms = Permissions :: from_mode ( 0o755 ) ;
219+ fs:: set_permissions ( & out, perms) ?;
239220
240- let mut final_file = fs:: OpenOptions :: new ( ) . append ( true ) . open ( & args . output ) ?;
221+ let mut final_file = fs:: OpenOptions :: new ( ) . append ( true ) . open ( & out ) ?;
241222 let mut payload_file = File :: open ( & compressed_payload_path) ?;
242223
243224 io:: copy ( & mut payload_file, & mut final_file) ?;
244225
245- let compression_id = match args. compression . to_lowercase ( ) . as_str ( ) {
246- "zstd" => 0 ,
247- "xz" => 1 ,
248- _ => 99 ,
249- } ;
250-
251226 let metadata = BundleMetadata {
252227 payload_size,
253- compression_type : compression_id,
254228 target_bin_name_len : target_name. len ( ) as u32 ,
255229 } ;
256230
@@ -269,6 +243,6 @@ pub fn generate_bundle(args: BundleArgs) -> Result<(), Box<dyn Error>> {
269243 println ! ( "\n [Generator Success]" ) ;
270244 println ! ( " Payload Size: {} bytes" , payload_size) ;
271245 println ! ( " Metadata Size: {} bytes" , size_of:: <BundleMetadata >( ) + target_name. len( ) + MAGIC_MARKER . len( ) ) ;
272- println ! ( " Compressed Bundle created at: {}" , args . output . display ( ) ) ;
246+ println ! ( " Compressed Bundle created at: {}" , out ) ;
273247 Ok ( ( ) )
274248}
0 commit comments