Add fork-based supervisor daemon for instant restart
This commit is contained in:
@@ -116,7 +116,7 @@ androidComponents {
|
|||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
into("lib") // Place them in the 'lib' subfolder of the staging directory.
|
into("lib") // Place them in the 'lib' subfolder of the staging directory.
|
||||||
include("**/libinject.so", "**/libTEESimulator.so")
|
include("**/libinject.so", "**/libTEESimulator.so", "**/libsupervisor.so")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now, copy and process the files from 'module' directory.
|
// Now, copy and process the files from 'module' directory.
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ add_executable(libinject.so inject/main.cpp inject/utils.cpp)
|
|||||||
target_include_directories(libinject.so PUBLIC include)
|
target_include_directories(libinject.so PUBLIC include)
|
||||||
target_link_libraries(libinject.so PRIVATE lsplt_static)
|
target_link_libraries(libinject.so PRIVATE lsplt_static)
|
||||||
|
|
||||||
|
add_executable(libsupervisor.so supervisor.cpp)
|
||||||
|
target_link_libraries(libsupervisor.so PRIVATE log)
|
||||||
|
|
||||||
add_library(${CMAKE_PROJECT_NAME} SHARED binder_interceptor.cpp)
|
add_library(${CMAKE_PROJECT_NAME} SHARED binder_interceptor.cpp)
|
||||||
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC external/linux-kernel/include include)
|
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC external/linux-kernel/include include)
|
||||||
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE binder lsplt_static utils)
|
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE binder lsplt_static utils)
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
// Fork-based supervisor for instant daemon restart
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
static volatile sig_atomic_t should_exit = 0;
|
||||||
|
|
||||||
|
static void signal_handler(int sig) {
|
||||||
|
should_exit = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
if (argc < 2) {
|
||||||
|
fprintf(stderr, "Usage: %s <daemon> [args...]\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forward termination signals to exit cleanly
|
||||||
|
signal(SIGTERM, signal_handler);
|
||||||
|
signal(SIGINT, signal_handler);
|
||||||
|
|
||||||
|
const char *daemon_path = argv[1];
|
||||||
|
char **daemon_argv = &argv[1];
|
||||||
|
|
||||||
|
while (!should_exit) {
|
||||||
|
pid_t pid = fork();
|
||||||
|
|
||||||
|
if (pid < 0) {
|
||||||
|
perror("fork failed");
|
||||||
|
usleep(100000); // 100ms backoff on fork failure
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pid == 0) {
|
||||||
|
// Child: become the daemon
|
||||||
|
prctl(PR_SET_PDEATHSIG, SIGKILL); // Die if parent dies
|
||||||
|
execv(daemon_path, daemon_argv);
|
||||||
|
perror("execv failed");
|
||||||
|
_exit(127);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parent: wait for child to exit
|
||||||
|
int status;
|
||||||
|
waitpid(pid, &status, 0);
|
||||||
|
|
||||||
|
if (should_exit) break;
|
||||||
|
|
||||||
|
// Instant restart - no delay
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -67,10 +67,13 @@ ui_print ""
|
|||||||
ui_print "- Extracting $ARCH libraries"
|
ui_print "- Extracting $ARCH libraries"
|
||||||
install_file "lib/$ABI_DIR/libTEESimulator.so" "$MODPATH"
|
install_file "lib/$ABI_DIR/libTEESimulator.so" "$MODPATH"
|
||||||
install_file "lib/$ABI_DIR/libinject.so" "$MODPATH"
|
install_file "lib/$ABI_DIR/libinject.so" "$MODPATH"
|
||||||
|
install_file "lib/$ABI_DIR/libsupervisor.so" "$MODPATH"
|
||||||
ui_print ""
|
ui_print ""
|
||||||
|
|
||||||
mv "$MODPATH/libinject.so" "$MODPATH/inject"
|
mv "$MODPATH/libinject.so" "$MODPATH/inject"
|
||||||
|
mv "$MODPATH/libsupervisor.so" "$MODPATH/supervisor"
|
||||||
chmod 755 "$MODPATH/inject"
|
chmod 755 "$MODPATH/inject"
|
||||||
|
chmod 755 "$MODPATH/supervisor"
|
||||||
|
|
||||||
# --- Configuration Files ---
|
# --- Configuration Files ---
|
||||||
if [ ! -d "$CONFIG_DIR" ]; then
|
if [ ! -d "$CONFIG_DIR" ]; then
|
||||||
|
|||||||
+2
-8
@@ -1,11 +1,5 @@
|
|||||||
DEBUG=false
|
|
||||||
|
|
||||||
MODDIR=${0%/*}
|
MODDIR=${0%/*}
|
||||||
|
|
||||||
cd $MODDIR
|
cd $MODDIR
|
||||||
|
|
||||||
while true; do
|
# Fork-based supervisor for instant restart
|
||||||
./daemon "$MODDIR" || exit 1
|
./supervisor ./daemon "$MODDIR" &
|
||||||
# ensure keystore initialized
|
|
||||||
sleep 2
|
|
||||||
done &
|
|
||||||
|
|||||||
Reference in New Issue
Block a user