Various improvements for Magisk installation
This commit is contained in:
parent
c55aa92d4f
commit
1a3c522c94
@ -362,25 +362,33 @@ int decomp(file_t type, const char *to, const unsigned char *from, size_t size)
|
|||||||
// Output will be to.ext
|
// Output will be to.ext
|
||||||
int comp(file_t type, const char *to, const unsigned char *from, size_t size) {
|
int comp(file_t type, const char *to, const unsigned char *from, size_t size) {
|
||||||
char name[PATH_MAX];
|
char name[PATH_MAX];
|
||||||
|
const char *ext = strrchr(to, '.');
|
||||||
|
if (ext == NULL) ext = to;
|
||||||
|
strcpy(name, to);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case GZIP:
|
case GZIP:
|
||||||
sprintf(name, "%s.%s", to, "gz");
|
if (strcmp(ext, ".gz") != 0)
|
||||||
|
sprintf(name, "%s.%s", to, "gz");
|
||||||
gzip(1, name, from, size);
|
gzip(1, name, from, size);
|
||||||
break;
|
break;
|
||||||
case XZ:
|
case XZ:
|
||||||
sprintf(name, "%s.%s", to, "xz");
|
if (strcmp(ext, ".xz") != 0)
|
||||||
|
sprintf(name, "%s.%s", to, "xz");
|
||||||
lzma(1, name, from, size);
|
lzma(1, name, from, size);
|
||||||
break;
|
break;
|
||||||
case LZMA:
|
case LZMA:
|
||||||
sprintf(name, "%s.%s", to, "lzma");
|
if (strcmp(ext, ".lzma") != 0)
|
||||||
|
sprintf(name, "%s.%s", to, "lzma");
|
||||||
lzma(2, name, from, size);
|
lzma(2, name, from, size);
|
||||||
break;
|
break;
|
||||||
case BZIP2:
|
case BZIP2:
|
||||||
sprintf(name, "%s.%s", to, "bz2");
|
if (strcmp(ext, ".bz2") != 0)
|
||||||
|
sprintf(name, "%s.%s", to, "bz2");
|
||||||
bzip2(1, name, from, size);
|
bzip2(1, name, from, size);
|
||||||
break;
|
break;
|
||||||
case LZ4:
|
case LZ4:
|
||||||
sprintf(name, "%s.%s", to, "lz4");
|
if (strcmp(ext, ".lz4") != 0)
|
||||||
|
sprintf(name, "%s.%s", to, "lz4");
|
||||||
lz4(1, name, from, size);
|
lz4(1, name, from, size);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -390,7 +398,7 @@ int comp(file_t type, const char *to, const unsigned char *from, size_t size) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void decomp_file(char *from) {
|
void decomp_file(char *from, const char *to) {
|
||||||
int ok = 1;
|
int ok = 1;
|
||||||
unsigned char *file;
|
unsigned char *file;
|
||||||
size_t size;
|
size_t size;
|
||||||
@ -428,17 +436,22 @@ void decomp_file(char *from) {
|
|||||||
}
|
}
|
||||||
if (ok) {
|
if (ok) {
|
||||||
// If all match, strip out the suffix
|
// If all match, strip out the suffix
|
||||||
*ext = '\0';
|
if (!to) {
|
||||||
decomp(type, from, file, size);
|
*ext = '\0';
|
||||||
*ext = '.';
|
to = from;
|
||||||
unlink(from);
|
}
|
||||||
|
decomp(type, to, file, size);
|
||||||
|
if (to == from) {
|
||||||
|
*ext = '.';
|
||||||
|
unlink(from);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
error(1, "Bad filename extention \'%s\'", ext);
|
error(1, "Bad filename extention \'%s\'", ext);
|
||||||
}
|
}
|
||||||
munmap(file, size);
|
munmap(file, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void comp_file(const char *method, const char *from) {
|
void comp_file(const char *method, const char *from, const char *to) {
|
||||||
file_t type;
|
file_t type;
|
||||||
if (strcmp(method, "gzip") == 0) {
|
if (strcmp(method, "gzip") == 0) {
|
||||||
type = GZIP;
|
type = GZIP;
|
||||||
@ -456,8 +469,11 @@ void comp_file(const char *method, const char *from) {
|
|||||||
unsigned char *file;
|
unsigned char *file;
|
||||||
size_t size;
|
size_t size;
|
||||||
mmap_ro(from, &file, &size);
|
mmap_ro(from, &file, &size);
|
||||||
comp(type, from, file, size);
|
if (!to)
|
||||||
|
to = from;
|
||||||
|
comp(type, to, file, size);
|
||||||
munmap(file, size);
|
munmap(file, size);
|
||||||
unlink(from);
|
if (to == from)
|
||||||
|
unlink(from);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,13 +266,13 @@ static void cpio_extract(const char *entry, const char *filename, vector *v) {
|
|||||||
cpio_file *f;
|
cpio_file *f;
|
||||||
vec_for_each(v, f) {
|
vec_for_each(v, f) {
|
||||||
if (strcmp(f->filename, entry) == 0 && S_ISREG(f->mode)) {
|
if (strcmp(f->filename, entry) == 0 && S_ISREG(f->mode)) {
|
||||||
printf("Extracting [%s] to [%s]\n", entry, filename);
|
printf("Extracting [%s] to [%s]\n\n", entry, filename);
|
||||||
int fd = open_new(filename);
|
int fd = open_new(filename);
|
||||||
write(fd, f->data, f->filesize);
|
write(fd, f->data, f->filesize);
|
||||||
fchmod(fd, f->mode);
|
fchmod(fd, f->mode);
|
||||||
fchown(fd, f->uid, f->gid);
|
fchown(fd, f->uid, f->gid);
|
||||||
close(fd);
|
close(fd);
|
||||||
return;
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
error(1, "Cannot find the file entry [%s]", entry);
|
error(1, "Cannot find the file entry [%s]", entry);
|
||||||
@ -374,18 +374,17 @@ static void cpio_backup(const char *orig, vector *v) {
|
|||||||
cpio_vec_destroy(o);
|
cpio_vec_destroy(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpio_restore(vector *v) {
|
static int cpio_restore(vector *v) {
|
||||||
cpio_file *f, *n;
|
cpio_file *f, *n;
|
||||||
|
int ret = 1;
|
||||||
vec_for_each(v, f) {
|
vec_for_each(v, f) {
|
||||||
if (strstr(f->filename, ".backup") != NULL) {
|
if (strstr(f->filename, ".backup") != NULL) {
|
||||||
|
ret = 0;
|
||||||
f->remove = 1;
|
f->remove = 1;
|
||||||
if (strcmp(f->filename, ".backup") == 0) continue;
|
if (strcmp(f->filename, ".backup") == 0) continue;
|
||||||
if (strcmp(f->filename, ".backup/.rmlist") == 0) {
|
if (strcmp(f->filename, ".backup/.rmlist") == 0) {
|
||||||
int pos = 0;
|
for (int pos = 0; pos < f->filesize; pos += strlen(f->data + pos) + 1)
|
||||||
while(pos < f->filesize) {
|
|
||||||
cpio_rm(0, f->data + pos, v);
|
cpio_rm(0, f->data + pos, v);
|
||||||
pos += strlen(f->data + pos) + 1;
|
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
n = calloc(sizeof(*n), 1);
|
n = calloc(sizeof(*n), 1);
|
||||||
@ -404,10 +403,11 @@ static void cpio_restore(vector *v) {
|
|||||||
cpio_rm(0, "sbin/magic_mask.sh", v);
|
cpio_rm(0, "sbin/magic_mask.sh", v);
|
||||||
cpio_rm(0, "init.magisk.rc", v);
|
cpio_rm(0, "init.magisk.rc", v);
|
||||||
cpio_rm(0, "magisk", v);
|
cpio_rm(0, "magisk", v);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpio_commands(const char *command, int argc, char *argv[]) {
|
int cpio_commands(const char *command, int argc, char *argv[]) {
|
||||||
int recursive = 0;
|
int recursive = 0, ret = 0;
|
||||||
command_t cmd;
|
command_t cmd;
|
||||||
char *incpio = argv[0];
|
char *incpio = argv[0];
|
||||||
++argv;
|
++argv;
|
||||||
@ -453,7 +453,7 @@ int cpio_commands(const char *command, int argc, char *argv[]) {
|
|||||||
cpio_forceencrypt(&v);
|
cpio_forceencrypt(&v);
|
||||||
break;
|
break;
|
||||||
case RESTORE:
|
case RESTORE:
|
||||||
cpio_restore(&v);
|
ret = cpio_restore(&v);
|
||||||
break;
|
break;
|
||||||
case BACKUP:
|
case BACKUP:
|
||||||
cpio_backup(argv[0], &v);
|
cpio_backup(argv[0], &v);
|
||||||
@ -475,5 +475,5 @@ int cpio_commands(const char *command, int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
dump_cpio(incpio, &v);
|
dump_cpio(incpio, &v);
|
||||||
cpio_vec_destroy(&v);
|
cpio_vec_destroy(&v);
|
||||||
return 0;
|
exit(ret);
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ void vec_destroy(vector *v);
|
|||||||
for (size_t _i = 0; _i < (v)->size; ++_i, e = (v)->data[_i])
|
for (size_t _i = 0; _i < (v)->size; ++_i, e = (v)->data[_i])
|
||||||
|
|
||||||
// Global variables
|
// Global variables
|
||||||
extern unsigned char *kernel, *ramdisk, *second, *dtb;
|
extern unsigned char *kernel, *ramdisk, *second, *dtb, *extra;
|
||||||
extern boot_img_hdr hdr;
|
extern boot_img_hdr hdr;
|
||||||
extern file_t boot_type, ramdisk_type, dtb_type;
|
extern file_t boot_type, ramdisk_type, dtb_type;
|
||||||
extern int mtk_kernel, mtk_ramdisk;
|
extern int mtk_kernel, mtk_ramdisk;
|
||||||
@ -110,9 +110,9 @@ void lzma(int mode, const char* filename, const unsigned char* buf, size_t size)
|
|||||||
void lz4(int mode, const char* filename, const unsigned char* buf, size_t size);
|
void lz4(int mode, const char* filename, const unsigned char* buf, size_t size);
|
||||||
void bzip2(int mode, const char* filename, const unsigned char* buf, size_t size);
|
void bzip2(int mode, const char* filename, const unsigned char* buf, size_t size);
|
||||||
int comp(file_t type, const char *to, const unsigned char *from, size_t size);
|
int comp(file_t type, const char *to, const unsigned char *from, size_t size);
|
||||||
void comp_file(const char *method, const char *from);
|
void comp_file(const char *method, const char *from, const char *to);
|
||||||
int decomp(file_t type, const char *to, const unsigned char *from, size_t size);
|
int decomp(file_t type, const char *to, const unsigned char *from, size_t size);
|
||||||
void decomp_file(char *from);
|
void decomp_file(char *from, const char *to);
|
||||||
|
|
||||||
// Utils
|
// Utils
|
||||||
void mmap_ro(const char *filename, unsigned char **buf, size_t *size);
|
void mmap_ro(const char *filename, unsigned char **buf, size_t *size);
|
||||||
|
@ -34,12 +34,12 @@ static void usage(char *arg0) {
|
|||||||
fprintf(stderr, " --cpio-restore <incpio>\n Restore ramdisk from ramdisk backup within <incpio>\n");
|
fprintf(stderr, " --cpio-restore <incpio>\n Restore ramdisk from ramdisk backup within <incpio>\n");
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
fprintf(stderr, "%s --compress[=method] <file>\n", arg0);
|
fprintf(stderr, "%s --compress[=method] <infile> [outfile]\n", arg0);
|
||||||
fprintf(stderr, " Compress <file> with [method], or gzip if not specified.\n Supported methods: " SUP_LIST "\n");
|
fprintf(stderr, " Compress <infile> with [method](default: gzip), optionally to [outfile]\n Supported methods: " SUP_LIST "\n");
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
fprintf(stderr, "%s --decompress <file>\n", arg0);
|
fprintf(stderr, "%s --decompress <infile> [outfile]\n", arg0);
|
||||||
fprintf(stderr, " Auto check file type, and decompress <file> accordingly\n Supported methods: " SUP_LIST "\n");
|
fprintf(stderr, " Detect method and decompress <infile>, optionally to [outfile]\n Supported methods: " SUP_LIST "\n");
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
fprintf(stderr, "%s --sha1 <file>\n", arg0);
|
fprintf(stderr, "%s --sha1 <file>\n", arg0);
|
||||||
@ -81,13 +81,13 @@ int main(int argc, char *argv[]) {
|
|||||||
} else if (argc > 2 && strcmp(argv[1], "--repack") == 0) {
|
} else if (argc > 2 && strcmp(argv[1], "--repack") == 0) {
|
||||||
repack(argv[2], argc > 3 ? argv[3] : NEW_BOOT);
|
repack(argv[2], argc > 3 ? argv[3] : NEW_BOOT);
|
||||||
} else if (argc > 2 && strcmp(argv[1], "--decompress") == 0) {
|
} else if (argc > 2 && strcmp(argv[1], "--decompress") == 0) {
|
||||||
decomp_file(argv[2]);
|
decomp_file(argv[2], argc > 3 ? argv[3] : NULL);
|
||||||
} else if (argc > 2 && strncmp(argv[1], "--compress", 10) == 0) {
|
} else if (argc > 2 && strncmp(argv[1], "--compress", 10) == 0) {
|
||||||
char *method;
|
char *method;
|
||||||
method = strchr(argv[1], '=');
|
method = strchr(argv[1], '=');
|
||||||
if (method == NULL) method = "gzip";
|
if (method == NULL) method = "gzip";
|
||||||
else method++;
|
else method++;
|
||||||
comp_file(method, argv[2]);
|
comp_file(method, argv[2], argc > 3 ? argv[3] : NULL);
|
||||||
} else if (argc > 4 && strcmp(argv[1], "--hexpatch") == 0) {
|
} else if (argc > 4 && strcmp(argv[1], "--hexpatch") == 0) {
|
||||||
hexpatch(argv[2], argv[3], argv[4]);
|
hexpatch(argv[2], argv[3], argv[4]);
|
||||||
} else if (argc > 2 && strncmp(argv[1], "--cpio", 6) == 0) {
|
} else if (argc > 2 && strncmp(argv[1], "--cpio", 6) == 0) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include "elf.h"
|
#include "elf.h"
|
||||||
#include "magiskboot.h"
|
#include "magiskboot.h"
|
||||||
|
|
||||||
unsigned char *kernel, *ramdisk, *second, *dtb;
|
unsigned char *kernel, *ramdisk, *second, *dtb, *extra;
|
||||||
boot_img_hdr hdr;
|
boot_img_hdr hdr;
|
||||||
int mtk_kernel = 0, mtk_ramdisk = 0;
|
int mtk_kernel = 0, mtk_ramdisk = 0;
|
||||||
file_t boot_type, ramdisk_type, dtb_type;
|
file_t boot_type, ramdisk_type, dtb_type;
|
||||||
@ -186,7 +186,7 @@ static void parse_elf(unsigned char *base) {
|
|||||||
check_headers();
|
check_headers();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_aosp(unsigned char *base) {
|
static void parse_aosp(unsigned char *base, size_t size) {
|
||||||
|
|
||||||
printf("IMG [AOSP]\n");
|
printf("IMG [AOSP]\n");
|
||||||
|
|
||||||
@ -220,12 +220,16 @@ static void parse_aosp(unsigned char *base) {
|
|||||||
mem_align(&pos, hdr.page_size);
|
mem_align(&pos, hdr.page_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pos < size) {
|
||||||
|
extra = base + pos;
|
||||||
|
}
|
||||||
|
|
||||||
check_headers();
|
check_headers();
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_img(unsigned char *orig, size_t size) {
|
void parse_img(unsigned char *orig, size_t size) {
|
||||||
unsigned char *base;
|
unsigned char *base, *end;
|
||||||
for(base = orig; base < (orig + size); base += 256) {
|
for(base = orig, end = orig + size; base < end; base += 256, size -= 256) {
|
||||||
switch (check_type(base)) {
|
switch (check_type(base)) {
|
||||||
case CHROMEOS:
|
case CHROMEOS:
|
||||||
boot_type = CHROMEOS;
|
boot_type = CHROMEOS;
|
||||||
@ -234,7 +238,7 @@ void parse_img(unsigned char *orig, size_t size) {
|
|||||||
// Don't override CHROMEOS
|
// Don't override CHROMEOS
|
||||||
if (boot_type != CHROMEOS)
|
if (boot_type != CHROMEOS)
|
||||||
boot_type = AOSP;
|
boot_type = AOSP;
|
||||||
parse_aosp(base);
|
parse_aosp(base, size);
|
||||||
return;
|
return;
|
||||||
case ELF:
|
case ELF:
|
||||||
boot_type = ELF;
|
boot_type = ELF;
|
||||||
|
@ -104,6 +104,14 @@ void repack(const char* orig_image, const char* out_image) {
|
|||||||
file_align(fd, hdr.page_size, 1);
|
file_align(fd, hdr.page_size, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check extra info, currently only for LG Bump and Samsung SEANDROIDENFORCE
|
||||||
|
if (extra) {
|
||||||
|
if (memcmp(extra, "SEANDROIDENFORCE", 16) == 0 ||
|
||||||
|
memcmp(extra, "\x41\xa9\xe4\x67\x74\x4d\x1d\x1b\xa4\x29\xf2\xec\xea\x65\x52\x79", 16) == 0 ) {
|
||||||
|
restore_buf(extra, 16, fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Write header back
|
// Write header back
|
||||||
printf("Repack to boot image: [%s]\n\n", out_image);
|
printf("Repack to boot image: [%s]\n\n", out_image);
|
||||||
print_info();
|
print_info();
|
||||||
|
Loading…
Reference in New Issue
Block a user