Magisk/jni/magiskboot/boot_utils.c

98 lines
2.6 KiB
C
Raw Normal View History

2017-03-04 14:16:59 +01:00
#include "magiskboot.h"
2017-04-27 21:15:48 +02:00
char *SUP_LIST[] = { "gzip", "xz", "lzma", "bzip2", "lz4", "lz4_legacy", NULL };
char *SUP_EXT_LIST[] = { "gz", "xz", "lzma", "bz2", "lz4", "lz4", NULL };
file_t SUP_TYPE_LIST[] = { GZIP, XZ, LZMA, BZIP2, LZ4, LZ4_LEGACY, 0 };
2017-03-04 14:16:59 +01:00
void mmap_ro(const char *filename, unsigned char **buf, size_t *size) {
2017-04-28 15:48:38 +02:00
int fd = xopen(filename, O_RDONLY);
2017-03-04 14:16:59 +01:00
*size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
2017-04-28 15:48:38 +02:00
*buf = xmmap(NULL, *size, PROT_READ, MAP_SHARED, fd, 0);
2017-03-04 14:16:59 +01:00
close(fd);
}
void mmap_rw(const char *filename, unsigned char **buf, size_t *size) {
2017-04-28 15:48:38 +02:00
int fd = xopen(filename, O_RDWR);
2017-03-04 14:16:59 +01:00
*size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
2017-04-28 15:48:38 +02:00
*buf = xmmap(NULL, *size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2017-03-04 14:16:59 +01:00
close(fd);
}
file_t check_type(const unsigned char *buf) {
2017-04-27 21:15:48 +02:00
if (memcmp(buf, CHROMEOS_MAGIC, 8) == 0) {
2017-03-04 14:16:59 +01:00
return CHROMEOS;
} else if (memcmp(buf, BOOT_MAGIC, BOOT_MAGIC_SIZE) == 0) {
return AOSP;
2017-04-27 21:15:48 +02:00
} else if (memcmp(buf, ELF32_MAGIC, 5) == 0) {
return ELF32;
} else if (memcmp(buf, ELF64_MAGIC, 5) == 0) {
return ELF64;
2017-03-04 14:16:59 +01:00
} else if (memcmp(buf, "\x1f\x8b\x08\x00", 4) == 0) {
return GZIP;
} else if (memcmp(buf, "\x89\x4c\x5a\x4f\x00\x0d\x0a\x1a\x0a", 9) == 0) {
return LZOP;
} else if (memcmp(buf, "\xfd""7zXZ\x00", 6) == 0) {
return XZ;
} else if (memcmp(buf, "\x5d\x00\x00", 3) == 0
&& (buf[12] == (unsigned char) '\xff' || buf[12] == (unsigned char) '\x00')) {
return LZMA;
} else if (memcmp(buf, "BZh", 3) == 0) {
return BZIP2;
2017-03-28 22:09:59 +02:00
} else if (memcmp(buf, "\x04\x22\x4d\x18", 4) == 0) {
2017-03-04 14:16:59 +01:00
return LZ4;
2017-03-28 22:09:59 +02:00
} else if (memcmp(buf, "\x02\x21\x4c\x18", 4) == 0) {
return LZ4_LEGACY;
2017-03-04 14:16:59 +01:00
} else if (memcmp(buf, "\x88\x16\x88\x58", 4) == 0) {
return MTK;
} else {
return UNKNOWN;
}
}
void write_zero(int fd, size_t size) {
size_t pos = lseek(fd, 0, SEEK_CUR);
ftruncate(fd, pos + size);
lseek(fd, pos + size, SEEK_SET);
}
2017-03-04 14:16:59 +01:00
void mem_align(size_t *pos, size_t align) {
size_t mask = align - 1;
if (*pos & mask) {
*pos += align - (*pos & mask);
}
}
2017-03-07 17:54:23 +01:00
void file_align(int fd, size_t align, int out) {
2017-03-04 14:16:59 +01:00
size_t pos = lseek(fd, 0, SEEK_CUR);
size_t mask = align - 1;
2017-03-12 21:19:30 +01:00
size_t off;
2017-03-04 14:16:59 +01:00
if (pos & mask) {
2017-03-12 21:19:30 +01:00
off = align - (pos & mask);
2017-03-07 17:54:23 +01:00
if (out) {
write_zero(fd, off);
2017-03-12 21:19:30 +01:00
} else {
lseek(fd, pos + off, SEEK_SET);
2017-03-07 17:54:23 +01:00
}
2017-03-04 14:16:59 +01:00
}
}
int open_new(const char *filename) {
2017-04-28 15:48:38 +02:00
return xopen(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644);
2017-03-04 14:16:59 +01:00
}
void cleanup() {
2017-07-18 05:53:28 +02:00
fprintf(stderr, "Cleaning up...\n");
char name[PATH_MAX];
unlink(KERNEL_FILE);
unlink(RAMDISK_FILE);
unlink(RAMDISK_FILE ".unsupport");
unlink(SECOND_FILE);
unlink(DTB_FILE);
2017-04-27 21:15:48 +02:00
for (int i = 0; SUP_EXT_LIST[i]; ++i) {
sprintf(name, "%s.%s", RAMDISK_FILE, SUP_EXT_LIST[i]);
unlink(name);
}
}