Files
palera1n/src/main.cpp
T

180 lines
5.9 KiB
C++
Raw Normal View History

2026-02-05 00:42:57 -08:00
#include <unistd.h> // isatty, STDIN_FILENO
#include <cstdlib> // getenv
#include <iostream>
#include <getopt.h>
#include <cstdio>
#include <cstdlib>
#ifdef WITH_GUI
# include <wx/wx.h>
#endif
2026-06-25 21:40:01 -07:00
#include "m8/run.h"
2026-06-22 18:19:25 -07:00
2026-06-25 21:40:01 -07:00
#include "utils.h"
#include "paleinfo.h"
2026-02-05 00:42:57 -08:00
void print_credits() {
printf(
2026-06-26 17:22:45 -07:00
"::\n"
":: Palera1n beta " PALERAIN_VERSION "\n"
"::\n"
":: (c) 2026\n"
"::\n"
":: ======== Made by ======== ::\n"
":: Made by: asdfugil, kok3shidoll, claration, mineek\n"
":: nekohaxx, plooshi, staturnz\n"
":: ======== Thanks to ======== ::\n"
":: Thanks to: llsc12, itsnebulalol, lrdsnow, kirb, ehilwyma\n"
":: opa334, 0x7ff, sbingner, nikias (libimobiledevice)\n"
":: dedbeddedbed, tihmstar\n"
":: Checkra1n (Siguza, axi0mx, littlelailo et al.)\n"
":: Procursus (Hayden Seay, Cameron Katri, Keto et al.)\n"
":: =========================== ::\n\n"
2026-02-05 00:42:57 -08:00
);
}
void print_usage(char* argv) {
printf(
"Usage: %s [OPTIONS]\n\n"
" -h, --help Print usage information\n"
" -v, --version Print version\n\n"
"Options:\n"
" --cli Use command line interface\n"
#ifdef WITH_GUI
" --gui Use graphical user interface\n"
#endif
" --force-revert Force environment reversion\n"
" -l, --rootless Enable rootless mode (standard)\n"
" -f, --rootful Enable rootful mode\n"
" -c, --setup-fakefs Setup fake filesystem\n"
" -B, --setup-partial-fakefs Setup partial fake filesystem\n"
" -s, --safe-mode Enable safe mode\n"
" -T, --telnetd Enable TELNET daemon on port 46 (insecure)\n"
" -V, --verbose-boot Enable verbose booting\n"
, argv
);
}
void parse_arguments(int argc, char* argv[]) {
int options;
int option_index = 0;
static struct option long_options[] = {
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'v'},
{"cli", no_argument, NULL, 1},
#ifdef WITH_GUI
{"gui", no_argument, NULL, 3},
#endif
{"force-revert", no_argument, NULL, 0},
{"rootless", no_argument, NULL, 'l'},
{"rootful", no_argument, NULL, 'f'},
{"setup-fakefs", no_argument, NULL, 'c'},
{"setup-partial-fakefs", no_argument, NULL, 'B'},
{"safe-mode", no_argument, NULL, 's'},
{"telnetd", no_argument, NULL, 'T'},
{"verbose-boot", no_argument, NULL, 'V'},
{NULL, 0, NULL, 0}
};
#ifdef WITH_GUI
2026-06-20 22:15:09 -07:00
palerain_flags |= palerain_option_gui;
2026-06-26 17:22:45 -07:00
# ifndef _WIN32
2026-02-05 00:42:57 -08:00
if (isatty(STDIN_FILENO) && getenv("LLVM_PROFILE_FILE") == nullptr) {
palerain_flags &= ~palerain_option_gui;
palerain_flags |= palerain_option_cli;
} else {
palerain_flags &= ~palerain_option_cli;
palerain_flags |= palerain_option_gui;
}
2026-06-20 22:15:09 -07:00
# endif
2026-02-05 00:42:57 -08:00
#else
palerain_flags |= palerain_option_cli;
#endif
while ((options = getopt_long(argc, argv, "hvlf:", long_options, &option_index)) != -1) {
switch (options) {
case 'h': // --help
print_usage(argv[0]);
exit(1);
case 'v': // --version
exit(0);
case 1: // --cli
palerain_flags &= ~palerain_option_tui;
palerain_flags &= ~palerain_option_gui;
palerain_flags |= palerain_option_cli;
break;
#ifdef WITH_GUI
case 3: // --gui
palerain_flags &= ~palerain_option_cli;
palerain_flags &= ~palerain_option_tui;
palerain_flags |= palerain_option_gui;
break;
#endif
case 0: // --force-revert
palerain_flags |= palerain_option_force_revert;
break;
case 'l': // --rootless
palerain_flags &= ~palerain_option_rootful;
palerain_flags |= palerain_option_rootless;
break;
case 'f': // --rootful
palerain_flags &= ~palerain_option_rootless;
palerain_flags |= palerain_option_rootful;
break;
case 'c': // --setup-fakefs
palerain_flags |= palerain_option_setup_rootful;
break;
case 'B': // --setup-partial-fakefs
palerain_flags |= palerain_option_setup_partial_root;
break;
case 's': // --safe-mode
palerain_flags |= palerain_option_safemode;
break;
case 'T': // --telnetd
palerain_flags |= palerain_option_telnetd;
break;
case 'V': // --verbose-boot
palerain_flags |= palerain_option_verbose_boot;
break;
case '?':
LOG_ERROR("Unknown option");
2026-02-05 00:42:57 -08:00
print_usage(argv[0]);
exit(1);
default: break;
}
}
if (!(palerain_flags & palerain_option_gui)) {
if (!(palerain_flags & palerain_option_rootful) && !(palerain_flags & palerain_option_rootless)) {
LOG_ERROR("You must specify either -l, --rootless or -f, --rootful.\n");
2026-02-05 00:42:57 -08:00
print_usage(argv[0]);
exit(1);
}
}
}
int main(int argc, char* argv[], char* envp[]) {
print_credits();
parse_arguments(argc, argv);
LOG("palera1n_flags: %llu", palerain_flags);
2026-06-26 20:55:55 -07:00
shared_t state{};
2026-02-05 00:42:57 -08:00
#ifdef WITH_GUI
if (palerain_flags & palerain_option_gui) {
wxEntryStart(argc, argv);
wxTheApp->CallOnInit();
wxTheApp->OnRun();
wxTheApp->OnExit();
wxEntryCleanup();
return 0;
2026-06-22 18:19:25 -07:00
} else {
2026-06-26 20:55:55 -07:00
return exploit(&state);
2026-02-05 00:42:57 -08:00
}
2026-06-22 18:19:25 -07:00
#else
2026-06-26 20:55:55 -07:00
return exploit(&state);
2026-02-05 00:42:57 -08:00
#endif
return 0;
}