Merge remote-tracking branch 'john/master' into feature/redesign
This commit is contained in:
commit
78d7c45be3
@ -28,7 +28,7 @@ object SuHandler : ProviderCallHandler {
|
||||
|
||||
override fun call(context: Context, method: String, arg: String?, extras: Bundle?): Bundle? {
|
||||
invoke(context.wrap(), method, extras)
|
||||
return null
|
||||
return Bundle.EMPTY
|
||||
}
|
||||
|
||||
operator fun invoke(context: Context, action: String?, data: Bundle?) {
|
||||
|
@ -8,23 +8,26 @@
|
||||
<string name="log">Registro</string>
|
||||
<string name="settings">Configurações</string>
|
||||
<string name="install">Instalar</string>
|
||||
<string name="unsupport_magisk_title">Versão não suportada do Magisk</string>
|
||||
<string name="unsupport_magisk_msg">Esta versão do Magisk Manager não suporta versões do Magisk menores que %1$s.\n\nO aplicativo se comportará como se nenhum Magisk estivesse instalado, por favor, atualize o Magisk o mais rápido possível.</string>
|
||||
|
||||
<!--Status Fragment-->
|
||||
<string name="magisk_version_error">Magisk não está instalado</string>
|
||||
<string name="checking_for_updates">Verificando por atualizações…</string>
|
||||
<string name="invalid_update_channel">Canal de Atualização Inválido</string>
|
||||
<string name="safetyNet_check_text">Verificar SafetyNet</string>
|
||||
<string name="checking_safetyNet_status">Verificando status de SafetyNet…</string>
|
||||
<string name="safetyNet_check_success">SafetyNet Verificado Com Sucesso</string>
|
||||
<string name="safetyNet_api_error">Erro de SafetyNet API</string>
|
||||
<string name="checking_for_updates">Procurando por atualizações…</string>
|
||||
<string name="invalid_update_channel">Canal de Atualizações Inválido</string>
|
||||
<string name="safetyNet_check_text">Toque para iniciar a verificação do SafetyNet</string>
|
||||
<string name="checking_safetyNet_status">Verificando o status do SafetyNet…</string>
|
||||
<string name="safetyNet_check_success">SafetyNet verificado com sucesso</string>
|
||||
<string name="safetyNet_api_error">Erro na API do SafetyNet</string>
|
||||
<string name="safetyNet_res_invalid">A resposta é inválida</string>
|
||||
<string name="magisk_up_to_date">Magisk atualizado</string>
|
||||
<string name="manager_up_to_date">Gerenciador Magisk atualizado</string>
|
||||
<string name="magisk_up_to_date">Magisk está atualizado</string>
|
||||
<string name="manager_up_to_date">Magisk Manager está atualizado</string>
|
||||
<string name="advanced_settings_title">Configurações Avançadas</string>
|
||||
<string name="keep_force_encryption">Manter encriptação forçada</string>
|
||||
<string name="keep_dm_verity">Manter AVB 2.0/dm-verity</string>
|
||||
<string name="recovery_mode">Modo Recuperação</string>
|
||||
<string name="current_installed">Instalado: %1$s</string>
|
||||
<string name="latest_version">Último: %1$s</string>
|
||||
<string name="latest_version">Mais recente: %1$s</string>
|
||||
<string name="uninstall">Desinstalar</string>
|
||||
<string name="uninstall_magisk_title">Desinstalar o Magisk</string>
|
||||
<string name="uninstall_magisk_msg">Todos os módulos serão desativados/removidos. O acesso Root será removido, e seus dados provavelmente serão criptografados se já não estiverem.</string>
|
||||
@ -62,45 +65,70 @@
|
||||
<!--About Activity-->
|
||||
<string name="app_changelog">Registro de mudanças</string>
|
||||
|
||||
<!-- System Components, Notifications -->
|
||||
<string name="update_channel">Atualizações do Magisk</string>
|
||||
<string name="progress_channel">Notificações de Progresso</string>
|
||||
<string name="download_complete">Download completo</string>
|
||||
<string name="download_file_error">Erro ao baixar o aquivo</string>
|
||||
<string name="download_open_parent">Mostrar na pasta</string>
|
||||
<string name="download_open_self">Mostrar arquivo</string>
|
||||
<string name="magisk_update_title">Atualização do Magisk Disponível!</string>
|
||||
<string name="manager_update_title">Atualização do Magisk Manager Disponível!</string>
|
||||
|
||||
<!-- Installation -->
|
||||
<string name="manager_download_install">Toque para baixar e instalar</string>
|
||||
<string name="download_zip_only">Apenas baixar o zip</string>
|
||||
<string name="direct_install">Instalação direta (Recomendado)</string>
|
||||
<string name="install_inactive_slot">Instalar no Slot Inativo (Após o OTA)</string>
|
||||
<string name="install_inactive_slot_msg">Seu dispositivo será FORÇADO a inicializar no slot inativo atual após uma reinicialização!\nSó use esta opção após a conclusão do OTA.\nContinuar?</string>
|
||||
<string name="select_method">Selecione o Método</string>
|
||||
<string name="setup_title">Configuração Adicional</string>
|
||||
<string name="select_patch_file">Selecionar e Patchear um Arquivo</string>
|
||||
<string name="patch_file_msg">Selecione uma imagem raw (*.img) ou um arquivo tar do ODIN (*.tar)</string>
|
||||
<string name="reboot_delay_toast">Reiniciando em 5 segundos…</string>
|
||||
|
||||
<!--Toasts, Dialogs-->
|
||||
<string name="repo_install_title">Instalar %1$s</string>
|
||||
<string name="repo_install_msg">Instalar %1$s agora?</string>
|
||||
<string name="repo_install_msg">Você quer instalar %1$s agora?</string>
|
||||
<string name="download">Baixar</string>
|
||||
<string name="reboot">Reiniciar</string>
|
||||
<string name="magisk_update_title">Nova Atualização do Magisk Disponível!</string>
|
||||
<string name="settings_reboot_toast">Reinicie para aplicar as configurações</string>
|
||||
<string name="settings_reboot_toast">Reinicie para aplicar as mudanças</string>
|
||||
<string name="release_notes">Notas de lançamento</string>
|
||||
<string name="repo_cache_cleared">Cache de repositório limpo</string>
|
||||
<string name="manager_update_title">Nova Atualização do Magisk Manager Disponível!</string>
|
||||
<string name="manager_download_install">Toque para baixar e instalar</string>
|
||||
<string name="dtbo_patched_title">DTBO foi emendado!</string>
|
||||
<string name="dtbo_patched_reboot">Magisk Manager emendou dtbo.img, reinicie</string>
|
||||
<string name="update_channel">Atualizações do Magisk</string>
|
||||
<string name="flashing">Flasheando</string>
|
||||
<string name="hide_manager_title">Ocultando Magisk Manager…</string>
|
||||
<string name="hide_manager_fail_toast">Falha ao ocultar Magisk Manager…</string>
|
||||
<string name="download_zip_only">Baixar Zip Apenas</string>
|
||||
<string name="direct_install">Instalação Direta (Recomendado)</string>
|
||||
<string name="install_inactive_slot">Instalar no Slot Inativo (Após OTA)</string>
|
||||
<string name="select_method">Selecionar Método</string>
|
||||
<string name="repo_cache_cleared">Cache do repositório limpo</string>
|
||||
<string name="dtbo_patched_title">DTBO foi patcheado!</string>
|
||||
<string name="dtbo_patched_reboot">Magisk Manager foi patcheado para o dtbo.img. Por favor, reinicie.</string>
|
||||
<string name="flashing">Flasheando…</string>
|
||||
<string name="done">Pronto!</string>
|
||||
<string name="failure">Falha</string>
|
||||
<string name="hide_manager_title">Ocultando o Magisk Manager…</string>
|
||||
<string name="hide_manager_fail_toast">Falha ao ocultar o Magisk Manager.</string>
|
||||
<string name="open_link_failed_toast">Nenhum aplicativo encontrado para abrir o link</string>
|
||||
<string name="warning">Aviso</string>
|
||||
<string name="complete_uninstall">Completar Desinstalação</string>
|
||||
<string name="restore_img">Restaurar Imagens</string>
|
||||
<string name="restore_done">Restauração concluída!</string>
|
||||
<string name="restore_fail">Backup original não existe!</string>
|
||||
<string name="restore_img_msg">Restaurando…</string>
|
||||
<string name="restore_done">Restauração completa!</string>
|
||||
<string name="restore_fail">Backup stock não existe!</string>
|
||||
<string name="proprietary_title">Baixar Código Proprietário</string>
|
||||
<string name="proprietary_notice">Magisk Manager é FOSS, que não contém o código proprietário da API SafetyNet da Google.\n\nPermitir ao Magisk Manager baixar uma extensão (que contém a GoogleApiClient) para a verificação SafetyNet?</string>
|
||||
<string name="download_file_error">Erro ao baixar arquivo</string>
|
||||
<string name="proprietary_notice">Magisk Manager é um software livre e de código aberto (FOSS) e não contém código proprietário da API SafetyNet do Google.\n\Permitir o Magisk Manager baixar uma extensão (contém GoogleApiClient) para verificações do SafetyNet?</string>
|
||||
<string name="setup_fail">Configuração falhou</string>
|
||||
<string name="env_fix_title">Requer configuração adicional</string>
|
||||
<string name="env_fix_msg">Seu dispositivo precisa de uma configuração adicional para que o Magisk funcione corretamente. Ele fará o download do zip de instalação do Magisk. Deseja continuar agora?</string>
|
||||
<string name="setup_msg">Executando a configuração do ambiente…</string>
|
||||
<string name="authenticate">Autenticar</string>
|
||||
|
||||
<!--Settings Activity -->
|
||||
<string name="settings_general_category">Geral</string>
|
||||
<string name="settings_dark_theme_title">Tema Escuro</string>
|
||||
<string name="settings_dark_theme_summary">Ativar tema escuro</string>
|
||||
<string name="settings_clear_cache_title">Limpar Cache de Repositório</string>
|
||||
<string name="settings_clear_cache_summary">Limpar as informações no cache para repositórios onlines, força o app a reatualizar online</string>
|
||||
<string name="settings_dark_theme_summary">Ativar o tema escuro</string>
|
||||
<string name="settings_download_path_title">Caminho de download</string>
|
||||
<string name="settings_download_path_message">Arquivos serão salvos em %1$s</string>
|
||||
<string name="settings_clear_cache_title">Limpar cache do repositório</string>
|
||||
<string name="settings_clear_cache_summary">Limpar as informações em cache para repositórios online. Isso força o aplicativo a atualizar online</string>
|
||||
<string name="settings_hide_manager_title">Ocultar Magisk Manager</string>
|
||||
<string name="settings_hide_manager_summary">Reempacotar Magisk Manager com nome de pacote aleatório</string>
|
||||
<string name="settings_hide_manager_summary">Reempacotar o Magisk Manager com nome de pacote e nome do app aleatórios</string>
|
||||
<string name="settings_restore_manager_title">Restaurar Magisk Manager</string>
|
||||
<string name="settings_restore_manager_summary">Restaurar Magisk Manager com pacote original</string>
|
||||
<string name="settings_restore_manager_summary">Restaurar o Magisk Manager com o nome de pacote e nome do app originais</string>
|
||||
<string name="language">Idioma</string>
|
||||
<string name="system_default">(Padrão do Sistema)</string>
|
||||
<string name="settings_update">Configurações de Atualizações</string>
|
||||
@ -117,9 +145,13 @@
|
||||
<string name="settings_hosts_title">Hosts sem sistema</string>
|
||||
<string name="settings_hosts_summary">Suporte de hosts sem sistema para apps de Adblock</string>
|
||||
|
||||
<string name="settings_su_app_adb">Apps e ADB</string>
|
||||
<string name="settings_su_app">Apps apenas</string>
|
||||
<string name="settings_su_adb">ADB apenas</string>
|
||||
<string name="settings_app_name">Digite o nome do app desejado</string>
|
||||
<string name="settings_app_name_hint">Novo nome</string>
|
||||
<string name="settings_app_name_helper">O aplicativo será reempacotado para esse nome</string>
|
||||
<string name="settings_app_name_error">Formato inválido</string>
|
||||
<string name="settings_su_app_adb">Aplicativos e ADB</string>
|
||||
<string name="settings_su_app">Somente aplicativos</string>
|
||||
<string name="settings_su_adb">Somente ADB</string>
|
||||
<string name="settings_su_disable">Desativado</string>
|
||||
<string name="settings_su_request_10">10 segundos</string>
|
||||
<string name="settings_su_request_15">15 segundos</string>
|
||||
@ -132,8 +164,11 @@
|
||||
<string name="request_timeout">Tempo Limite de Solicitação</string>
|
||||
<string name="superuser_notification">Notificação de Superusuário</string>
|
||||
<string name="request_timeout_summary">%1$d segundos</string>
|
||||
<string name="settings_su_reauth_title">Reautenticar após atualizar</string>
|
||||
<string name="settings_su_reauth_summary">Reautenticar permissões de superusuário após um app atualizar</string>
|
||||
<string name="settings_su_reauth_title">Reautenticar após uma atualização</string>
|
||||
<string name="settings_su_reauth_summary">Reautenticar permissões de superusuário após a atualização de um aplicativo</string>
|
||||
<string name="settings_su_biometric_title">Habilitar autenticação biométrica</string>
|
||||
<string name="settings_su_biometric_summary">Usar autenticação biométrica para permitir solicitações de superusuário</string>
|
||||
<string name="no_biometric">Dispositivo não suportado ou nenhuma configuração biométrica está ativada</string>
|
||||
|
||||
<string name="multiuser_mode">Modo de Multiusuário</string>
|
||||
<string name="settings_owner_only">Proprietário do Dispositivo Apenas</string>
|
||||
@ -143,18 +178,19 @@
|
||||
<string name="owner_manage_summary">Apenas proprietário pode gerenciar acesso root e receber expedições de solicitações</string>
|
||||
<string name="user_indepenent_summary">Cada usuário tem suas próprias regras root separadas</string>
|
||||
|
||||
<string name="mount_namespace_mode">Montar Modo de Espaço de Nome</string>
|
||||
<string name="settings_ns_global">Espaço de Nome Global</string>
|
||||
<string name="settings_ns_requester">Espaço de Nome Herdado</string>
|
||||
<string name="settings_ns_isolate">Espaço de Nome Isolado</string>
|
||||
<string name="global_summary">Todas as sessões root usam montagem de espaço de nome global</string>
|
||||
<string name="requester_summary">As sessões root herdarão espaço de nome de seu solicitante</string>
|
||||
<string name="isolate_summary">Cada sessão root terá seu próprio espaço de nome isolado</string>
|
||||
<string name="mount_namespace_mode">Modo de montar o namespace</string>
|
||||
<string name="settings_ns_global">Namespace Global</string>
|
||||
<string name="settings_ns_requester">Herdar Namespace</string>
|
||||
<string name="settings_ns_isolate">Namespace isolado</string>
|
||||
<string name="global_summary">Todas as sessões de root usam a montagem de namespace global</string>
|
||||
<string name="requester_summary">As sessões de root herdarão o namespace do seu solicitante</string>
|
||||
<string name="isolate_summary">Cada sessão root terá seu próprio namespace isolado</string>
|
||||
<string name="settings_download_path_error">Erro ao criar pasta. Ele deve estar acessível no diretório raiz do armazenamento e não deve ser um arquivo.</string>
|
||||
|
||||
<!--Superuser-->
|
||||
<string name="su_request_title">Solicitação de Superusuário</string>
|
||||
<string name="deny">Negar</string>
|
||||
<string name="prompt">Solicitar</string>
|
||||
<string name="prompt">Perguntar</string>
|
||||
<string name="grant">Conceder</string>
|
||||
<string name="su_warning">Concede acesso total ao seu dispositivo.\nNegue se você não tem certeza!</string>
|
||||
<string name="forever">Sempre</string>
|
||||
|
@ -100,6 +100,18 @@ static void *request_handler(void *args) {
|
||||
|
||||
static void main_daemon() {
|
||||
android_logging();
|
||||
|
||||
int fd = xopen("/dev/null", O_WRONLY);
|
||||
xdup2(fd, STDOUT_FILENO);
|
||||
xdup2(fd, STDERR_FILENO);
|
||||
if (fd > STDERR_FILENO)
|
||||
close(fd);
|
||||
fd = xopen("/dev/zero", O_RDONLY);
|
||||
xdup2(fd, STDIN_FILENO);
|
||||
if (fd > STDERR_FILENO)
|
||||
close(fd);
|
||||
close(fd);
|
||||
|
||||
setsid();
|
||||
setcon("u:r:" SEPOL_PROC_DOMAIN ":s0");
|
||||
restore_rootcon();
|
||||
@ -112,14 +124,6 @@ static void main_daemon() {
|
||||
}, true);
|
||||
}
|
||||
|
||||
int fd = xopen("/dev/null", O_RDWR | O_CLOEXEC);
|
||||
xdup2(fd, STDOUT_FILENO);
|
||||
xdup2(fd, STDERR_FILENO);
|
||||
close(fd);
|
||||
fd = xopen("/dev/zero", O_RDWR | O_CLOEXEC);
|
||||
xdup2(fd, STDIN_FILENO);
|
||||
close(fd);
|
||||
|
||||
LOGI(SHOW_VER(Magisk) " daemon started\n");
|
||||
|
||||
// Get server stat
|
||||
|
@ -138,7 +138,7 @@ static char *open_and_init_db(sqlite3 *&db) {
|
||||
upgrade = true;
|
||||
}
|
||||
if (ver < 10) {
|
||||
sqlite3_exec(db, "DROP TABLE logs", nullptr, nullptr, &err);
|
||||
sqlite3_exec(db, "DROP TABLE IF EXISTS logs", nullptr, nullptr, &err);
|
||||
err_ret(err);
|
||||
ver = 10;
|
||||
upgrade = true;
|
||||
|
@ -38,23 +38,22 @@ static int vprintk(const char *fmt, va_list ap) {
|
||||
}
|
||||
void setup_klog() {
|
||||
// Shut down first 3 fds
|
||||
int null;
|
||||
int fd;
|
||||
if (access("/dev/null", W_OK) == 0) {
|
||||
null = xopen("/dev/null", O_RDWR | O_CLOEXEC);
|
||||
fd = xopen("/dev/null", O_RDWR | O_CLOEXEC);
|
||||
} else {
|
||||
mknod("/null", S_IFCHR | 0666, makedev(1, 3));
|
||||
null = xopen("/null", O_RDWR | O_CLOEXEC);
|
||||
fd = xopen("/null", O_RDWR | O_CLOEXEC);
|
||||
unlink("/null");
|
||||
}
|
||||
xdup3(null, STDIN_FILENO, O_CLOEXEC);
|
||||
xdup3(null, STDOUT_FILENO, O_CLOEXEC);
|
||||
xdup3(null, STDERR_FILENO, O_CLOEXEC);
|
||||
if (null > STDERR_FILENO)
|
||||
close(null);
|
||||
xdup3(fd, STDIN_FILENO, O_CLOEXEC);
|
||||
xdup3(fd, STDOUT_FILENO, O_CLOEXEC);
|
||||
xdup3(fd, STDERR_FILENO, O_CLOEXEC);
|
||||
if (fd > STDERR_FILENO)
|
||||
close(fd);
|
||||
|
||||
int fd;
|
||||
if (access("/proc/kmsg", W_OK) == 0) {
|
||||
fd = xopen("/proc/kmsg", O_WRONLY | O_CLOEXEC);
|
||||
if (access("/dev/kmsg", W_OK) == 0) {
|
||||
fd = xopen("/dev/kmsg", O_WRONLY | O_CLOEXEC);
|
||||
} else {
|
||||
mknod("/kmsg", S_IFCHR | 0666, makedev(1, 11));
|
||||
fd = xopen("/kmsg", O_WRONLY | O_CLOEXEC);
|
||||
|
@ -22,15 +22,16 @@ uint32_t dyn_img_hdr::j32 = 0;
|
||||
uint64_t dyn_img_hdr::j64 = 0;
|
||||
|
||||
static void decompress(format_t type, int fd, const void *in, size_t size) {
|
||||
unique_ptr<stream> ptr(get_decoder(type, open_stream<fd_stream>(fd)));
|
||||
auto ptr = get_decoder(type, make_stream<fd_stream>(fd));
|
||||
ptr->write(in, size);
|
||||
}
|
||||
|
||||
static int64_t compress(format_t type, int fd, const void *in, size_t size) {
|
||||
static off_t compress(format_t type, int fd, const void *in, size_t size) {
|
||||
auto prev = lseek(fd, 0, SEEK_CUR);
|
||||
unique_ptr<stream> ptr(get_encoder(type, open_stream<fd_stream>(fd)));
|
||||
ptr->write(in, size);
|
||||
ptr->close();
|
||||
{
|
||||
auto strm = get_encoder(type, make_stream<fd_stream>(fd));
|
||||
strm->write(in, size);
|
||||
}
|
||||
auto now = lseek(fd, 0, SEEK_CUR);
|
||||
return now - prev;
|
||||
}
|
||||
|
@ -22,7 +22,6 @@
|
||||
using namespace std;
|
||||
|
||||
#define bwrite filter_stream::write
|
||||
#define bclose filter_stream::close
|
||||
|
||||
constexpr size_t CHUNK = 0x40000;
|
||||
constexpr size_t LZ4_UNCOMPRESSED = 0x800000;
|
||||
@ -30,38 +29,35 @@ constexpr size_t LZ4_COMPRESSED = LZ4_COMPRESSBOUND(LZ4_UNCOMPRESSED);
|
||||
|
||||
class cpr_stream : public filter_stream {
|
||||
public:
|
||||
explicit cpr_stream(FILE *fp) : filter_stream(fp) {}
|
||||
|
||||
int read(void *buf, size_t len) final {
|
||||
return stream::read(buf, len);
|
||||
}
|
||||
|
||||
int close() final {
|
||||
finish();
|
||||
return bclose();
|
||||
}
|
||||
|
||||
protected:
|
||||
// If finish is overridden, destroy should be called in the destructor
|
||||
virtual void finish() {}
|
||||
void destroy() { if (fp) finish(); }
|
||||
using filter_stream::filter_stream;
|
||||
using stream::read;
|
||||
};
|
||||
|
||||
class gz_strm : public cpr_stream {
|
||||
public:
|
||||
~gz_strm() override { destroy(); }
|
||||
|
||||
int write(const void *buf, size_t len) override {
|
||||
return len ? write(buf, len, Z_NO_FLUSH) : 0;
|
||||
}
|
||||
|
||||
~gz_strm() override {
|
||||
write(nullptr, 0, Z_FINISH);
|
||||
switch(mode) {
|
||||
case DECODE:
|
||||
inflateEnd(&strm);
|
||||
break;
|
||||
case ENCODE:
|
||||
deflateEnd(&strm);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
enum mode_t {
|
||||
DECODE,
|
||||
ENCODE
|
||||
} mode;
|
||||
|
||||
gz_strm(mode_t mode, FILE *fp) : cpr_stream(fp), mode(mode) {
|
||||
gz_strm(mode_t mode, sFILE &&fp) : cpr_stream(std::move(fp)), mode(mode) {
|
||||
switch(mode) {
|
||||
case DECODE:
|
||||
inflateInit2(&strm, 15 | 16);
|
||||
@ -72,18 +68,6 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
void finish() override {
|
||||
write(nullptr, 0, Z_FINISH);
|
||||
switch(mode) {
|
||||
case DECODE:
|
||||
inflateEnd(&strm);
|
||||
break;
|
||||
case ENCODE:
|
||||
deflateEnd(&strm);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
z_stream strm;
|
||||
uint8_t outbuf[CHUNK];
|
||||
@ -115,29 +99,39 @@ private:
|
||||
|
||||
class gz_decoder : public gz_strm {
|
||||
public:
|
||||
explicit gz_decoder(FILE *fp) : gz_strm(DECODE, fp) {};
|
||||
explicit gz_decoder(sFILE &&fp) : gz_strm(DECODE, std::move(fp)) {};
|
||||
};
|
||||
|
||||
class gz_encoder : public gz_strm {
|
||||
public:
|
||||
explicit gz_encoder(FILE *fp) : gz_strm(ENCODE, fp) {};
|
||||
explicit gz_encoder(sFILE &&fp) : gz_strm(ENCODE, std::move(fp)) {};
|
||||
};
|
||||
|
||||
class bz_strm : public cpr_stream {
|
||||
public:
|
||||
~bz_strm() override { destroy(); }
|
||||
|
||||
int write(const void *buf, size_t len) override {
|
||||
return len ? write(buf, len, BZ_RUN) : 0;
|
||||
}
|
||||
|
||||
~bz_strm() override {
|
||||
switch(mode) {
|
||||
case DECODE:
|
||||
BZ2_bzDecompressEnd(&strm);
|
||||
break;
|
||||
case ENCODE:
|
||||
write(nullptr, 0, BZ_FINISH);
|
||||
BZ2_bzCompressEnd(&strm);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
enum mode_t {
|
||||
DECODE,
|
||||
ENCODE
|
||||
} mode;
|
||||
|
||||
bz_strm(mode_t mode, FILE *fp) : cpr_stream(fp), mode(mode) {
|
||||
bz_strm(mode_t mode, sFILE &&fp) : cpr_stream(std::move(fp)), mode(mode) {
|
||||
switch(mode) {
|
||||
case DECODE:
|
||||
BZ2_bzDecompressInit(&strm, 0, 0);
|
||||
@ -148,18 +142,6 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
void finish() override {
|
||||
switch(mode) {
|
||||
case DECODE:
|
||||
BZ2_bzDecompressEnd(&strm);
|
||||
break;
|
||||
case ENCODE:
|
||||
write(nullptr, 0, BZ_FINISH);
|
||||
BZ2_bzCompressEnd(&strm);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bz_stream strm;
|
||||
char outbuf[CHUNK];
|
||||
@ -191,22 +173,25 @@ private:
|
||||
|
||||
class bz_decoder : public bz_strm {
|
||||
public:
|
||||
explicit bz_decoder(FILE *fp) : bz_strm(DECODE, fp) {};
|
||||
explicit bz_decoder(sFILE &&fp) : bz_strm(DECODE, std::move(fp)) {};
|
||||
};
|
||||
|
||||
class bz_encoder : public bz_strm {
|
||||
public:
|
||||
explicit bz_encoder(FILE *fp) : bz_strm(ENCODE, fp) {};
|
||||
explicit bz_encoder(sFILE &&fp) : bz_strm(ENCODE, std::move(fp)) {};
|
||||
};
|
||||
|
||||
class lzma_strm : public cpr_stream {
|
||||
public:
|
||||
~lzma_strm() override { destroy(); }
|
||||
|
||||
int write(const void *buf, size_t len) override {
|
||||
return len ? write(buf, len, LZMA_RUN) : 0;
|
||||
}
|
||||
|
||||
~lzma_strm() override {
|
||||
write(nullptr, 0, LZMA_FINISH);
|
||||
lzma_end(&strm);
|
||||
}
|
||||
|
||||
protected:
|
||||
enum mode_t {
|
||||
DECODE,
|
||||
@ -214,7 +199,8 @@ protected:
|
||||
ENCODE_LZMA
|
||||
} mode;
|
||||
|
||||
lzma_strm(mode_t mode, FILE *fp) : cpr_stream(fp), mode(mode), strm(LZMA_STREAM_INIT) {
|
||||
lzma_strm(mode_t mode, sFILE &&fp)
|
||||
: cpr_stream(std::move(fp)), mode(mode), strm(LZMA_STREAM_INIT) {
|
||||
lzma_options_lzma opt;
|
||||
|
||||
// Initialize preset
|
||||
@ -238,11 +224,6 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
void finish() override {
|
||||
write(nullptr, 0, LZMA_FINISH);
|
||||
lzma_end(&strm);
|
||||
}
|
||||
|
||||
private:
|
||||
lzma_stream strm;
|
||||
uint8_t outbuf[CHUNK];
|
||||
@ -266,22 +247,22 @@ private:
|
||||
|
||||
class lzma_decoder : public lzma_strm {
|
||||
public:
|
||||
lzma_decoder(FILE *fp) : lzma_strm(DECODE, fp) {}
|
||||
explicit lzma_decoder(sFILE &&fp) : lzma_strm(DECODE, std::move(fp)) {}
|
||||
};
|
||||
|
||||
class xz_encoder : public lzma_strm {
|
||||
public:
|
||||
xz_encoder(FILE *fp) : lzma_strm(ENCODE_XZ, fp) {}
|
||||
explicit xz_encoder(sFILE &&fp) : lzma_strm(ENCODE_XZ, std::move(fp)) {}
|
||||
};
|
||||
|
||||
class lzma_encoder : public lzma_strm {
|
||||
public:
|
||||
lzma_encoder(FILE *fp) : lzma_strm(ENCODE_LZMA, fp) {}
|
||||
explicit lzma_encoder(sFILE &&fp) : lzma_strm(ENCODE_LZMA, std::move(fp)) {}
|
||||
};
|
||||
|
||||
class LZ4F_decoder : public cpr_stream {
|
||||
public:
|
||||
explicit LZ4F_decoder(FILE *fp) : cpr_stream(fp), outbuf(nullptr) {
|
||||
explicit LZ4F_decoder(sFILE &&fp) : cpr_stream(std::move(fp)), outbuf(nullptr) {
|
||||
LZ4F_createDecompressionContext(&ctx, LZ4F_VERSION);
|
||||
}
|
||||
|
||||
@ -336,16 +317,11 @@ private:
|
||||
|
||||
class LZ4F_encoder : public cpr_stream {
|
||||
public:
|
||||
explicit LZ4F_encoder(FILE *fp) : cpr_stream(fp), outbuf(nullptr), outCapacity(0) {
|
||||
explicit LZ4F_encoder(sFILE &&fp)
|
||||
: cpr_stream(std::move(fp)), outbuf(nullptr), outCapacity(0) {
|
||||
LZ4F_createCompressionContext(&ctx, LZ4F_VERSION);
|
||||
}
|
||||
|
||||
~LZ4F_encoder() override {
|
||||
destroy();
|
||||
LZ4F_freeCompressionContext(ctx);
|
||||
delete[] outbuf;
|
||||
}
|
||||
|
||||
int write(const void *buf, size_t len) override {
|
||||
auto ret = len;
|
||||
if (!outbuf)
|
||||
@ -368,10 +344,11 @@ public:
|
||||
return ret;
|
||||
}
|
||||
|
||||
protected:
|
||||
void finish() override {
|
||||
~LZ4F_encoder() override {
|
||||
size_t len = LZ4F_compressEnd(ctx, outbuf, outCapacity, nullptr);
|
||||
bwrite(outbuf, len);
|
||||
LZ4F_freeCompressionContext(ctx);
|
||||
delete[] outbuf;
|
||||
}
|
||||
|
||||
private:
|
||||
@ -401,9 +378,9 @@ private:
|
||||
|
||||
class LZ4_decoder : public cpr_stream {
|
||||
public:
|
||||
explicit LZ4_decoder(FILE *fp)
|
||||
: cpr_stream(fp), out_buf(new char[LZ4_UNCOMPRESSED]), buffer(new char[LZ4_COMPRESSED]),
|
||||
init(false), block_sz(0), buf_off(0) {}
|
||||
explicit LZ4_decoder(sFILE &&fp)
|
||||
: cpr_stream(std::move(fp)), out_buf(new char[LZ4_UNCOMPRESSED]),
|
||||
buffer(new char[LZ4_COMPRESSED]), init(false), block_sz(0), buf_off(0) {}
|
||||
|
||||
~LZ4_decoder() override {
|
||||
delete[] out_buf;
|
||||
@ -462,16 +439,10 @@ private:
|
||||
|
||||
class LZ4_encoder : public cpr_stream {
|
||||
public:
|
||||
explicit LZ4_encoder(FILE *fp)
|
||||
: cpr_stream(fp), outbuf(new char[LZ4_COMPRESSED]), buf(new char[LZ4_UNCOMPRESSED]),
|
||||
explicit LZ4_encoder(sFILE &&fp)
|
||||
: cpr_stream(std::move(fp)), outbuf(new char[LZ4_COMPRESSED]), buf(new char[LZ4_UNCOMPRESSED]),
|
||||
init(false), buf_off(0), in_total(0) {}
|
||||
|
||||
~LZ4_encoder() override {
|
||||
destroy();
|
||||
delete[] outbuf;
|
||||
delete[] buf;
|
||||
}
|
||||
|
||||
int write(const void *in, size_t size) override {
|
||||
if (!init) {
|
||||
bwrite("\x02\x21\x4c\x18", 4);
|
||||
@ -510,14 +481,15 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
protected:
|
||||
void finish() override {
|
||||
~LZ4_encoder() override {
|
||||
if (buf_off) {
|
||||
int write = LZ4_compress_HC(buf, outbuf, buf_off, LZ4_COMPRESSED, 9);
|
||||
bwrite(&write, sizeof(write));
|
||||
bwrite(outbuf, write);
|
||||
}
|
||||
bwrite(&in_total, sizeof(in_total));
|
||||
delete[] outbuf;
|
||||
delete[] buf;
|
||||
}
|
||||
|
||||
private:
|
||||
@ -528,38 +500,38 @@ private:
|
||||
unsigned in_total;
|
||||
};
|
||||
|
||||
filter_stream *get_encoder(format_t type, FILE *fp) {
|
||||
stream_ptr get_encoder(format_t type, sFILE &&fp) {
|
||||
switch (type) {
|
||||
case XZ:
|
||||
return new xz_encoder(fp);
|
||||
return make_unique<xz_encoder>(std::move(fp));
|
||||
case LZMA:
|
||||
return new lzma_encoder(fp);
|
||||
return make_unique<lzma_encoder>(std::move(fp));
|
||||
case BZIP2:
|
||||
return new bz_encoder(fp);
|
||||
return make_unique<bz_encoder>(std::move(fp));
|
||||
case LZ4:
|
||||
return new LZ4F_encoder(fp);
|
||||
return make_unique<LZ4F_encoder>(std::move(fp));
|
||||
case LZ4_LEGACY:
|
||||
return new LZ4_encoder(fp);
|
||||
return make_unique<LZ4_encoder>(std::move(fp));
|
||||
case GZIP:
|
||||
default:
|
||||
return new gz_encoder(fp);
|
||||
return make_unique<gz_encoder>(std::move(fp));
|
||||
}
|
||||
}
|
||||
|
||||
filter_stream *get_decoder(format_t type, FILE *fp) {
|
||||
stream_ptr get_decoder(format_t type, sFILE &&fp) {
|
||||
switch (type) {
|
||||
case XZ:
|
||||
case LZMA:
|
||||
return new lzma_decoder(fp);
|
||||
return make_unique<lzma_decoder>(std::move(fp));
|
||||
case BZIP2:
|
||||
return new bz_decoder(fp);
|
||||
return make_unique<bz_decoder>(std::move(fp));
|
||||
case LZ4:
|
||||
return new LZ4F_decoder(fp);
|
||||
return make_unique<LZ4F_decoder>(std::move(fp));
|
||||
case LZ4_LEGACY:
|
||||
return new LZ4_decoder(fp);
|
||||
return make_unique<LZ4_decoder>(std::move(fp));
|
||||
case GZIP:
|
||||
default:
|
||||
return new gz_decoder(fp);
|
||||
return make_unique<gz_decoder>(std::move(fp));
|
||||
}
|
||||
}
|
||||
|
||||
@ -568,7 +540,7 @@ void decompress(char *infile, const char *outfile) {
|
||||
bool rm_in = false;
|
||||
|
||||
FILE *in_fp = in_std ? stdin : xfopen(infile, "re");
|
||||
unique_ptr<stream> strm;
|
||||
stream_ptr strm;
|
||||
|
||||
char buf[4096];
|
||||
size_t len;
|
||||
@ -601,14 +573,14 @@ void decompress(char *infile, const char *outfile) {
|
||||
}
|
||||
|
||||
FILE *out_fp = outfile == "-"sv ? stdout : xfopen(outfile, "we");
|
||||
strm.reset(get_decoder(type, out_fp));
|
||||
strm = get_decoder(type, make_sFILE(out_fp));
|
||||
if (ext) *ext = '.';
|
||||
}
|
||||
if (strm->write(buf, len) < 0)
|
||||
LOGE("Decompression error!\n");
|
||||
}
|
||||
|
||||
strm->close();
|
||||
strm.reset(nullptr);
|
||||
fclose(in_fp);
|
||||
|
||||
if (rm_in)
|
||||
@ -642,7 +614,7 @@ void compress(const char *method, const char *infile, const char *outfile) {
|
||||
out_fp = outfile == "-"sv ? stdout : xfopen(outfile, "we");
|
||||
}
|
||||
|
||||
unique_ptr<stream> strm(get_encoder(it->second, out_fp));
|
||||
auto strm = get_encoder(it->second, make_sFILE(out_fp));
|
||||
|
||||
char buf[4096];
|
||||
size_t len;
|
||||
@ -651,7 +623,7 @@ void compress(const char *method, const char *infile, const char *outfile) {
|
||||
LOGE("Compression error!\n");
|
||||
};
|
||||
|
||||
strm->close();
|
||||
strm.reset(nullptr);
|
||||
fclose(in_fp);
|
||||
|
||||
if (rm_in)
|
||||
|
@ -4,7 +4,10 @@
|
||||
|
||||
#include "format.h"
|
||||
|
||||
filter_stream *get_encoder(format_t type, FILE *fp = nullptr);
|
||||
filter_stream *get_decoder(format_t type, FILE *fp = nullptr);
|
||||
stream_ptr get_encoder(format_t type, sFILE &&fp);
|
||||
|
||||
stream_ptr get_decoder(format_t type, sFILE &&fp);
|
||||
|
||||
void compress(const char *method, const char *infile, const char *outfile);
|
||||
|
||||
void decompress(char *infile, const char *outfile);
|
||||
|
@ -244,8 +244,8 @@ void magisk_cpio::compress() {
|
||||
|
||||
uint8_t *data;
|
||||
size_t len;
|
||||
FILE *fp = open_stream(get_encoder(XZ, open_stream<byte_stream>(data, len)));
|
||||
dump(fp);
|
||||
auto strm = make_stream(get_encoder(XZ, make_stream<byte_stream>(data, len)));
|
||||
dump(strm.release());
|
||||
|
||||
entries.clear();
|
||||
entries.insert(std::move(init));
|
||||
@ -263,9 +263,10 @@ void magisk_cpio::decompress() {
|
||||
|
||||
char *data;
|
||||
size_t len;
|
||||
auto strm = get_decoder(XZ, open_stream<byte_stream>(data, len));
|
||||
{
|
||||
auto strm = get_decoder(XZ, make_stream<byte_stream>(data, len));
|
||||
strm->write(it->second->data, it->second->filesize);
|
||||
delete strm;
|
||||
}
|
||||
|
||||
entries.erase(it);
|
||||
load_cpio(data, len);
|
||||
|
@ -174,19 +174,20 @@ int compile_split_cil() {
|
||||
}
|
||||
|
||||
int dump_policydb(const char *file) {
|
||||
struct policy_file pf;
|
||||
policy_file_init(&pf);
|
||||
|
||||
uint8_t *data;
|
||||
size_t len;
|
||||
|
||||
{
|
||||
auto fp = make_stream<byte_stream>(data, len);
|
||||
struct policy_file pf;
|
||||
policy_file_init(&pf);
|
||||
pf.type = PF_USE_STDIO;
|
||||
pf.fp = open_stream<byte_stream>(data, len);
|
||||
pf.fp = fp.get();
|
||||
if (policydb_write(magisk_policydb, &pf)) {
|
||||
LOGE("Fail to create policy image\n");
|
||||
return 1;
|
||||
}
|
||||
fclose(pf.fp);
|
||||
}
|
||||
|
||||
int fd = xopen(file, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0644);
|
||||
if (fd < 0)
|
||||
|
@ -196,7 +196,7 @@ void sepol_magisk_rules() {
|
||||
// Allow update_engine/addon.d-v2 to run permissive on all ROMs
|
||||
sepol_permissive("update_engine");
|
||||
|
||||
#ifdef MAGISK_DEBUG
|
||||
#if 0
|
||||
// Remove all dontaudit in debug mode
|
||||
strip_dontaudit();
|
||||
#endif
|
||||
|
@ -109,7 +109,7 @@ bool cpio::exists(const char *name) {
|
||||
return entries.count(name) != 0;
|
||||
}
|
||||
|
||||
#define do_out(buf, len) pos += fwrite(buf, len, 1, out);
|
||||
#define do_out(buf, len) pos += fwrite(buf, 1, len, out);
|
||||
#define out_align() do_out(zeros, align_off(pos, 4))
|
||||
void cpio::dump(FILE *out) {
|
||||
size_t pos = 0;
|
||||
@ -142,7 +142,7 @@ void cpio::dump(FILE *out) {
|
||||
}
|
||||
// Write trailer
|
||||
sprintf(header, "070701%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x",
|
||||
inode++, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 11, 0);
|
||||
inode++, 0755, 0, 0, 1, 0, 0, 0, 0, 0, 0, 11, 0);
|
||||
do_out(header, 110);
|
||||
do_out("TRAILER!!!\0", 11);
|
||||
out_align();
|
||||
|
@ -1,11 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
#include <mntent.h>
|
||||
#include <functional>
|
||||
#include <string_view>
|
||||
|
||||
#define do_align(p, a) (((p) + (a) - 1) / (a) * (a))
|
||||
#define align_off(p, a) (do_align(p, a) - (p))
|
||||
|
||||
using sFILE = std::unique_ptr<FILE, decltype(&fclose)>;
|
||||
static inline sFILE make_sFILE(FILE *fp = nullptr) {
|
||||
return sFILE(fp, fclose);
|
||||
}
|
||||
|
||||
struct file_attr {
|
||||
struct stat st;
|
||||
char con[128];
|
||||
@ -37,7 +43,7 @@ void parse_prop_file(const char *file, const std::function
|
||||
void *__mmap(const char *filename, size_t *size, bool rw);
|
||||
void frm_rf(int dirfd, std::initializer_list<const char *> excl = std::initializer_list<const char *>());
|
||||
void clone_dir(int src, int dest, bool overwrite = true);
|
||||
void parse_mnt(const char *file, const std::function<bool (mntent*)> &fn);
|
||||
void parse_mnt(const char *file, const std::function<bool(mntent*)> &fn);
|
||||
|
||||
template <typename T>
|
||||
void full_read(const char *filename, T &buf, size_t &size) {
|
||||
|
@ -1,18 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <memory>
|
||||
|
||||
// #include <utils.h>
|
||||
#include "../files.h"
|
||||
|
||||
class stream;
|
||||
|
||||
FILE *open_stream(stream *strm);
|
||||
using stream_ptr = std::unique_ptr<stream>;
|
||||
|
||||
sFILE make_stream(stream_ptr &&strm);
|
||||
|
||||
template <class T, class... Args>
|
||||
FILE *open_stream(Args &&... args) {
|
||||
return open_stream(new T(args...));
|
||||
sFILE make_stream(Args &&... args) {
|
||||
return make_stream(stream_ptr(new T(std::forward<Args>(args)...)));
|
||||
}
|
||||
|
||||
class stream {
|
||||
@ -20,28 +21,25 @@ public:
|
||||
virtual int read(void *buf, size_t len);
|
||||
virtual int write(const void *buf, size_t len);
|
||||
virtual off_t seek(off_t off, int whence);
|
||||
virtual int close();
|
||||
virtual ~stream() = default;
|
||||
};
|
||||
|
||||
// Delegates all operations to the base FILE pointer
|
||||
class filter_stream : public stream {
|
||||
public:
|
||||
filter_stream(FILE *fp) : fp(fp) {}
|
||||
~filter_stream() override { if (fp) close(); }
|
||||
filter_stream(sFILE &&fp = make_sFILE()) : fp(std::move(fp)) {}
|
||||
|
||||
int read(void *buf, size_t len) override;
|
||||
int write(const void *buf, size_t len) override;
|
||||
int close() override;
|
||||
|
||||
void set_base(FILE *f);
|
||||
void set_base(sFILE &&f);
|
||||
template <class T, class... Args >
|
||||
void set_base(Args&&... args) {
|
||||
set_base(open_stream<T>(args...));
|
||||
set_base(make_stream<T>(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
protected:
|
||||
FILE *fp;
|
||||
sFILE fp;
|
||||
};
|
||||
|
||||
// Handy interface for classes that need custom seek logic
|
||||
@ -69,7 +67,7 @@ private:
|
||||
size_t _cap = 0;
|
||||
|
||||
void resize(size_t new_pos, bool zero = false);
|
||||
size_t end_pos() override { return _len; }
|
||||
size_t end_pos() final { return _len; }
|
||||
};
|
||||
|
||||
// File stream but does not close the file descriptor at any time
|
||||
|
@ -19,15 +19,13 @@ static fpos_t strm_seek(void *v, fpos_t off, int whence) {
|
||||
|
||||
static int strm_close(void *v) {
|
||||
auto strm = reinterpret_cast<stream *>(v);
|
||||
int ret = strm->close();
|
||||
delete strm;
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
FILE *open_stream(stream *strm) {
|
||||
FILE *fp = funopen(strm, strm_read, strm_write, strm_seek, strm_close);
|
||||
// Disable buffering
|
||||
setbuf(fp, nullptr);
|
||||
sFILE make_stream(stream_ptr &&strm) {
|
||||
sFILE fp(funopen(strm.release(), strm_read, strm_write, strm_seek, strm_close), fclose);
|
||||
setbuf(fp.get(), nullptr);
|
||||
return fp;
|
||||
}
|
||||
|
||||
@ -46,27 +44,16 @@ off_t stream::seek(off_t off, int whence) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int stream::close() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int filter_stream::read(void *buf, size_t len) {
|
||||
return fread(buf, len, 1, fp);
|
||||
return fread(buf, 1, len, fp.get());
|
||||
}
|
||||
|
||||
int filter_stream::write(const void *buf, size_t len) {
|
||||
return fwrite(buf, len, 1, fp);
|
||||
return fwrite(buf, 1, len, fp.get());
|
||||
}
|
||||
|
||||
int filter_stream::close() {
|
||||
int ret = fclose(fp);
|
||||
fp = nullptr;
|
||||
return ret;
|
||||
}
|
||||
|
||||
void filter_stream::set_base(FILE *f) {
|
||||
if (fp) fclose(fp);
|
||||
fp = f;
|
||||
void filter_stream::set_base(sFILE &&f) {
|
||||
fp = std::move(f);
|
||||
}
|
||||
|
||||
off_t seekable_stream::seek_pos(off_t off, int whence) {
|
||||
|
@ -154,7 +154,7 @@ public class FileProvider extends ContentProvider {
|
||||
public Bundle call(String method, String arg, Bundle extras) {
|
||||
if (callHandler != null)
|
||||
return callHandler.call(getContext(), method, arg, extras);
|
||||
return null;
|
||||
return Bundle.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Loading…
Reference in New Issue
Block a user