mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-30 21:45:27 +00:00
Improve handshake between the 2 daemons
This commit is contained in:
parent
5d5ec08566
commit
46ee2c3f4e
@ -83,7 +83,7 @@ static void *request_handler(void *args) {
|
|||||||
case LATE_START:
|
case LATE_START:
|
||||||
late_start(client);
|
late_start(client);
|
||||||
break;
|
break;
|
||||||
case MONITOR:
|
case HANDSHAKE:
|
||||||
/* Do NOT close the client, make it hold */
|
/* Do NOT close the client, make it hold */
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -121,7 +121,12 @@ void main_daemon() {
|
|||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
// Start the log monitor
|
// Start the log monitor
|
||||||
monitor_logs();
|
loggable = exec_command_sync("/system/bin/logcat", "-d", "-f", "/dev/null", NULL) == 0;
|
||||||
|
if (loggable) {
|
||||||
|
connect_daemon2(LOG_DAEMON, &fd);
|
||||||
|
write_int(fd, HANDSHAKE);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
struct sockaddr_un sun;
|
struct sockaddr_un sun;
|
||||||
fd = setup_socket(&sun, MAIN_DAEMON);
|
fd = setup_socket(&sun, MAIN_DAEMON);
|
||||||
|
@ -55,24 +55,6 @@ static void sigpipe_handler(int sig) {
|
|||||||
events[HIDE_EVENT].fd = -1;
|
events[HIDE_EVENT].fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *socket_thread(void *args) {
|
|
||||||
/* This would block, so separate thread */
|
|
||||||
while(1) {
|
|
||||||
int fd = xaccept4(sockfd, NULL, NULL, SOCK_CLOEXEC);
|
|
||||||
switch(read_int(fd)) {
|
|
||||||
case HIDE_CONNECT:
|
|
||||||
pthread_mutex_lock(&lock);
|
|
||||||
close(events[HIDE_EVENT].fd);
|
|
||||||
events[HIDE_EVENT].fd = fd;
|
|
||||||
pthread_mutex_unlock(&lock);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
close(fd);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *monitor_thread(void *args) {
|
static void *monitor_thread(void *args) {
|
||||||
// Block SIGPIPE to prevent interruption
|
// Block SIGPIPE to prevent interruption
|
||||||
sigset_t block_set;
|
sigset_t block_set;
|
||||||
@ -83,61 +65,19 @@ static void *monitor_thread(void *args) {
|
|||||||
sleep(5);
|
sleep(5);
|
||||||
int fd;
|
int fd;
|
||||||
char b;
|
char b;
|
||||||
do {
|
while (1) {
|
||||||
fd = connect_daemon();
|
fd = connect_daemon();
|
||||||
write_int(fd, MONITOR);
|
write_int(fd, HANDSHAKE);
|
||||||
// This should hold unless the daemon is killed
|
// This should hold unless the daemon is killed
|
||||||
read(fd, &b, sizeof(b));
|
read(fd, &b, sizeof(b));
|
||||||
// The main daemon crashed, spawn a new one
|
// The main daemon crashed, spawn a new one
|
||||||
close(fd);
|
close(fd);
|
||||||
} while (1);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_daemon() {
|
static void *logcat_thread(void *args) {
|
||||||
setsid();
|
|
||||||
struct sockaddr_un sun;
|
|
||||||
sockfd = setup_socket(&sun, LOG_DAEMON);
|
|
||||||
if (xbind(sockfd, (struct sockaddr*) &sun, sizeof(sun)))
|
|
||||||
exit(1);
|
|
||||||
xlisten(sockfd, 10);
|
|
||||||
LOGI("Magisk v" xstr(MAGISK_VERSION) "(" xstr(MAGISK_VER_CODE) ") logger started\n");
|
|
||||||
strcpy(argv0, "magisklogd");
|
|
||||||
|
|
||||||
// Start worker threads
|
|
||||||
pthread_t t;
|
|
||||||
pthread_create(&t, NULL, monitor_thread, NULL);
|
|
||||||
pthread_detach(t);
|
|
||||||
xpthread_create(&t, NULL, socket_thread, NULL);
|
|
||||||
pthread_detach(t);
|
|
||||||
|
|
||||||
// Set SIGPIPE handler
|
|
||||||
struct sigaction act;
|
|
||||||
memset(&act, 0, sizeof(act));
|
|
||||||
act.sa_handler = sigpipe_handler;
|
|
||||||
sigaction(SIGPIPE, &act, NULL);
|
|
||||||
|
|
||||||
// Setup log dumps
|
|
||||||
rename(LOGFILE, LOGFILE ".bak");
|
|
||||||
events[LOG_EVENT].fd = xopen(LOGFILE, O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC | O_APPEND, 0644);
|
|
||||||
|
|
||||||
// Construct cmdline
|
|
||||||
vec_init(&log_cmd);
|
|
||||||
vec_push_back(&log_cmd, "/system/bin/logcat");
|
|
||||||
// Test whether these buffers actually works
|
|
||||||
const char* b[] = { "main", "events", "crash" };
|
|
||||||
for (int i = 0; i < 3; ++i) {
|
|
||||||
if (exec_command_sync("/system/bin/logcat", "-b", b[i], "-d", "-f", "/dev/null", NULL) == 0)
|
|
||||||
vec_push_back_all(&log_cmd, "-b", b[i], NULL);
|
|
||||||
}
|
|
||||||
vec_dup(&log_cmd, &clear_cmd);
|
|
||||||
vec_push_back_all(&log_cmd, "-v", "threadtime", "-s", "am_proc_start", "Magisk", "*:F", NULL);
|
|
||||||
vec_push_back(&log_cmd, NULL);
|
|
||||||
vec_push_back(&clear_cmd, "-c");
|
|
||||||
vec_push_back(&clear_cmd, NULL);
|
|
||||||
|
|
||||||
int log_fd = -1, log_pid;
|
int log_fd = -1, log_pid;
|
||||||
char line[PIPE_BUF];
|
char line[4096];
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
// Start logcat
|
// Start logcat
|
||||||
log_pid = exec_array(0, &log_fd, NULL, (char **) vec_entry(&log_cmd));
|
log_pid = exec_array(0, &log_fd, NULL, (char **) vec_entry(&log_cmd));
|
||||||
@ -166,13 +106,61 @@ void log_daemon() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Start new threads to monitor logcat and dump to logfile */
|
void log_daemon() {
|
||||||
void monitor_logs() {
|
setsid();
|
||||||
loggable = exec_command_sync("/system/bin/logcat", "-d", "-f", "/dev/null", NULL) == 0;
|
struct sockaddr_un sun;
|
||||||
if (loggable) {
|
sockfd = setup_socket(&sun, LOG_DAEMON);
|
||||||
int fd;
|
if (xbind(sockfd, (struct sockaddr*) &sun, sizeof(sun)))
|
||||||
connect_daemon2(LOG_DAEMON, &fd);
|
exit(1);
|
||||||
write_int(fd, DO_NOTHING);
|
xlisten(sockfd, 10);
|
||||||
close(fd);
|
LOGI("Magisk v" xstr(MAGISK_VERSION) "(" xstr(MAGISK_VER_CODE) ") logger started\n");
|
||||||
|
strcpy(argv0, "magisklogd");
|
||||||
|
|
||||||
|
// Set SIGPIPE handler
|
||||||
|
struct sigaction act;
|
||||||
|
memset(&act, 0, sizeof(act));
|
||||||
|
act.sa_handler = sigpipe_handler;
|
||||||
|
sigaction(SIGPIPE, &act, NULL);
|
||||||
|
|
||||||
|
// Setup log dumps
|
||||||
|
rename(LOGFILE, LOGFILE ".bak");
|
||||||
|
events[LOG_EVENT].fd = xopen(LOGFILE, O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC | O_APPEND, 0644);
|
||||||
|
|
||||||
|
// Construct cmdline
|
||||||
|
vec_init(&log_cmd);
|
||||||
|
vec_push_back(&log_cmd, "/system/bin/logcat");
|
||||||
|
// Test whether these buffers actually works
|
||||||
|
const char* b[] = { "main", "events", "crash" };
|
||||||
|
for (int i = 0; i < 3; ++i) {
|
||||||
|
if (exec_command_sync("/system/bin/logcat", "-b", b[i], "-d", "-f", "/dev/null", NULL) == 0)
|
||||||
|
vec_push_back_all(&log_cmd, "-b", b[i], NULL);
|
||||||
|
}
|
||||||
|
vec_dup(&log_cmd, &clear_cmd);
|
||||||
|
vec_push_back_all(&log_cmd, "-v", "threadtime", "-s", "am_proc_start", "Magisk", "*:F", NULL);
|
||||||
|
vec_push_back(&log_cmd, NULL);
|
||||||
|
vec_push_back(&clear_cmd, "-c");
|
||||||
|
vec_push_back(&clear_cmd, NULL);
|
||||||
|
|
||||||
|
// Start worker threads
|
||||||
|
pthread_t thread;
|
||||||
|
pthread_create(&thread, NULL, monitor_thread, NULL);
|
||||||
|
pthread_detach(thread);
|
||||||
|
xpthread_create(&thread, NULL, logcat_thread, NULL);
|
||||||
|
pthread_detach(thread);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
int fd = xaccept4(sockfd, NULL, NULL, SOCK_CLOEXEC);
|
||||||
|
switch(read_int(fd)) {
|
||||||
|
case HIDE_CONNECT:
|
||||||
|
pthread_mutex_lock(&lock);
|
||||||
|
close(events[HIDE_EVENT].fd);
|
||||||
|
events[HIDE_EVENT].fd = fd;
|
||||||
|
pthread_mutex_unlock(&lock);
|
||||||
|
break;
|
||||||
|
case HANDSHAKE:
|
||||||
|
default:
|
||||||
|
close(fd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,8 +25,8 @@ enum {
|
|||||||
ADD_HIDELIST,
|
ADD_HIDELIST,
|
||||||
RM_HIDELIST,
|
RM_HIDELIST,
|
||||||
LS_HIDELIST,
|
LS_HIDELIST,
|
||||||
MONITOR,
|
HIDE_CONNECT,
|
||||||
HIDE_CONNECT
|
HANDSHAKE
|
||||||
};
|
};
|
||||||
|
|
||||||
// Return codes for daemon
|
// Return codes for daemon
|
||||||
@ -55,6 +55,7 @@ void auto_start_magiskhide();
|
|||||||
|
|
||||||
// log_monitor.c
|
// log_monitor.c
|
||||||
|
|
||||||
|
extern int loggable;
|
||||||
void log_daemon();
|
void log_daemon();
|
||||||
|
|
||||||
// socket.c
|
// socket.c
|
||||||
|
@ -46,10 +46,6 @@
|
|||||||
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
|
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
|
||||||
#define PLOGE(fmt, args...) LOGE(fmt " failed with %d: %s", ##args, errno, strerror(errno))
|
#define PLOGE(fmt, args...) LOGE(fmt " failed with %d: %s", ##args, errno, strerror(errno))
|
||||||
|
|
||||||
extern int loggable;
|
|
||||||
|
|
||||||
void monitor_logs();
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/********************
|
/********************
|
||||||
|
Loading…
Reference in New Issue
Block a user