ksud: fmt & tidy
This commit is contained in:
@@ -162,7 +162,8 @@ pub fn patch(
|
|||||||
.status()?;
|
.status()?;
|
||||||
ensure!(status.success(), "magiskboot unpack failed");
|
ensure!(status.success(), "magiskboot unpack failed");
|
||||||
|
|
||||||
let is_kernelsu_patched = do_cpio_cmd(&magiskboot, workding_dir.path(), "exists kernelsu.ko").is_ok();
|
let is_kernelsu_patched =
|
||||||
|
do_cpio_cmd(&magiskboot, workding_dir.path(), "exists kernelsu.ko").is_ok();
|
||||||
if !is_kernelsu_patched {
|
if !is_kernelsu_patched {
|
||||||
// kernelsu.ko is not exist, backup init if necessary
|
// kernelsu.ko is not exist, backup init if necessary
|
||||||
let status = do_cpio_cmd(&magiskboot, workding_dir.path(), "exists init");
|
let status = do_cpio_cmd(&magiskboot, workding_dir.path(), "exists init");
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use android_logger::Config;
|
|||||||
#[cfg(target_os = "android")]
|
#[cfg(target_os = "android")]
|
||||||
use log::LevelFilter;
|
use log::LevelFilter;
|
||||||
|
|
||||||
use crate::{apk_sign, debug, defs, event, module, utils};
|
use crate::{apk_sign, debug, defs, init_event, ksucalls, module, utils};
|
||||||
|
|
||||||
/// KernelSU userspace cli
|
/// KernelSU userspace cli
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
@@ -239,7 +239,7 @@ pub fn run() -> Result<()> {
|
|||||||
// the kernel executes su with argv[0] = "su" and replace it with us
|
// the kernel executes su with argv[0] = "su" and replace it with us
|
||||||
let arg0 = std::env::args().next().unwrap_or_default();
|
let arg0 = std::env::args().next().unwrap_or_default();
|
||||||
if arg0 == "su" || arg0 == "/system/bin/su" {
|
if arg0 == "su" || arg0 == "/system/bin/su" {
|
||||||
return crate::ksu::root_shell();
|
return crate::su::root_shell();
|
||||||
}
|
}
|
||||||
|
|
||||||
let cli = Args::parse();
|
let cli = Args::parse();
|
||||||
@@ -247,8 +247,8 @@ pub fn run() -> Result<()> {
|
|||||||
log::info!("command: {:?}", cli.command);
|
log::info!("command: {:?}", cli.command);
|
||||||
|
|
||||||
let result = match cli.command {
|
let result = match cli.command {
|
||||||
Commands::PostFsData => event::on_post_data_fs(),
|
Commands::PostFsData => init_event::on_post_data_fs(),
|
||||||
Commands::BootCompleted => event::on_boot_completed(),
|
Commands::BootCompleted => init_event::on_boot_completed(),
|
||||||
|
|
||||||
Commands::Module { command } => {
|
Commands::Module { command } => {
|
||||||
#[cfg(any(target_os = "linux", target_os = "android"))]
|
#[cfg(any(target_os = "linux", target_os = "android"))]
|
||||||
@@ -265,13 +265,13 @@ pub fn run() -> Result<()> {
|
|||||||
Module::Shrink => module::shrink_ksu_images(),
|
Module::Shrink => module::shrink_ksu_images(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Commands::Install => event::install(),
|
Commands::Install => utils::install(),
|
||||||
Commands::Sepolicy { command } => match command {
|
Commands::Sepolicy { command } => match command {
|
||||||
Sepolicy::Patch { sepolicy } => crate::sepolicy::live_patch(&sepolicy),
|
Sepolicy::Patch { sepolicy } => crate::sepolicy::live_patch(&sepolicy),
|
||||||
Sepolicy::Apply { file } => crate::sepolicy::apply_file(file),
|
Sepolicy::Apply { file } => crate::sepolicy::apply_file(file),
|
||||||
Sepolicy::Check { sepolicy } => crate::sepolicy::check_rule(&sepolicy),
|
Sepolicy::Check { sepolicy } => crate::sepolicy::check_rule(&sepolicy),
|
||||||
},
|
},
|
||||||
Commands::Services => event::on_services(),
|
Commands::Services => init_event::on_services(),
|
||||||
Commands::Profile { command } => match command {
|
Commands::Profile { command } => match command {
|
||||||
Profile::GetSepolicy { package } => crate::profile::get_sepolicy(package),
|
Profile::GetSepolicy { package } => crate::profile::get_sepolicy(package),
|
||||||
Profile::SetSepolicy { package, policy } => {
|
Profile::SetSepolicy { package, policy } => {
|
||||||
@@ -291,11 +291,11 @@ pub fn run() -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Debug::Version => {
|
Debug::Version => {
|
||||||
println!("Kernel Version: {}", crate::ksu::get_version());
|
println!("Kernel Version: {}", ksucalls::get_version());
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Debug::Su { global_mnt } => crate::ksu::grant_root(global_mnt),
|
Debug::Su { global_mnt } => crate::su::grant_root(global_mnt),
|
||||||
Debug::Mount => event::mount_systemlessly(defs::MODULE_DIR),
|
Debug::Mount => init_event::mount_modules_systemlessly(defs::MODULE_DIR),
|
||||||
Debug::Xcp {
|
Debug::Xcp {
|
||||||
src,
|
src,
|
||||||
dst,
|
dst,
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
use anyhow::{bail, Context, Result};
|
use anyhow::{bail, Context, Result};
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
#[cfg(target_os = "android")]
|
|
||||||
use std::path::PathBuf;
|
|
||||||
use std::{collections::HashMap, path::Path};
|
use std::{collections::HashMap, path::Path};
|
||||||
|
|
||||||
use crate::module::prune_modules;
|
use crate::module::prune_modules;
|
||||||
use crate::{
|
use crate::{
|
||||||
assets, defs, mount, restorecon,
|
assets, defs, ksucalls, mount, restorecon,
|
||||||
utils::{self, ensure_clean_dir, ensure_dir_exists},
|
utils::{self, ensure_clean_dir},
|
||||||
};
|
};
|
||||||
|
|
||||||
fn mount_partition(partition_name: &str, lowerdir: &Vec<String>) -> Result<()> {
|
fn mount_partition(partition_name: &str, lowerdir: &Vec<String>) -> Result<()> {
|
||||||
@@ -35,7 +33,7 @@ fn mount_partition(partition_name: &str, lowerdir: &Vec<String>) -> Result<()> {
|
|||||||
mount::mount_overlay(&partition, lowerdir, workdir, upperdir)
|
mount::mount_overlay(&partition, lowerdir, workdir, upperdir)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mount_systemlessly(module_dir: &str) -> Result<()> {
|
pub fn mount_modules_systemlessly(module_dir: &str) -> Result<()> {
|
||||||
// construct overlay mount params
|
// construct overlay mount params
|
||||||
let dir = std::fs::read_dir(module_dir);
|
let dir = std::fs::read_dir(module_dir);
|
||||||
let Ok(dir) = dir else {
|
let Ok(dir) = dir else {
|
||||||
@@ -99,7 +97,7 @@ pub fn mount_systemlessly(module_dir: &str) -> Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn on_post_data_fs() -> Result<()> {
|
pub fn on_post_data_fs() -> Result<()> {
|
||||||
crate::ksu::report_post_fs_data();
|
ksucalls::report_post_fs_data();
|
||||||
|
|
||||||
utils::umask(0);
|
utils::umask(0);
|
||||||
|
|
||||||
@@ -162,7 +160,7 @@ pub fn on_post_data_fs() -> Result<()> {
|
|||||||
.with_context(|| "mount module image failed".to_string())?;
|
.with_context(|| "mount module image failed".to_string())?;
|
||||||
|
|
||||||
// tell kernel that we've mount the module, so that it can do some optimization
|
// tell kernel that we've mount the module, so that it can do some optimization
|
||||||
crate::ksu::report_module_mounted();
|
ksucalls::report_module_mounted();
|
||||||
|
|
||||||
// if we are in safe mode, we should disable all modules
|
// if we are in safe mode, we should disable all modules
|
||||||
if safe_mode {
|
if safe_mode {
|
||||||
@@ -207,7 +205,7 @@ pub fn on_post_data_fs() -> Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// mount module systemlessly by overlay
|
// mount module systemlessly by overlay
|
||||||
if let Err(e) = mount_systemlessly(module_dir) {
|
if let Err(e) = mount_modules_systemlessly(module_dir) {
|
||||||
warn!("do systemless mount failed: {}", e);
|
warn!("do systemless mount failed: {}", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,7 +245,7 @@ pub fn on_services() -> Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn on_boot_completed() -> Result<()> {
|
pub fn on_boot_completed() -> Result<()> {
|
||||||
crate::ksu::report_boot_complete();
|
ksucalls::report_boot_complete();
|
||||||
info!("on_boot_completed triggered!");
|
info!("on_boot_completed triggered!");
|
||||||
let module_update_img = Path::new(defs::MODULE_UPDATE_IMG);
|
let module_update_img = Path::new(defs::MODULE_UPDATE_IMG);
|
||||||
let module_img = Path::new(defs::MODULE_IMG);
|
let module_img = Path::new(defs::MODULE_IMG);
|
||||||
@@ -266,29 +264,6 @@ pub fn on_boot_completed() -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn install() -> Result<()> {
|
|
||||||
ensure_dir_exists(defs::ADB_DIR)?;
|
|
||||||
std::fs::copy("/proc/self/exe", defs::DAEMON_PATH)?;
|
|
||||||
restorecon::lsetfilecon(defs::DAEMON_PATH, restorecon::ADB_CON)?;
|
|
||||||
// install binary assets
|
|
||||||
assets::ensure_binaries(false).with_context(|| "Failed to extract assets")?;
|
|
||||||
|
|
||||||
#[cfg(target_os = "android")]
|
|
||||||
link_ksud_to_bin()?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(target_os = "android")]
|
|
||||||
fn link_ksud_to_bin() -> Result<()> {
|
|
||||||
let ksu_bin = PathBuf::from(defs::DAEMON_PATH);
|
|
||||||
let ksu_bin_link = PathBuf::from(defs::DAEMON_LINK_PATH);
|
|
||||||
if ksu_bin.exists() && !ksu_bin_link.exists() {
|
|
||||||
std::os::unix::fs::symlink(&ksu_bin, &ksu_bin_link)?;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
fn catch_bootlog() -> Result<()> {
|
fn catch_bootlog() -> Result<()> {
|
||||||
use std::os::unix::process::CommandExt;
|
use std::os::unix::process::CommandExt;
|
||||||
43
userspace/ksud/src/ksucalls.rs
Normal file
43
userspace/ksud/src/ksucalls.rs
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
const EVENT_POST_FS_DATA: u64 = 1;
|
||||||
|
const EVENT_BOOT_COMPLETED: u64 = 2;
|
||||||
|
const EVENT_MODULE_MOUNTED: u64 = 3;
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "linux", target_os = "android"))]
|
||||||
|
pub fn get_version() -> i32 {
|
||||||
|
rustix::process::ksu_get_version()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(target_os = "linux", target_os = "android")))]
|
||||||
|
pub fn get_version() -> i32 {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "linux", target_os = "android"))]
|
||||||
|
fn report_event(event: u64) {
|
||||||
|
rustix::process::ksu_report_event(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(target_os = "linux", target_os = "android")))]
|
||||||
|
fn report_event(_event: u64) {}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "linux", target_os = "android"))]
|
||||||
|
pub fn check_kernel_safemode() -> bool {
|
||||||
|
rustix::process::ksu_check_kernel_safemode()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(any(target_os = "linux", target_os = "android")))]
|
||||||
|
pub fn check_kernel_safemode() -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn report_post_fs_data() {
|
||||||
|
report_event(EVENT_POST_FS_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn report_boot_complete() {
|
||||||
|
report_event(EVENT_BOOT_COMPLETED);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn report_module_mounted() {
|
||||||
|
report_event(EVENT_MODULE_MOUNTED);
|
||||||
|
}
|
||||||
@@ -4,13 +4,14 @@ mod boot_patch;
|
|||||||
mod cli;
|
mod cli;
|
||||||
mod debug;
|
mod debug;
|
||||||
mod defs;
|
mod defs;
|
||||||
mod event;
|
mod init_event;
|
||||||
mod ksu;
|
mod ksucalls;
|
||||||
mod module;
|
mod module;
|
||||||
mod mount;
|
mod mount;
|
||||||
mod profile;
|
mod profile;
|
||||||
mod restorecon;
|
mod restorecon;
|
||||||
mod sepolicy;
|
mod sepolicy;
|
||||||
|
mod su;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
||||||
fn main() -> anyhow::Result<()> {
|
fn main() -> anyhow::Result<()> {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#[allow(clippy::wildcard_imports)]
|
#[allow(clippy::wildcard_imports)]
|
||||||
use crate::utils::*;
|
use crate::utils::*;
|
||||||
use crate::{
|
use crate::{
|
||||||
assets, defs, mount,
|
assets, defs, ksucalls, mount,
|
||||||
restorecon::{restore_syscon, setsyscon},
|
restorecon::{restore_syscon, setsyscon},
|
||||||
sepolicy, utils,
|
sepolicy, utils,
|
||||||
};
|
};
|
||||||
@@ -53,7 +53,7 @@ fn exec_install_script(module_file: &str) -> Result<()> {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.env("KSU", "true")
|
.env("KSU", "true")
|
||||||
.env("KSU_KERNEL_VER_CODE", crate::ksu::get_version().to_string())
|
.env("KSU_KERNEL_VER_CODE", ksucalls::get_version().to_string())
|
||||||
.env("KSU_VER", defs::VERSION_NAME)
|
.env("KSU_VER", defs::VERSION_NAME)
|
||||||
.env("KSU_VER_CODE", defs::VERSION_CODE)
|
.env("KSU_VER_CODE", defs::VERSION_CODE)
|
||||||
.env("OUTFD", "1")
|
.env("OUTFD", "1")
|
||||||
@@ -178,7 +178,7 @@ fn exec_script<T: AsRef<Path>>(path: T, wait: bool) -> Result<()> {
|
|||||||
.arg(path.as_ref())
|
.arg(path.as_ref())
|
||||||
.env("ASH_STANDALONE", "1")
|
.env("ASH_STANDALONE", "1")
|
||||||
.env("KSU", "true")
|
.env("KSU", "true")
|
||||||
.env("KSU_KERNEL_VER_CODE", crate::ksu::get_version().to_string())
|
.env("KSU_KERNEL_VER_CODE", ksucalls::get_version().to_string())
|
||||||
.env("KSU_VER_CODE", defs::VERSION_CODE)
|
.env("KSU_VER_CODE", defs::VERSION_CODE)
|
||||||
.env("KSU_VER", defs::VERSION_NAME)
|
.env("KSU_VER", defs::VERSION_NAME)
|
||||||
.env(
|
.env(
|
||||||
|
|||||||
@@ -17,10 +17,6 @@ use rustix::{
|
|||||||
thread::{set_thread_res_gid, set_thread_res_uid, Gid, Uid},
|
thread::{set_thread_res_gid, set_thread_res_uid, Gid, Uid},
|
||||||
};
|
};
|
||||||
|
|
||||||
const EVENT_POST_FS_DATA: u64 = 1;
|
|
||||||
const EVENT_BOOT_COMPLETED: u64 = 2;
|
|
||||||
const EVENT_MODULE_MOUNTED: u64 = 3;
|
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "android"))]
|
#[cfg(any(target_os = "linux", target_os = "android"))]
|
||||||
pub fn grant_root(global_mnt: bool) -> Result<()> {
|
pub fn grant_root(global_mnt: bool) -> Result<()> {
|
||||||
const KERNEL_SU_OPTION: u32 = 0xDEAD_BEEF;
|
const KERNEL_SU_OPTION: u32 = 0xDEAD_BEEF;
|
||||||
@@ -303,43 +299,3 @@ fn add_path_to_env(path: &str) -> Result<()> {
|
|||||||
env::set_var("PATH", new_path_env);
|
env::set_var("PATH", new_path_env);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "android"))]
|
|
||||||
pub fn get_version() -> i32 {
|
|
||||||
rustix::process::ksu_get_version()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "linux", target_os = "android")))]
|
|
||||||
pub fn get_version() -> i32 {
|
|
||||||
0
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "android"))]
|
|
||||||
fn report_event(event: u64) {
|
|
||||||
rustix::process::ksu_report_event(event)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "linux", target_os = "android")))]
|
|
||||||
fn report_event(_event: u64) {}
|
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "android"))]
|
|
||||||
pub fn check_kernel_safemode() -> bool {
|
|
||||||
rustix::process::ksu_check_kernel_safemode()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "linux", target_os = "android")))]
|
|
||||||
pub fn check_kernel_safemode() -> bool {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn report_post_fs_data() {
|
|
||||||
report_event(EVENT_POST_FS_DATA);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn report_boot_complete() {
|
|
||||||
report_event(EVENT_BOOT_COMPLETED);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn report_module_mounted() {
|
|
||||||
report_event(EVENT_MODULE_MOUNTED);
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,7 @@ use std::{
|
|||||||
path::Path,
|
path::Path,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::defs;
|
use crate::{assets, defs, ksucalls, restorecon};
|
||||||
use std::fs::metadata;
|
use std::fs::metadata;
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
use std::fs::{set_permissions, Permissions};
|
use std::fs::{set_permissions, Permissions};
|
||||||
@@ -16,6 +16,7 @@ use hole_punch::*;
|
|||||||
use std::io::{Read, Seek, SeekFrom};
|
use std::io::{Read, Seek, SeekFrom};
|
||||||
|
|
||||||
use jwalk::WalkDir;
|
use jwalk::WalkDir;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "android"))]
|
#[cfg(any(target_os = "linux", target_os = "android"))]
|
||||||
use rustix::{
|
use rustix::{
|
||||||
@@ -108,7 +109,7 @@ pub fn is_safe_mode() -> bool {
|
|||||||
if safemode {
|
if safemode {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
let safemode = crate::ksu::check_kernel_safemode();
|
let safemode = ksucalls::check_kernel_safemode();
|
||||||
log::info!("kernel_safemode: {}", safemode);
|
log::info!("kernel_safemode: {}", safemode);
|
||||||
safemode
|
safemode
|
||||||
}
|
}
|
||||||
@@ -193,6 +194,29 @@ pub fn get_tmp_path() -> &'static str {
|
|||||||
""
|
""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "android")]
|
||||||
|
fn link_ksud_to_bin() -> Result<()> {
|
||||||
|
let ksu_bin = PathBuf::from(defs::DAEMON_PATH);
|
||||||
|
let ksu_bin_link = PathBuf::from(defs::DAEMON_LINK_PATH);
|
||||||
|
if ksu_bin.exists() && !ksu_bin_link.exists() {
|
||||||
|
std::os::unix::fs::symlink(&ksu_bin, &ksu_bin_link)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn install() -> Result<()> {
|
||||||
|
ensure_dir_exists(defs::ADB_DIR)?;
|
||||||
|
std::fs::copy("/proc/self/exe", defs::DAEMON_PATH)?;
|
||||||
|
restorecon::lsetfilecon(defs::DAEMON_PATH, restorecon::ADB_CON)?;
|
||||||
|
// install binary assets
|
||||||
|
assets::ensure_binaries(false).with_context(|| "Failed to extract assets")?;
|
||||||
|
|
||||||
|
#[cfg(target_os = "android")]
|
||||||
|
link_ksud_to_bin()?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: use libxcp to improve the speed if cross's MSRV is 1.70
|
// TODO: use libxcp to improve the speed if cross's MSRV is 1.70
|
||||||
pub fn copy_sparse_file<P: AsRef<Path>, Q: AsRef<Path>>(
|
pub fn copy_sparse_file<P: AsRef<Path>, Q: AsRef<Path>>(
|
||||||
src: P,
|
src: P,
|
||||||
|
|||||||
Reference in New Issue
Block a user