| 
									
										
										
										
											2022-09-21 11:28:28 +08:00
										 |  |  | #![windows_subsystem = "windows"]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use std::{
 | 
					
						
							|  |  |  |     path::PathBuf,
 | 
					
						
							|  |  |  |     process::{Command, Stdio},
 | 
					
						
							|  |  |  | };
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use bin_reader::BinaryReader;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | pub mod bin_reader;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const APP_PREFIX: &str = "rustdesk";
 | 
					
						
							|  |  |  | const APPNAME_RUNTIME_ENV_KEY: &str = "RUSTDESK_APPNAME";
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 14:52:46 +08:00
										 |  |  | fn setup(reader: BinaryReader, dir: Option<PathBuf>, clear: bool) -> Option<PathBuf> {
 | 
					
						
							|  |  |  |     let dir = if let Some(dir) = dir {
 | 
					
						
							|  |  |  |         dir
 | 
					
						
							| 
									
										
										
										
											2022-09-21 11:28:28 +08:00
										 |  |  |     } else {
 | 
					
						
							| 
									
										
										
										
											2022-10-11 14:52:46 +08:00
										 |  |  |         // home dir
 | 
					
						
							|  |  |  |         if let Some(dir) = dirs::data_local_dir() {
 | 
					
						
							|  |  |  |             dir.join(APP_PREFIX)
 | 
					
						
							|  |  |  |         } else {
 | 
					
						
							|  |  |  |             eprintln!("not found data local dir");
 | 
					
						
							|  |  |  |             return None;
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  |     if clear {
 | 
					
						
							|  |  |  |         std::fs::remove_dir_all(&dir).ok();
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     for file in reader.files.iter() {
 | 
					
						
							|  |  |  |         file.write_to_file(&dir);
 | 
					
						
							| 
									
										
										
										
											2022-09-21 11:28:28 +08:00
										 |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2022-12-26 11:25:55 +08:00
										 |  |  |     #[cfg(linux)]
 | 
					
						
							| 
									
										
										
										
											2022-10-11 14:52:46 +08:00
										 |  |  |     reader.configure_permission(&dir);
 | 
					
						
							|  |  |  |     Some(dir.join(&reader.exe))
 | 
					
						
							| 
									
										
										
										
											2022-09-21 11:28:28 +08:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 14:52:46 +08:00
										 |  |  | fn execute(path: PathBuf, args: Vec<String>) {
 | 
					
						
							| 
									
										
										
										
											2022-09-21 11:28:28 +08:00
										 |  |  |     println!("executing {}", path.display());
 | 
					
						
							|  |  |  |     // setup env
 | 
					
						
							|  |  |  |     let exe = std::env::current_exe().unwrap();
 | 
					
						
							|  |  |  |     let exe_name = exe.file_name().unwrap();
 | 
					
						
							|  |  |  |     // run executable
 | 
					
						
							|  |  |  |     Command::new(path)
 | 
					
						
							| 
									
										
										
										
											2022-10-11 14:52:46 +08:00
										 |  |  |         .args(args)
 | 
					
						
							| 
									
										
										
										
											2022-09-21 11:28:28 +08:00
										 |  |  |         .env(APPNAME_RUNTIME_ENV_KEY, exe_name)
 | 
					
						
							|  |  |  |         .stdin(Stdio::inherit())
 | 
					
						
							|  |  |  |         .stdout(Stdio::inherit())
 | 
					
						
							|  |  |  |         .stderr(Stdio::inherit())
 | 
					
						
							|  |  |  |         .output()
 | 
					
						
							|  |  |  |         .expect(&format!("failed to execute {:?}", exe_name));
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | fn main() {
 | 
					
						
							| 
									
										
										
										
											2022-11-10 14:38:25 +08:00
										 |  |  |     let mut args = Vec::new();
 | 
					
						
							|  |  |  |     let mut arg_exe = Default::default();
 | 
					
						
							|  |  |  |     let mut i = 0;
 | 
					
						
							|  |  |  |     for arg in std::env::args() {
 | 
					
						
							|  |  |  |         if i == 0 {
 | 
					
						
							|  |  |  |             arg_exe = arg.clone();
 | 
					
						
							| 
									
										
										
										
											2022-10-11 14:52:46 +08:00
										 |  |  |         } else {
 | 
					
						
							| 
									
										
										
										
											2022-11-10 14:38:25 +08:00
										 |  |  |             args.push(arg);
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         i += 1;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     let click_setup = args.is_empty() && arg_exe.to_lowercase().ends_with("install.exe");
 | 
					
						
							| 
									
										
										
										
											2022-11-19 10:57:17 +08:00
										 |  |  |     let quick_support = args.is_empty() && arg_exe.to_lowercase().ends_with("qs.exe");
 | 
					
						
							| 
									
										
										
										
											2022-11-10 14:38:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     let reader = BinaryReader::default();
 | 
					
						
							|  |  |  |     if let Some(exe) = setup(
 | 
					
						
							|  |  |  |         reader,
 | 
					
						
							|  |  |  |         None,
 | 
					
						
							|  |  |  |         click_setup || args.contains(&"--silent-install".to_owned()),
 | 
					
						
							|  |  |  |     ) {
 | 
					
						
							|  |  |  |         if click_setup {
 | 
					
						
							| 
									
										
										
										
											2022-11-19 10:57:17 +08:00
										 |  |  |             args = vec!["--install".to_owned()];
 | 
					
						
							|  |  |  |         } else if quick_support {
 | 
					
						
							|  |  |  |             args = vec!["--quick_support".to_owned()];
 | 
					
						
							| 
									
										
										
										
											2022-11-10 14:38:25 +08:00
										 |  |  |         }
 | 
					
						
							| 
									
										
										
										
											2022-10-11 14:52:46 +08:00
										 |  |  |         execute(exe, args);
 | 
					
						
							| 
									
										
										
										
											2022-09-21 11:28:28 +08:00
										 |  |  |     }
 | 
					
						
							|  |  |  | }
 |