diff --git a/loader/src/common/daemon.cpp b/loader/src/common/daemon.cpp index d0dea38..22a2607 100644 --- a/loader/src/common/daemon.cpp +++ b/loader/src/common/daemon.cpp @@ -8,8 +8,8 @@ namespace zygiskd { - UniqueFd Connect(uint8_t retry) { - UniqueFd fd = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); + int Connect(uint8_t retry) { + int fd = socket(PF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); struct sockaddr_un addr{ .sun_family = AF_UNIX, .sun_path={0}, @@ -23,12 +23,14 @@ namespace zygiskd { LOGW("retrying to connect to zygiskd, sleep 1s"); sleep(1); } + + close(fd); return -1; } bool PingHeartbeat() { LOGD("Daemon socket: %s", kZygiskSocket.data()); - auto fd = Connect(5); + UniqueFd fd = Connect(5); if (fd == -1) { PLOGE("Connect to zygiskd"); return false; @@ -38,7 +40,7 @@ namespace zygiskd { } std::string ReadNativeBridge() { - auto fd = Connect(1); + UniqueFd fd = Connect(1); if (fd == -1) { PLOGE("ReadNativeBridge"); return ""; @@ -49,7 +51,7 @@ namespace zygiskd { std::vector ReadModules() { std::vector modules; - auto fd = Connect(1); + UniqueFd fd = Connect(1); if (fd == -1) { PLOGE("ReadModules"); return modules; @@ -69,8 +71,8 @@ namespace zygiskd { return modules; } - UniqueFd ConnectCompanion(size_t index) { - auto fd = Connect(1); + int ConnectCompanion(size_t index) { + int fd = Connect(1); if (fd == -1) { PLOGE("ConnectCompanion"); return -1; @@ -84,8 +86,8 @@ namespace zygiskd { } } - UniqueFd GetModuleDir(size_t index) { - auto fd = Connect(1); + int GetModuleDir(size_t index) { + int fd = Connect(1); if (fd == -1) { PLOGE("GetModuleDir"); return -1; diff --git a/loader/src/common/socket_utils.cpp b/loader/src/common/socket_utils.cpp index bb85c2a..d58f915 100644 --- a/loader/src/common/socket_utils.cpp +++ b/loader/src/common/socket_utils.cpp @@ -86,6 +86,10 @@ namespace socket_utils { return sizeof(T) == xwrite(fd, &val, sizeof(T)); } + uint8_t read_u8(int fd) { + return read_exact_or(fd, 0); + } + size_t read_usize(int fd) { return read_exact_or(fd, 0); } @@ -116,8 +120,4 @@ namespace socket_utils { memcpy(&result, data, sizeof(int)); return result; } - - uint8_t read_u8(int fd) { - return read_exact_or(fd, 0); - } } diff --git a/loader/src/include/daemon.h b/loader/src/include/daemon.h index b811f1c..bf49a61 100644 --- a/loader/src/include/daemon.h +++ b/loader/src/include/daemon.h @@ -65,7 +65,7 @@ namespace zygiskd { std::vector ReadModules(); - UniqueFd ConnectCompanion(size_t index); + int ConnectCompanion(size_t index); - UniqueFd GetModuleDir(size_t index); + int GetModuleDir(size_t index); } diff --git a/loader/src/include/socket_utils.h b/loader/src/include/socket_utils.h index e186d47..3a2bcbc 100644 --- a/loader/src/include/socket_utils.h +++ b/loader/src/include/socket_utils.h @@ -10,6 +10,8 @@ namespace socket_utils { ssize_t xwrite(int fd, const void *buf, size_t count); + uint8_t read_u8(int fd); + size_t read_usize(int fd); std::string read_string(int fd); @@ -19,6 +21,4 @@ namespace socket_utils { int recv_fd(int fd); bool write_usize(int fd, size_t val); - - uint8_t read_u8(int fd); } diff --git a/zygiskd/src/zygisk.rs b/zygiskd/src/zygisk.rs index 0b8bc3e..19a8f32 100644 --- a/zygiskd/src/zygisk.rs +++ b/zygiskd/src/zygisk.rs @@ -99,8 +99,9 @@ fn load_modules(arch: &str) -> Result> { for entry_result in dir.into_iter() { let entry = entry_result?; let name = entry.file_name().into_string().unwrap(); - let so_path = entry.path().join(format!("zygisk/{arch}.so")); - if !so_path.exists() { + let so_path = entry.path().join(format!("zygisksu/{arch}.so")); + let disabled = entry.path().join("disabled"); + if !so_path.exists() || disabled.exists() { continue; } log::info!(" Loading module `{name}`..."); @@ -203,6 +204,7 @@ fn handle_daemon_action(mut stream: UnixStream, context: &Context) -> Result<()> let module = &context.modules[index]; log::debug!("New companion request from module {}", module.name); + // FIXME: Spawn a new process match module.companion_entry { Some(entry) => { stream.write_u8(1)?; @@ -214,15 +216,11 @@ fn handle_daemon_action(mut stream: UnixStream, context: &Context) -> Result<()> } } DaemonSocketAction::GetModuleDir => { - unsafe { - let index = stream.read_usize()?; - let module = &context.modules[index]; - let path = format!("{}/{}", constants::PATH_KSU_MODULE_DIR, module.name); - let filename = std::ffi::CString::new(path)?; - let fd = libc::open(filename.as_ptr(), libc::O_PATH | libc::O_CLOEXEC); - stream.send_fd(fd)?; - libc::close(fd); - } + let index = stream.read_usize()?; + let module = &context.modules[index]; + let dir = format!("{}/{}", constants::PATH_KSU_MODULE_DIR, module.name); + let dir = fs::File::open(dir)?; + stream.send_fd(dir.as_raw_fd())?; } } Ok(())