mirror of
https://github.com/topjohnwu/Magisk
synced 2024-11-16 00:13:57 +01:00
Install stub APK when needed
This commit is contained in:
parent
970a2e87b3
commit
d7d76f54cc
2
app
2
app
@ -1 +1 @@
|
|||||||
Subproject commit 499a157946f0063aea0795b204a1f2858591d8d3
|
Subproject commit e6c1dd532d2910285d503f271183839446495360
|
@ -16,6 +16,7 @@
|
|||||||
#include <selinux/selinux.h>
|
#include <selinux/selinux.h>
|
||||||
|
|
||||||
#include "magisk.h"
|
#include "magisk.h"
|
||||||
|
#include "db.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "daemon.h"
|
#include "daemon.h"
|
||||||
#include "resetprop.h"
|
#include "resetprop.h"
|
||||||
@ -454,6 +455,30 @@ static int prepare_img() {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void install_apk(const char *apk) {
|
||||||
|
setfilecon(apk, "u:object_r:"SEPOL_FILE_DOMAIN":s0");
|
||||||
|
while (1) {
|
||||||
|
sleep(5);
|
||||||
|
LOGD("apk_install: attempting to install APK");
|
||||||
|
int apk_res = -1, pid;
|
||||||
|
pid = exec_command(1, &apk_res, NULL, "/system/bin/pm", "install", "-r", apk, NULL);
|
||||||
|
if (pid != -1) {
|
||||||
|
int err = 0;
|
||||||
|
while (fdgets(buf, PATH_MAX, apk_res) > 0) {
|
||||||
|
LOGD("apk_install: %s", buf);
|
||||||
|
err |= strstr(buf, "Error:") != NULL;
|
||||||
|
}
|
||||||
|
waitpid(pid, NULL, 0);
|
||||||
|
close(apk_res);
|
||||||
|
// Keep trying until pm is started
|
||||||
|
if (err)
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unlink(apk);
|
||||||
|
}
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
* Entry points *
|
* Entry points *
|
||||||
****************/
|
****************/
|
||||||
@ -806,31 +831,21 @@ void late_start(int client) {
|
|||||||
exec_module_script("service");
|
exec_module_script("service");
|
||||||
|
|
||||||
core_only:
|
core_only:
|
||||||
// Install Magisk Manager if exists
|
|
||||||
if (access(MANAGERAPK, F_OK) == 0) {
|
if (access(MANAGERAPK, F_OK) == 0) {
|
||||||
|
// Install Magisk Manager if exists
|
||||||
rename(MANAGERAPK, "/data/magisk.apk");
|
rename(MANAGERAPK, "/data/magisk.apk");
|
||||||
setfilecon("/data/magisk.apk", "u:object_r:"SEPOL_FILE_DOMAIN":s0");
|
install_apk("/data/magisk.apk");
|
||||||
while (1) {
|
} else {
|
||||||
sleep(5);
|
// Check whether we have a valid manager installed
|
||||||
LOGD("apk_install: attempting to install APK");
|
sqlite3 *db = get_magiskdb();
|
||||||
int apk_res = -1, pid;
|
struct db_strings str;
|
||||||
pid = exec_command(1, &apk_res, NULL,
|
INIT_DB_STRINGS(&str);
|
||||||
"/system/bin/pm", "install", "-r", "/data/magisk.apk", NULL);
|
get_db_strings(db, SU_MANAGER, &str);
|
||||||
if (pid != -1) {
|
if (validate_manager(str.s[SU_MANAGER], 0, NULL)) {
|
||||||
int err = 0;
|
// There is no manager installed, install the stub
|
||||||
while (fdgets(buf, PATH_MAX, apk_res) > 0) {
|
exec_command_sync("/sbin/magiskinit", "-x", "manager", "/data/magisk.apk", NULL);
|
||||||
LOGD("apk_install: %s", buf);
|
install_apk("/data/magisk.apk");
|
||||||
err |= strstr(buf, "Error:") != NULL;
|
|
||||||
}
|
}
|
||||||
waitpid(pid, NULL, 0);
|
|
||||||
close(apk_res);
|
|
||||||
// Keep trying until pm is started
|
|
||||||
if (err)
|
|
||||||
continue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
unlink("/data/magisk.apk");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// All boot stage done, cleanup everything
|
// All boot stage done, cleanup everything
|
||||||
|
@ -23,7 +23,7 @@ static int policy_cb(void *v, int col_num, char **data, char **col_name) {
|
|||||||
else if (strcmp(col_name[i], "notification") == 0)
|
else if (strcmp(col_name[i], "notification") == 0)
|
||||||
su->notify = atoi(data[i]);
|
su->notify = atoi(data[i]);
|
||||||
}
|
}
|
||||||
LOGD("su_db: query policy=[%d] log=[%d] notify=[%d]\n", su->policy, su->log, su->notify);
|
LOGD("magiskdb: query policy=[%d] log=[%d] notify=[%d]\n", su->policy, su->log, su->notify);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ static int settings_cb(void *v, int col_num, char **data, char **col_name) {
|
|||||||
}
|
}
|
||||||
if (key >= 0) {
|
if (key >= 0) {
|
||||||
dbs->v[key] = value;
|
dbs->v[key] = value;
|
||||||
LOGD("su_db: query %s=[%d]\n", DB_SETTING_KEYS[key], value);
|
LOGD("magiskdb: query %s=[%d]\n", DB_SETTING_KEYS[key], value);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -63,7 +63,7 @@ static int strings_cb(void *v, int col_num, char **data, char **col_name) {
|
|||||||
}
|
}
|
||||||
if (key >= 0) {
|
if (key >= 0) {
|
||||||
strcpy(dbs->s[key], value);
|
strcpy(dbs->s[key], value);
|
||||||
LOGD("su_db: query %s=[%s]\n", DB_STRING_KEYS[key], value);
|
LOGD("magiskdb: query %s=[%s]\n", DB_STRING_KEYS[key], value);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -83,6 +83,8 @@ sqlite3 *get_magiskdb() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int get_db_settings(sqlite3 *db, int key, struct db_settings *dbs) {
|
int get_db_settings(sqlite3 *db, int key, struct db_settings *dbs) {
|
||||||
|
if (db == NULL)
|
||||||
|
return 1;
|
||||||
char *err;
|
char *err;
|
||||||
if (key > 0) {
|
if (key > 0) {
|
||||||
char query[128];
|
char query[128];
|
||||||
@ -99,6 +101,8 @@ int get_db_settings(sqlite3 *db, int key, struct db_settings *dbs) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int get_db_strings(sqlite3 *db, int key, struct db_strings *str) {
|
int get_db_strings(sqlite3 *db, int key, struct db_strings *str) {
|
||||||
|
if (db == NULL)
|
||||||
|
return 1;
|
||||||
char *err;
|
char *err;
|
||||||
if (key > 0) {
|
if (key > 0) {
|
||||||
char query[128];
|
char query[128];
|
||||||
@ -115,6 +119,8 @@ int get_db_strings(sqlite3 *db, int key, struct db_strings *str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int get_uid_policy(sqlite3 *db, int uid, struct su_access *su) {
|
int get_uid_policy(sqlite3 *db, int uid, struct su_access *su) {
|
||||||
|
if (db == NULL)
|
||||||
|
return 1;
|
||||||
char query[256], *err;
|
char query[256], *err;
|
||||||
sprintf(query, "SELECT policy, logging, notification FROM policies "
|
sprintf(query, "SELECT policy, logging, notification FROM policies "
|
||||||
"WHERE uid=%d AND (until=0 OR until>%li)", uid, time(NULL));
|
"WHERE uid=%d AND (until=0 OR until>%li)", uid, time(NULL));
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define DB_H
|
#define DB_H
|
||||||
|
|
||||||
#include <sqlite3.h>
|
#include <sqlite3.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
/***************
|
/***************
|
||||||
* DB Settings *
|
* DB Settings *
|
||||||
|
Loading…
Reference in New Issue
Block a user