Copy sepolicy rules to persist every boot
This commit is contained in:
parent
02761f5f35
commit
3beffd84d6
@ -413,10 +413,9 @@ static bool magisk_env() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void prepare_modules() {
|
static void prepare_modules() {
|
||||||
DIR *dir;
|
// Upgrade modules
|
||||||
struct dirent *entry;
|
if (auto dir = xopen_dir(MODULEUPGRADE); dir) {
|
||||||
if ((dir = opendir(MODULEUPGRADE))) {
|
for (dirent *entry; (entry = xreaddir(dir.get()));) {
|
||||||
while ((entry = xreaddir(dir))) {
|
|
||||||
if (entry->d_type == DT_DIR) {
|
if (entry->d_type == DT_DIR) {
|
||||||
if (entry->d_name == "."sv || entry->d_name == ".."sv)
|
if (entry->d_name == "."sv || entry->d_name == ".."sv)
|
||||||
continue;
|
continue;
|
||||||
@ -429,7 +428,6 @@ static void prepare_modules() {
|
|||||||
rename(buf2, buf);
|
rename(buf2, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closedir(dir);
|
|
||||||
rm_rf(MODULEUPGRADE);
|
rm_rf(MODULEUPGRADE);
|
||||||
}
|
}
|
||||||
bind_mount(MIRRDIR MODULEROOT, MODULEMNT, false);
|
bind_mount(MIRRDIR MODULEROOT, MODULEMNT, false);
|
||||||
@ -499,36 +497,47 @@ static bool load_modules(node_entry *root) {
|
|||||||
|
|
||||||
bool has_modules = false;
|
bool has_modules = false;
|
||||||
for (const auto &m : module_list) {
|
for (const auto &m : module_list) {
|
||||||
const auto module = m.c_str();
|
const auto module = m.data();
|
||||||
|
char *name = buf + snprintf(buf, sizeof(buf), MODULEROOT "/%s/", module);
|
||||||
|
|
||||||
// Read props
|
// Read props
|
||||||
snprintf(buf, PATH_MAX, "%s/%s/system.prop", MODULEROOT, module);
|
strcpy(name, "system.prop");
|
||||||
if (access(buf, F_OK) == 0) {
|
if (access(buf, F_OK) == 0) {
|
||||||
LOGI("%s: loading [system.prop]\n", module);
|
LOGI("%s: loading [system.prop]\n", module);
|
||||||
load_prop_file(buf, false);
|
load_prop_file(buf, false);
|
||||||
}
|
}
|
||||||
|
// Copy sepolicy rules
|
||||||
|
strcpy(name, "sepolicy.rule");
|
||||||
|
if (access(MIRRDIR "/persist", F_OK) == 0 && access(buf, F_OK) == 0) {
|
||||||
|
char *p = buf2 + snprintf(buf2, sizeof(buf2), MIRRDIR "/persist/magisk/%s", module);
|
||||||
|
xmkdirs(buf2, 0755);
|
||||||
|
strcpy(p, "/sepolicy.rule");
|
||||||
|
cp_afc(buf, buf2);
|
||||||
|
}
|
||||||
|
|
||||||
// Check whether skip mounting
|
// Check whether skip mounting
|
||||||
snprintf(buf, PATH_MAX, "%s/%s/skip_mount", MODULEROOT, module);
|
strcpy(name, "skip_mount");
|
||||||
if (access(buf, F_OK) == 0)
|
if (access(buf, F_OK) == 0)
|
||||||
continue;
|
continue;
|
||||||
// Double check whether the system folder exists
|
// Double check whether the system folder exists
|
||||||
snprintf(buf, PATH_MAX, "%s/%s/system", MODULEROOT, module);
|
strcpy(name, "system");
|
||||||
if (access(buf, F_OK) == -1)
|
if (access(buf, F_OK) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Construct structure
|
// Construct structure
|
||||||
has_modules = true;
|
has_modules = true;
|
||||||
LOGI("%s: constructing magic mount structure\n", module);
|
LOGI("%s: constructing magic mount structure\n", module);
|
||||||
// If /system/vendor exists in module, create a link outside
|
// If /system/vendor exists in module, create a link outside
|
||||||
snprintf(buf, PATH_MAX, "%s/%s/system/vendor", MODULEROOT, module);
|
strcpy(name, "system/vendor");
|
||||||
if (node_entry::vendor_root && access(buf, F_OK) == 0) {
|
if (node_entry::vendor_root && access(buf, F_OK) == 0) {
|
||||||
snprintf(buf2, PATH_MAX, "%s/%s/vendor", MODULEROOT, module);
|
snprintf(buf2, sizeof(buf2), "%s/%s/vendor", MODULEROOT, module);
|
||||||
unlink(buf2);
|
unlink(buf2);
|
||||||
xsymlink("./system/vendor", buf2);
|
xsymlink("./system/vendor", buf2);
|
||||||
}
|
}
|
||||||
// If /system/product exists in module, create a link outside
|
// If /system/product exists in module, create a link outside
|
||||||
snprintf(buf, PATH_MAX, "%s/%s/system/product", MODULEROOT, module);
|
strcpy(name, "system/product");
|
||||||
if (node_entry::product_root && access(buf, F_OK) == 0) {
|
if (node_entry::product_root && access(buf, F_OK) == 0) {
|
||||||
snprintf(buf2, PATH_MAX, "%s/%s/product", MODULEROOT, module);
|
snprintf(buf2, sizeof(buf2), "%s/%s/product", MODULEROOT, module);
|
||||||
unlink(buf2);
|
unlink(buf2);
|
||||||
xsymlink("./system/product", buf2);
|
xsymlink("./system/product", buf2);
|
||||||
}
|
}
|
||||||
@ -651,22 +660,6 @@ void post_fs_data(int client) {
|
|||||||
unblock_boot_process();
|
unblock_boot_process();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Increment boot count
|
|
||||||
int boot_count = 0;
|
|
||||||
FILE *cf = fopen(BOOTCOUNT, "r");
|
|
||||||
if (cf) {
|
|
||||||
fscanf(cf, "%d", &boot_count);
|
|
||||||
fclose(cf);
|
|
||||||
}
|
|
||||||
boot_count++;
|
|
||||||
if (boot_count > 2)
|
|
||||||
creat(DISABLEFILE, 0644);
|
|
||||||
cf = xfopen(BOOTCOUNT, "w");
|
|
||||||
fprintf(cf, "%d", boot_count);
|
|
||||||
fclose(cf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!magisk_env()) {
|
if (!magisk_env()) {
|
||||||
LOGE("* Magisk environment setup incomplete, abort\n");
|
LOGE("* Magisk environment setup incomplete, abort\n");
|
||||||
unblock_boot_process();
|
unblock_boot_process();
|
||||||
@ -747,7 +740,6 @@ void late_start(int client) {
|
|||||||
|
|
||||||
auto_start_magiskhide();
|
auto_start_magiskhide();
|
||||||
|
|
||||||
// Run scripts after full patch, most reliable way to run scripts
|
|
||||||
LOGI("* Running service.d scripts\n");
|
LOGI("* Running service.d scripts\n");
|
||||||
exec_common_script("service");
|
exec_common_script("service");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user