mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-12-11 06:32:19 +00:00
Make zygiskd ABI aware
This commit is contained in:
@@ -4,26 +4,30 @@
|
||||
#include <utils.hpp>
|
||||
#include <socket.hpp>
|
||||
#include <daemon.hpp>
|
||||
#include <magisk.hpp>
|
||||
|
||||
#include "zygisk.hpp"
|
||||
|
||||
using namespace std;
|
||||
|
||||
static int zygiskd_socket = -1;
|
||||
void zygiskd(int socket) {
|
||||
if (getuid() != 0 || fcntl(socket, F_GETFD) < 0)
|
||||
exit(-1);
|
||||
android_logging();
|
||||
|
||||
[[noreturn]] static void zygiskd(int socket) {
|
||||
set_nice_name("zygiskd");
|
||||
LOGI("* Launching zygiskd\n");
|
||||
#if defined(__LP64__)
|
||||
set_nice_name("zygiskd64");
|
||||
LOGI("* Launching zygiskd64\n");
|
||||
#else
|
||||
set_nice_name("zygiskd32");
|
||||
LOGI("* Launching zygiskd32\n");
|
||||
#endif
|
||||
|
||||
// Load modules
|
||||
using comp_entry = void(*)(int);
|
||||
vector<comp_entry> modules;
|
||||
{
|
||||
#if defined(__LP64__)
|
||||
vector<int> module_fds = zygisk_module_fds(true);
|
||||
#else
|
||||
vector<int> module_fds = zygisk_module_fds(false);
|
||||
#endif
|
||||
vector<int> module_fds = recv_fds(socket);
|
||||
char buf[256];
|
||||
for (int fd : module_fds) {
|
||||
snprintf(buf, sizeof(buf), "/proc/self/fd/%d", fd);
|
||||
@@ -35,6 +39,9 @@ static int zygiskd_socket = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// ack
|
||||
write_int(socket, 0);
|
||||
|
||||
// Start accepting requests
|
||||
pollfd pfd = { socket, POLLIN, 0 };
|
||||
for (;;) {
|
||||
@@ -68,7 +75,10 @@ static int zygiskd_socket = -1;
|
||||
}
|
||||
}
|
||||
|
||||
void start_companion(int client) {
|
||||
static int zygiskd_sockets[] = { -1, -1 };
|
||||
#define zygiskd_socket zygiskd_sockets[is_64_bit]
|
||||
|
||||
void connect_companion(int client, bool is_64_bit) {
|
||||
if (zygiskd_socket >= 0) {
|
||||
// Make sure the socket is still valid
|
||||
pollfd pfd = { zygiskd_socket, 0, 0 };
|
||||
@@ -84,7 +94,20 @@ void start_companion(int client) {
|
||||
socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, fds);
|
||||
zygiskd_socket = fds[0];
|
||||
if (fork_dont_care() == 0) {
|
||||
zygiskd(fds[1]);
|
||||
string exe = MAGISKTMP + "/magisk" + (is_64_bit ? "64" : "32");
|
||||
// This fd has to survive exec
|
||||
fcntl(fds[1], F_SETFD, 0);
|
||||
char buf[16];
|
||||
snprintf(buf, sizeof(buf), "%d", fds[1]);
|
||||
execlp(exe.data(), "magisk", "--companion", buf, (char *) nullptr);
|
||||
exit(-1);
|
||||
}
|
||||
close(fds[1]);
|
||||
vector<int> module_fds = zygisk_module_fds(is_64_bit);
|
||||
send_fds(zygiskd_socket, module_fds.data(), module_fds.size());
|
||||
// Wait for ack
|
||||
if (read_int(zygiskd_socket) != 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
send_fd(zygiskd_socket, client);
|
||||
|
||||
Reference in New Issue
Block a user