diff --git a/userspace/ksud/Cargo.toml b/userspace/ksud/Cargo.toml index 330ac303..741d46b3 100644 --- a/userspace/ksud/Cargo.toml +++ b/userspace/ksud/Cargo.toml @@ -32,7 +32,7 @@ rust-embed = { version = "6.4.2", features = [ "compression", # must clean build after updating binaries ] } -[target.'cfg(linux)'.dependencies] +[target.'cfg(any(target_os = "android", target_os = "linux"))'.dependencies] sys-mount = "2.0.1" # some android specific dependencies which compiles under unix are also listed here for convenience of coding android-properties = { version = "0.2.2", features = ["bionic-deprecated"] } diff --git a/userspace/ksud/src/ksu.rs b/userspace/ksud/src/ksu.rs index 5e708f91..bb2deab0 100644 --- a/userspace/ksud/src/ksu.rs +++ b/userspace/ksud/src/ksu.rs @@ -20,7 +20,7 @@ pub const CMD_SET_SEPOLICY: u64 = 8; const EVENT_POST_FS_DATA: u64 = 1; const EVENT_BOOT_COMPLETED: u64 = 2; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] pub fn grant_root() -> Result<()> { let mut result: u32 = 0; unsafe { @@ -38,14 +38,14 @@ pub fn grant_root() -> Result<()> { Err(std::process::Command::new("sh").exec().into()) } -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] pub fn grant_root() -> Result<()> { unimplemented!("grant_root is only available on android"); } pub fn get_version() -> i32 { let mut result: i32 = 0; - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] unsafe { #[allow(clippy::cast_possible_wrap)] libc::prctl( @@ -58,7 +58,7 @@ pub fn get_version() -> i32 { } fn report_event(event: u64) { - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] unsafe { #[allow(clippy::cast_possible_wrap)] libc::prctl( diff --git a/userspace/ksud/src/mount.rs b/userspace/ksud/src/mount.rs index af6336fc..b7c62f7f 100644 --- a/userspace/ksud/src/mount.rs +++ b/userspace/ksud/src/mount.rs @@ -1,21 +1,21 @@ use anyhow::Result; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use anyhow::{Context, Ok}; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use retry::delay::NoDelay; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use sys_mount::{unmount, FilesystemType, Mount, MountFlags, Unmount, UnmountFlags}; pub struct AutoMountExt4 { mnt: String, - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] mount: Option, auto_umount: bool, } impl AutoMountExt4 { - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] pub fn try_new(src: &str, mnt: &str, auto_umount: bool) -> Result { let result = Mount::builder() .fstype(FilesystemType::from("ext4")) @@ -52,12 +52,12 @@ impl AutoMountExt4 { } } - #[cfg(not(target_os = "linux"))] + #[cfg(not(any(target_os = "linux", target_os = "android")))] pub fn try_new(_src: &str, _mnt: &str, _auto_umount: bool) -> Result { unimplemented!() } - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] pub fn umount(&self) -> Result<()> { if let Some(ref mount) = self.mount { mount @@ -74,7 +74,7 @@ impl AutoMountExt4 { } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] impl Drop for AutoMountExt4 { fn drop(&mut self) { log::info!( @@ -89,7 +89,7 @@ impl Drop for AutoMountExt4 { } #[allow(dead_code)] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn mount_image(src: &str, target: &str, autodrop: bool) -> Result<()> { if autodrop { Mount::builder() @@ -106,7 +106,7 @@ fn mount_image(src: &str, target: &str, autodrop: bool) -> Result<()> { } #[allow(dead_code)] -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] pub fn mount_ext4(src: &str, target: &str, autodrop: bool) -> Result<()> { // umount target first. let _ = umount_dir(target); @@ -116,13 +116,13 @@ pub fn mount_ext4(src: &str, target: &str, autodrop: bool) -> Result<()> { .map(|_| ()) } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] pub fn umount_dir(src: &str) -> Result<()> { unmount(src, UnmountFlags::empty()).with_context(|| format!("Failed to umount {src}"))?; Ok(()) } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] pub fn mount_overlay(lowerdir: &str, mnt: &str) -> Result<()> { Mount::builder() .fstype(FilesystemType::from("overlay")) @@ -133,17 +133,17 @@ pub fn mount_overlay(lowerdir: &str, mnt: &str) -> Result<()> { .map_err(|e| anyhow::anyhow!("mount partition: {mnt} overlay failed: {e}")) } -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] pub fn mount_ext4(_src: &str, _target: &str, _autodrop: bool) -> Result<()> { unimplemented!() } -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] pub fn umount_dir(_src: &str) -> Result<()> { unimplemented!() } -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] pub fn mount_overlay(_lowerdir: &str, _mnt: &str) -> Result<()> { unimplemented!() } diff --git a/userspace/ksud/src/restorecon.rs b/userspace/ksud/src/restorecon.rs index 6f48f59e..08ccf204 100644 --- a/userspace/ksud/src/restorecon.rs +++ b/userspace/ksud/src/restorecon.rs @@ -2,9 +2,9 @@ use anyhow::Result; use jwalk::{Parallelism::Serial, WalkDir}; use std::path::Path; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use anyhow::{Context, Ok}; -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] use extattr::{setxattr, Flags as XattrFlags}; const SYSTEM_CON: &str = "u:object_r:system_file:s0"; @@ -12,18 +12,18 @@ const _ADB_CON: &str = "u:object_r:adb_data_file:s0"; const SELINUX_XATTR : &str = "security.selinux"; pub fn setcon>(path: P, con: &str) -> Result<()> { - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] setxattr(&path, SELINUX_XATTR, con, XattrFlags::empty()) .with_context(|| format!("Failed to change SELinux context for {}", path.as_ref().display()))?; Ok(()) } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] pub fn setsyscon>(path: P) -> Result<()> { setcon(path, SYSTEM_CON) } -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] pub fn setsyscon>(path: P) -> Result<()> { unimplemented!() } @@ -31,7 +31,7 @@ pub fn setsyscon>(path: P) -> Result<()> { pub fn restore_syscon>(dir: P) -> Result<()> { for dir_entry in WalkDir::new(dir).parallelism(Serial) { if let Some(path) = dir_entry.ok().map(|dir_entry| dir_entry.path()) { - #[cfg(target_os = "linux")] + #[cfg(any(target_os = "linux", target_os = "android"))] setxattr(&path, SELINUX_XATTR, SYSTEM_CON, XattrFlags::empty()).with_context( || format!("Failed to change SELinux context for {}", path.display()), )?; diff --git a/userspace/ksud/src/sepolicy.rs b/userspace/ksud/src/sepolicy.rs index c699ae3e..912808d3 100644 --- a/userspace/ksud/src/sepolicy.rs +++ b/userspace/ksud/src/sepolicy.rs @@ -691,7 +691,7 @@ impl From for FfiPolicy { } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] fn apply_one_rule<'a>(statement: &'a PolicyStatement<'a>, strict: bool) -> Result<()> { let policies: Vec = statement.try_into()?; @@ -720,7 +720,7 @@ fn apply_one_rule<'a>(statement: &'a PolicyStatement<'a>, strict: bool) -> Resul Ok(()) } -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] fn apply_one_rule<'a>(_statement: &'a PolicyStatement<'a>, _strict: bool) -> Result<()> { unimplemented!() } diff --git a/userspace/ksud/src/utils.rs b/userspace/ksud/src/utils.rs index f734992c..17ea277b 100644 --- a/userspace/ksud/src/utils.rs +++ b/userspace/ksud/src/utils.rs @@ -63,12 +63,12 @@ pub fn ensure_binary>(path: T, contents: &[u8]) -> Result<()> { Ok(()) } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "android"))] pub fn getprop(prop: &str) -> Option { android_properties::getprop(prop).value() } -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "android")))] pub fn getprop(_prop: &str) -> Option { unimplemented!() }