Commit 50710c72 authored by topjohnwu's avatar topjohnwu

Cleanup magiskinit code

parent 2e299b38
This diff is collapsed.
...@@ -56,7 +56,7 @@ static int dump_manager(const char *path, mode_t mode) { ...@@ -56,7 +56,7 @@ static int dump_manager(const char *path, mode_t mode) {
class RecoveryInit : public BaseInit { class RecoveryInit : public BaseInit {
public: public:
RecoveryInit(char *argv[], cmdline *cmd) : BaseInit(argv, cmd) {} RecoveryInit(char *argv[], BootConfig *cmd) : BaseInit(argv, cmd) {}
void start() override { void start() override {
LOGD("Ramdisk is recovery, abort\n"); LOGD("Ramdisk is recovery, abort\n");
rename("/.backup/init", "/init"); rename("/.backup/init", "/init");
...@@ -141,25 +141,25 @@ int main(int argc, char *argv[]) { ...@@ -141,25 +141,25 @@ int main(int argc, char *argv[]) {
return 1; return 1;
BaseInit *init; BaseInit *init;
cmdline cmd{}; BootConfig config{};
if (argc > 1 && argv[1] == "selinux_setup"sv) { if (argc > 1 && argv[1] == "selinux_setup"sv) {
setup_klog(); setup_klog();
init = new SecondStageInit(argv); init = new SecondStageInit(argv);
} else { } else {
// This will also mount /sys and /proc // This will also mount /sys and /proc
load_kernel_info(&cmd); load_kernel_info(&config);
if (cmd.skip_initramfs) if (config.skip_initramfs)
init = new SARInit(argv, &cmd); init = new SARInit(argv, &config);
else if (cmd.force_normal_boot) else if (config.force_normal_boot)
init = new FirstStageInit(argv, &cmd); init = new FirstStageInit(argv, &config);
else if (access("/sbin/recovery", F_OK) == 0 || access("/system/bin/recovery", F_OK) == 0) else if (access("/sbin/recovery", F_OK) == 0 || access("/system/bin/recovery", F_OK) == 0)
init = new RecoveryInit(argv, &cmd); init = new RecoveryInit(argv, &config);
else if (check_two_stage()) else if (check_two_stage())
init = new FirstStageInit(argv, &cmd); init = new FirstStageInit(argv, &config);
else else
init = new RootFSInit(argv, &cmd); init = new RootFSInit(argv, &config);
} }
// Run the main routine // Run the main routine
......
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
#include "raw_data.hpp" #include "raw_data.hpp"
struct cmdline { using kv_pairs = std::vector<std::pair<std::string, std::string>>;
struct BootConfig {
bool skip_initramfs; bool skip_initramfs;
bool force_normal_boot; bool force_normal_boot;
bool rootwait; bool rootwait;
...@@ -11,6 +13,9 @@ struct cmdline { ...@@ -11,6 +13,9 @@ struct cmdline {
char fstab_suffix[32]; char fstab_suffix[32];
char hardware[32]; char hardware[32];
char hardware_plat[32]; char hardware_plat[32];
void set(const kv_pairs &);
void print();
}; };
struct fstab_entry { struct fstab_entry {
...@@ -32,7 +37,7 @@ struct fstab_entry { ...@@ -32,7 +37,7 @@ struct fstab_entry {
extern std::vector<std::string> mount_list; extern std::vector<std::string> mount_list;
bool unxz(int fd, const uint8_t *buf, size_t size); bool unxz(int fd, const uint8_t *buf, size_t size);
void load_kernel_info(cmdline *cmd); void load_kernel_info(BootConfig *config);
bool check_two_stage(); bool check_two_stage();
void setup_klog(); void setup_klog();
...@@ -42,13 +47,13 @@ void setup_klog(); ...@@ -42,13 +47,13 @@ void setup_klog();
class BaseInit { class BaseInit {
protected: protected:
cmdline *cmd = nullptr; BootConfig *config = nullptr;
char **argv = nullptr; char **argv = nullptr;
[[noreturn]] void exec_init(); [[noreturn]] void exec_init();
void read_dt_fstab(std::vector<fstab_entry> &fstab); void read_dt_fstab(std::vector<fstab_entry> &fstab);
public: public:
BaseInit(char *argv[], cmdline *cmd) : cmd(cmd), argv(argv) {} BaseInit(char *argv[], BootConfig *config) : config(config), argv(argv) {}
virtual ~BaseInit() = default; virtual ~BaseInit() = default;
virtual void start() = 0; virtual void start() = 0;
}; };
...@@ -56,7 +61,7 @@ public: ...@@ -56,7 +61,7 @@ public:
class MagiskInit : public BaseInit { class MagiskInit : public BaseInit {
protected: protected:
mmap_data self; mmap_data self;
mmap_data config; mmap_data magisk_config;
std::string custom_rules_dir; std::string custom_rules_dir;
void mount_with_dt(); void mount_with_dt();
...@@ -64,7 +69,7 @@ protected: ...@@ -64,7 +69,7 @@ protected:
void setup_tmp(const char *path); void setup_tmp(const char *path);
void mount_rules_dir(const char *dev_base, const char *mnt_base); void mount_rules_dir(const char *dev_base, const char *mnt_base);
public: public:
MagiskInit(char *argv[], cmdline *cmd) : BaseInit(argv, cmd) {} MagiskInit(char *argv[], BootConfig *cmd) : BaseInit(argv, cmd) {}
}; };
class SARBase : virtual public MagiskInit { class SARBase : virtual public MagiskInit {
...@@ -86,7 +91,7 @@ class FirstStageInit : public BaseInit { ...@@ -86,7 +91,7 @@ class FirstStageInit : public BaseInit {
private: private:
void prepare(); void prepare();
public: public:
FirstStageInit(char *argv[], cmdline *cmd) : BaseInit(argv, cmd) { FirstStageInit(char *argv[], BootConfig *cmd) : BaseInit(argv, cmd) {
LOGD("%s\n", __FUNCTION__); LOGD("%s\n", __FUNCTION__);
}; };
void start() override { void start() override {
...@@ -106,7 +111,7 @@ private: ...@@ -106,7 +111,7 @@ private:
void early_mount(); void early_mount();
void first_stage_prep(); void first_stage_prep();
public: public:
SARInit(char *argv[], cmdline *cmd) : MagiskInit(argv, cmd), is_two_stage(false) { SARInit(char *argv[], BootConfig *cmd) : MagiskInit(argv, cmd), is_two_stage(false) {
LOGD("%s\n", __FUNCTION__); LOGD("%s\n", __FUNCTION__);
}; };
void start() override { void start() override {
...@@ -136,7 +141,7 @@ private: ...@@ -136,7 +141,7 @@ private:
void early_mount(); void early_mount();
public: public:
RootFSInit(char *argv[], cmdline *cmd) : MagiskInit(argv, cmd) { RootFSInit(char *argv[], BootConfig *cmd) : MagiskInit(argv, cmd) {
LOGD("%s\n", __FUNCTION__); LOGD("%s\n", __FUNCTION__);
} }
void start() override { void start() override {
......
...@@ -105,12 +105,12 @@ if (access(#val, F_OK) == 0) {\ ...@@ -105,12 +105,12 @@ if (access(#val, F_OK) == 0) {\
} }
void BaseInit::read_dt_fstab(vector<fstab_entry> &fstab) { void BaseInit::read_dt_fstab(vector<fstab_entry> &fstab) {
if (access(cmd->dt_dir, F_OK) != 0) if (access(config->dt_dir, F_OK) != 0)
return; return;
char cwd[128]; char cwd[128];
getcwd(cwd, sizeof(cwd)); getcwd(cwd, sizeof(cwd));
chdir(cmd->dt_dir); chdir(config->dt_dir);
run_finally cd([&]{ chdir(cwd); }); run_finally cd([&]{ chdir(cwd); });
if (access("fstab", F_OK) != 0) if (access("fstab", F_OK) != 0)
...@@ -159,7 +159,7 @@ void MagiskInit::mount_with_dt() { ...@@ -159,7 +159,7 @@ void MagiskInit::mount_with_dt() {
if (is_lnk(entry.mnt_point.data())) if (is_lnk(entry.mnt_point.data()))
continue; continue;
// Derive partname from dev // Derive partname from dev
sprintf(blk_info.partname, "%s%s", basename(entry.dev.data()), cmd->slot); sprintf(blk_info.partname, "%s%s", basename(entry.dev.data()), config->slot);
setup_block(true); setup_block(true);
xmkdir(entry.mnt_point.data(), 0755); xmkdir(entry.mnt_point.data(), 0755);
xmount(blk_info.block_dev, entry.mnt_point.data(), entry.type.data(), MS_RDONLY, nullptr); xmount(blk_info.block_dev, entry.mnt_point.data(), entry.type.data(), MS_RDONLY, nullptr);
...@@ -300,7 +300,7 @@ void SARBase::backup_files() { ...@@ -300,7 +300,7 @@ void SARBase::backup_files() {
self = mmap_data::ro("/proc/self/exe"); self = mmap_data::ro("/proc/self/exe");
if (access("/.backup/.magisk", R_OK) == 0) if (access("/.backup/.magisk", R_OK) == 0)
config = mmap_data::ro("/.backup/.magisk"); magisk_config = mmap_data::ro("/.backup/.magisk");
} }
void SARBase::mount_system_root() { void SARBase::mount_system_root() {
...@@ -320,13 +320,13 @@ void SARBase::mount_system_root() { ...@@ -320,13 +320,13 @@ void SARBase::mount_system_root() {
if (dev >= 0) if (dev >= 0)
goto mount_root; goto mount_root;
sprintf(blk_info.partname, "system%s", cmd->slot); sprintf(blk_info.partname, "system%s", config->slot);
dev = setup_block(false); dev = setup_block(false);
if (dev >= 0) if (dev >= 0)
goto mount_root; goto mount_root;
// Poll forever if rootwait was given in cmdline // Poll forever if rootwait was given in cmdline
} while (cmd->rootwait); } while (config->rootwait);
// We don't really know what to do at this point... // We don't really know what to do at this point...
LOGE("Cannot find root partition, abort\n"); LOGE("Cannot find root partition, abort\n");
...@@ -396,7 +396,7 @@ void MagiskInit::setup_tmp(const char *path) { ...@@ -396,7 +396,7 @@ void MagiskInit::setup_tmp(const char *path) {
xmkdir(BLOCKDIR, 0); xmkdir(BLOCKDIR, 0);
int fd = xopen(INTLROOT "/config", O_WRONLY | O_CREAT, 0); int fd = xopen(INTLROOT "/config", O_WRONLY | O_CREAT, 0);
xwrite(fd, config.buf, config.sz); xwrite(fd, magisk_config.buf, magisk_config.sz);
close(fd); close(fd);
fd = xopen("magiskinit", O_WRONLY | O_CREAT, 0755); fd = xopen("magiskinit", O_WRONLY | O_CREAT, 0755);
xwrite(fd, self.buf, self.sz); xwrite(fd, self.buf, self.sz);
......
...@@ -372,7 +372,7 @@ void MagiskProxy::start() { ...@@ -372,7 +372,7 @@ void MagiskProxy::start() {
// Backup stuffs before removing them // Backup stuffs before removing them
self = mmap_data::ro("/sbin/magisk"); self = mmap_data::ro("/sbin/magisk");
config = mmap_data::ro("/.backup/.magisk"); magisk_config = mmap_data::ro("/.backup/.magisk");
auto magisk = mmap_data::ro("/sbin/magisk32.xz"); auto magisk = mmap_data::ro("/sbin/magisk32.xz");
auto magisk64 = mmap_data::ro("/sbin/magisk64.xz"); auto magisk64 = mmap_data::ro("/sbin/magisk64.xz");
char custom_rules_dir[64]; char custom_rules_dir[64];
......
...@@ -57,7 +57,7 @@ static void read_fstab_file(const char *fstab_file, vector<fstab_entry> &fstab) ...@@ -57,7 +57,7 @@ static void read_fstab_file(const char *fstab_file, vector<fstab_entry> &fstab)
extern uint32_t patch_verity(void *buf, uint32_t size); extern uint32_t patch_verity(void *buf, uint32_t size);
void FirstStageInit::prepare() { void FirstStageInit::prepare() {
if (cmd->force_normal_boot) { if (config->force_normal_boot) {
xmkdirs(FSR "/system/bin", 0755); xmkdirs(FSR "/system/bin", 0755);
rename("/init" /* magiskinit */, FSR "/system/bin/init"); rename("/init" /* magiskinit */, FSR "/system/bin/init");
symlink("/system/bin/init", FSR "/init"); symlink("/system/bin/init", FSR "/init");
...@@ -78,7 +78,7 @@ void FirstStageInit::prepare() { ...@@ -78,7 +78,7 @@ void FirstStageInit::prepare() {
fstab_file[0] = '\0'; fstab_file[0] = '\0';
// Find existing fstab file // Find existing fstab file
for (const char *suffix : { cmd->fstab_suffix, cmd->hardware, cmd->hardware_plat }) { for (const char *suffix : {config->fstab_suffix, config->hardware, config->hardware_plat }) {
if (suffix[0] == '\0') if (suffix[0] == '\0')
continue; continue;
for (const char *prefix: { "odm/etc/fstab", "vendor/etc/fstab", "fstab" }) { for (const char *prefix: { "odm/etc/fstab", "vendor/etc/fstab", "fstab" }) {
...@@ -111,9 +111,9 @@ exit_loop: ...@@ -111,9 +111,9 @@ exit_loop:
if (fstab_file[0] == '\0') { if (fstab_file[0] == '\0') {
const char *suffix = const char *suffix =
cmd->fstab_suffix[0] ? cmd->fstab_suffix : config->fstab_suffix[0] ? config->fstab_suffix :
(cmd->hardware[0] ? cmd->hardware : (config->hardware[0] ? config->hardware :
(cmd->hardware_plat[0] ? cmd->hardware_plat : nullptr)); (config->hardware_plat[0] ? config->hardware_plat : nullptr));
if (suffix == nullptr) { if (suffix == nullptr) {
LOGE("Cannot determine fstab suffix!\n"); LOGE("Cannot determine fstab suffix!\n");
return; return;
...@@ -241,7 +241,7 @@ void SARInit::first_stage_prep() { ...@@ -241,7 +241,7 @@ void SARInit::first_stage_prep() {
string tmp_dir = read_string(client); string tmp_dir = read_string(client);
chdir(tmp_dir.data()); chdir(tmp_dir.data());
int cfg = xopen(INTLROOT "/config", O_WRONLY | O_CREAT, 0); int cfg = xopen(INTLROOT "/config", O_WRONLY | O_CREAT, 0);
xwrite(cfg, config.buf, config.sz); xwrite(cfg, magisk_config.buf, magisk_config.sz);
close(cfg); close(cfg);
restore_folder(ROOTOVL, overlays); restore_folder(ROOTOVL, overlays);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment