plush features

This commit is contained in:
Nick Chan committed 2023-03-28 12:43:46 +08:00
1 parent 2d932dd26b
commit c2bb49287a
5 files changed
+74 -17

No files matched your search

+9
View File
@@ -37,6 +37,12 @@ else
CFLAGS += -DNO_CHECKRAIN
endif
ifneq ($(NO_CUSTOM_PONGO),1)
OBJECTS += xxd-Pongo.bin.o
else
CFLAGS += -DNO_CUSTOM_PONGO
endif
ifeq ($(DEV_BUILD),1)
OBJECTS += tui_screen_enter_recovery.o tui_screen_enter_dfu.o tui_main.o
OBJECTS += tui_screen_jailbreak.o tui_screen_main.o tui_screen_options.o
@@ -119,6 +125,9 @@ ramdisk.dmg:
binpack.dmg:
curl -LO https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg
Pongo.bin:
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/Pongo.bin
clean:
rm -rf *.o palera1n checkra1n checkra1n.c palera1n.dSYM libcheckra1nhelper.dylib
+49 -15
View File
@@ -26,37 +26,65 @@ extern char **environ;
#include <palerain.h>
#include <xxd-embedded.h>
char* pongo_path = NULL;
bool external_pongo = false;
char* ext_checkra1n = NULL;
#define tmpdir getenv("TMPDIR") == NULL ? "/tmp" : getenv("TMPDIR")
int exec_checkra1n(void) {
LOG(LOG_INFO, "About to execute checkra1n");
int fd, ret;
int fd_checkra1n, fd_pongo, ret;
char* checkra1n_path = NULL;
if (ext_checkra1n != NULL) {
checkra1n_path = ext_checkra1n;
goto checkra1n_exec;
}
#ifndef NO_CUSTOM_PONGO
if (pongo_path == NULL) {
pongo_path = malloc(strlen(tmpdir) + 20);
snprintf(pongo_path, strlen(tmpdir) + 20, "%s/Pongo.bin.XXXXXX", tmpdir);
fd_pongo = mkstemp(pongo_path);
if (fd_pongo == -1) {
LOG(LOG_FATAL, "Cannot open temporary file %s: %d (%s)", pongo_path, errno, strerror(errno));
free(pongo_path);
return -1;
}
ssize_t didWrite_Pongo_bin = write(fd_pongo, Pongo_bin, Pongo_bin_len);
if (didWrite_Pongo_bin != (ssize_t)Pongo_bin_len) {
LOG(LOG_FATAL, "Size written to %s does not match expected: %lld != %d: %d (%s)", pongo_path, didWrite_Pongo_bin, Pongo_bin_len, errno, strerror(errno));
close(fd_pongo);
unlink(pongo_path);
free(pongo_path);
pongo_path = NULL;
return -1;
}
} else external_pongo = true;
#endif
checkra1n_path = malloc(strlen(tmpdir) + 20);
snprintf(checkra1n_path, strlen(tmpdir) + 20, "%s/checkra1n.XXXXXX", tmpdir);
fd = mkstemp(checkra1n_path);
if (fd == -1) {
LOG(LOG_FATAL, "Cannot open temporary file: %d (%s)", errno, strerror(errno));
fd_checkra1n = mkstemp(checkra1n_path);
if (fd_checkra1n == -1) {
LOG(LOG_FATAL, "Cannot open temporary file %s: %d (%s)", checkra1n_path, errno, strerror(errno));
free(checkra1n_path);
checkra1n_path = NULL;
return -1;
}
ssize_t didWrite = write(fd, checkra1n, checkra1n_len);
if (didWrite != (ssize_t)checkra1n_len) {
LOG(LOG_FATAL, "Size written does not match expected: %lld != %d: %d (%s)", didWrite, checkra1n_len, errno, strerror(errno));
close(fd);
ssize_t didWrite_checkra1n = write(fd_checkra1n, checkra1n, checkra1n_len);
if (didWrite_checkra1n != (ssize_t)checkra1n_len) {
LOG(LOG_FATAL, "Size written to %s does not match expected: %lld != %d: %d (%s)", checkra1n_path, didWrite_checkra1n, checkra1n_len, errno, strerror(errno));
close(fd_checkra1n);
unlink(checkra1n_path);
free(checkra1n_path);
checkra1n_path = NULL;
return -1;
}
close(fd);
close(fd_checkra1n);
ret = chmod(checkra1n_path, 0700);
if (ret) {
LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", checkra1n_path, errno, strerror(errno));
unlink(checkra1n_path);
free(checkra1n_path);
checkra1n_path = NULL;
return -1;
}
#if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER))
@@ -76,9 +104,9 @@ int exec_checkra1n(void) {
LOG(LOG_FATAL, "Cannot open temporary file: %d (%s)", errno, strerror(errno));
return -1;
}
ssize_t didWrite = write(helper_fd, libcheckra1nhelper_dylib, libcheckra1nhelper_dylib_len);
if ((unsigned int)didWrite != libcheckra1nhelper_dylib_len) {
LOG(LOG_FATAL, "Size written does not match expected: %lld != %d: %d (%s)", didWrite, libcheckra1nhelper_dylib_len, errno, strerror(errno));
ssize_t didWrite_libcheckra1nhelper = write(helper_fd, libcheckra1nhelper_dylib, libcheckra1nhelper_dylib_len);
if ((unsigned int)didWrite_libcheckra1nhelper != libcheckra1nhelper_dylib_len) {
LOG(LOG_FATAL, "Size written does not match expected: %lld != %d: %d (%s)", didWrite_libcheckra1nhelper, libcheckra1nhelper_dylib_len, errno, strerror(errno));
close(helper_fd);
unlink(libcheckra1nhelper_dylib_path);
return -1;
@@ -106,15 +134,22 @@ checkra1n_exec: {};
} else {
strncat(args, "R", 0xf);
}
if (pongo_path != NULL) strncat(args, "k", 0xf); // keep this at last
if (pongo_path != NULL) {
setenv("CHECKRA1N_OVERRIDE_PONGO", pongo_path, 1);
}
LOG(LOG_VERBOSE5, args);
if (pongo_path != NULL) LOG(LOG_VERBOSE5, pongo_path);
pid_t pid;
char* checkra1n_argv[] = {
checkra1n_path,
args,
pongo_path,
NULL
};
ret = posix_spawn(&pid, checkra1n_path, NULL, NULL, checkra1n_argv, environ);
waitpid(pid, NULL, 0);
if (!external_pongo && pongo_path != NULL) {
unlink(pongo_path);
}
if (pongo_path != NULL) free(pongo_path);
pongo_path = NULL;
if (ret) {
@@ -138,6 +173,5 @@ checkra1n_exec: {};
libcheckra1nhelper_dylib_path = NULL;
}
#endif
waitpid(pid, NULL, 0);
return 0;
}