12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // Copyright 2019-2024 Tauri Programme within The Commons Conservancy
- // SPDX-License-Identifier: Apache-2.0
- // SPDX-License-Identifier: MIT
- //! Types and functions related to child processes management.
- use crate::Env;
- use std::path::PathBuf;
- /// Finds the current running binary's path.
- ///
- /// With exception to any following platform-specific behavior, the path is cached as soon as
- /// possible, and then used repeatedly instead of querying for a new path every time this function
- /// is called.
- ///
- /// # Platform-specific behavior
- ///
- /// ## Linux
- ///
- /// On Linux, this function will **attempt** to detect if it's currently running from a
- /// valid [AppImage] and use that path instead.
- ///
- /// ## macOS
- ///
- /// On `macOS`, this function will return an error if the original path contained any symlinks
- /// due to less protection on macOS regarding symlinks. This behavior can be disabled by setting the
- /// `process-relaunch-dangerous-allow-symlink-macos` feature, although it is *highly discouraged*.
- ///
- /// # Security
- ///
- /// See [`tauri_utils::platform::current_exe`] for possible security implications.
- ///
- /// # Examples
- ///
- /// ```rust,no_run
- /// use tauri::{process::current_binary, Env, Manager};
- /// let current_binary_path = current_binary(&Env::default()).unwrap();
- ///
- /// tauri::Builder::default()
- /// .setup(|app| {
- /// let current_binary_path = current_binary(&app.env())?;
- /// Ok(())
- /// });
- /// ```
- ///
- /// [AppImage]: https://appimage.org/
- pub fn current_binary(_env: &Env) -> std::io::Result<PathBuf> {
- // if we are running from an AppImage, we ONLY want the set AppImage path
- #[cfg(target_os = "linux")]
- if let Some(app_image_path) = &_env.appimage {
- return Ok(PathBuf::from(app_image_path));
- }
- tauri_utils::platform::current_exe()
- }
- /// Restarts the currently running binary.
- ///
- /// See [`current_binary`] for platform specific behavior, and
- /// [`tauri_utils::platform::current_exe`] for possible security implications.
- ///
- /// # Examples
- ///
- /// ```rust,no_run
- /// use tauri::{process::restart, Env, Manager};
- ///
- /// tauri::Builder::default()
- /// .setup(|app| {
- /// restart(&app.env());
- /// Ok(())
- /// });
- /// ```
- pub fn restart(env: &Env) {
- use std::process::{exit, Command};
- if let Ok(path) = current_binary(env) {
- Command::new(path)
- .args(&env.args_os)
- .spawn()
- .expect("application failed to start");
- }
- exit(0);
- }
|