Compare commits

..
117 Commits
Author SHA1 Message Date
Nick Chan 05be1ce030 dfuhelper: changes 2023-07-08 03:55:19 +08:00
Nick Chan e37c476cec Makefile: Update NAME 2023-07-08 03:55:19 +08:00
Nick Chan 48eb11ada0 tui: fix options menu 2023-07-08 03:55:19 +08:00
Nick Chan f72ad75db2 chore: fix tui build compiler errors 2023-07-08 03:55:19 +08:00
Nick Chan 4a8fb113ae increase size of palera1n_flags 2023-07-08 03:55:18 +08:00
Nick Chan 03a0a5db6b paleinfo v2 2023-07-08 03:53:55 +08:00
samara 8b56b01cee chore: Update README.md :3c 2023-07-06 02:59:30 -07:00
Nick Chan 52d20c8e5b docs: do not mention options that does not appear in help menu 2023-07-02 03:56:55 +08:00
Nick Chan b0ac19e4d1 Do not implicitly set any build settings 2023-07-02 03:47:00 +08:00
Nebula e8d4e857dd fix(ci): make upload action use password 2023-07-01 14:34:18 -04:00
Nebula bf549b8f86 ci(sftp): update to sftp-upload-action v2.0.2 2023-06-28 15:38:43 -04:00
Nick Chan b79ac3176f ci: do not use palera1n-ios, just palera1n-iphoneos-arm64 2023-06-27 19:12:40 +08:00
flower e12216dc5e feat: update docs link 2023-06-22 17:42:45 -07:00
Tom E f7603371f6 Update to checkra1n 0.1337.2 2023-06-06 10:11:11 -04:00
flower f80e2a8849 Update build.yml 2023-06-03 16:06:40 -07:00
flower a30e2ef32a ci: remove symlink for now 2023-05-29 11:21:39 -07:00
flower 2825ccaf17 ci: attempt to fix finish-build symlink v5 2023-05-29 11:03:00 -07:00
flower e1e0304b98 ci: attempt to fix finish-build symlink v4 2023-05-29 11:00:41 -07:00
flower 5f4ef51da9 ci: attempt to fix finish-build symlink v3 2023-05-29 10:48:41 -07:00
flower 98f7d032eb ci: attempt to fix finish-build symlink v2 2023-05-29 10:33:52 -07:00
flower 5b32d61a1e ci: attempt to fix finish-build symlink 2023-05-29 10:15:30 -07:00
flower fd80f9e63f feat: "latest" symlink 2023-05-29 09:53:58 -07:00
flower 52ff0b2e62 feat: different destinations for run_number (#393)
* chore: create separate dirs

* chore: fix up naming

* feat: Update embed to include actor

* fix: fixup embed

* fix: attempt to fix embed v3
2023-05-29 09:03:00 -07:00
Nick Chan aa0c3a77b3 deps: patch mbedtls 3.4.0 take 2 2023-05-27 23:51:40 +08:00
Nick Chan a5fbf1b18b deps: update MbedTLS to 3.4.0
96% tests passed, 5 tests failed out of 113

Total Test time (real) =  84.57 sec

The following tests FAILED:
	 42 - debug-suite (Failed)
	 80 - pkcs7-suite (Failed)
	109 - ssl-suite (Failed)
	112 - x509parse-suite (Failed)
	113 - x509write-suite (Failed)
2023-05-27 20:56:58 +08:00
flower 7d3bf14ea6 chore: Remove changes from embed 2023-05-24 14:41:14 -07:00
flower a8325474cf chore: Update README.md 2023-05-21 03:03:04 -07:00
flower 8a09d2670a chore: s/16.4.1/16.5 2023-05-21 02:37:56 -07:00
Nick Chan 30d8241e2d s/16.4.1/16.5 2023-05-20 00:59:04 +08:00
staturnz e33d50860b chore: update ramdisk download url 2023-05-17 23:49:23 -05:00
fenfenS 3b4340525d usb_libusb.c: initialize variable stuff.handle (#392)
initialize stuff.handle, or function FoundDevice would return directly.
2023-05-18 01:58:02 +08:00
staturnz e6033f31cc chore: update readme links 2023-05-17 08:11:00 -05:00
flower c14d93b008 ci: actual branch name 2023-05-14 20:44:10 -07:00
flower ed48d4fcb4 ci: change field 2023-05-14 20:30:24 -07:00
flower 2541330a07 ci: change embed design 2023-05-14 20:27:03 -07:00
flower 58aaf508fc ci: fix timestamp v3 2023-05-14 20:03:55 -07:00
flower e6644c0601 ci: fix timestamp v2 2023-05-14 19:49:57 -07:00
flower 194f568363 ci: fix timestamp 2023-05-14 19:15:47 -07:00
Nebula 963fbb6ed8 ci: other discord alert changes 2023-05-14 21:29:59 -04:00
Nebula 88185b7a88 ci: add timestamp to discord alert 2023-05-14 21:27:03 -04:00
Nebula 3c6213774b ci: hate 2023-05-14 21:15:28 -04:00
Nebula c35d199809 ci: Discord build message improvements 2023-05-14 21:04:38 -04:00
Nebula 67ca5a9d24 ci: do not trigger discord alert on PR 2023-05-14 20:11:12 -04:00
Nebula 8edc991786 ci: add Discord build message 2023-05-14 20:09:06 -04:00
Nick Chan f59ef6dcee 0xallie
[palera1n/palera1n] New comment on commit 1ca25ce
usedqq
2023-05-01 01:31:05 +08:00
Nick Chan 1ca25ceca8 clarify about clean fakefs and /var 2023-05-01 01:28:59 +08:00
Nick Chan 0a0410d506 -C, --clean-fakefs 2023-05-01 01:20:11 +08:00
Nick Chan 5f8b503ae3 skill issue 2023-04-30 01:20:39 +08:00
Nick Chan 9e253f98f4 -D_XOPEN_SOURCE=500 2023-04-30 01:10:08 +08:00
0x6ff d17af1fbc7 chore: fix inconsistencies inside control files for .deb creation (#388)
* chore: fix inconsistency

* chore: fix inconsistency 2
2023-04-29 12:48:34 -04:00
Nick Chan f3920b883d remove _GNU_SOURCE 2023-04-28 11:08:34 +08:00
Tom E 1abfdf5441 might or might not have accidentally deleted this 2023-04-27 17:34:19 -04:00
Tom E 1c3613c669 Fix the A9 and lower restart bug. 2023-04-27 16:29:23 -04:00
Nick Chan 627f9b3363 reserved kerninfo values 2023-04-27 23:10:28 +08:00
ねむい 388ae6f296 update palera1n.1: PongoOS url 2023-04-27 15:57:42 +09:00
ねむい 24a09bc44d Update readme: apple silicon macs 2023-04-27 15:57:30 +09:00
Nick Chan 5ea3237772 update credits 2023-04-26 14:07:26 +08:00
Nick Chan 9c094fc19f fix some compiler warnings 2023-04-25 02:00:00 +08:00
Nick Chan 2912dfd8c0 update palera1n.1 2023-04-25 00:11:18 +08:00
Nick Chan a3fa59eaa8 sneak 2023-04-24 03:43:25 +08:00
Nick Chan 290bcb143e Revert "fix: limd-glue FTBFS with latest libplist"
This reverts commit 1422d45a9f.
2023-04-22 22:19:00 +08:00
Nick Chan bb9fdde26e Revert "fix harder"
This reverts commit fe565b97ad.
2023-04-22 22:18:52 +08:00
justtryingthingsout a9e72b579e Add more error checking and improved readability 2023-04-20 20:47:37 +08:00
Nick Chan fe565b97ad fix harder 2023-04-19 11:29:40 +08:00
Nick Chan 1422d45a9f fix: limd-glue FTBFS with latest libplist 2023-04-19 11:22:38 +08:00
Nick Chan 869f0fc070 s/16.4/16.4.1/ 2023-04-18 19:21:46 +08:00
0x6ff cc1a865a86 chore: elaborate on ignoring non arm64 device (#382)
people don't read.
to save people from asking in the Discord what "Ignoring non-arm64 device.." means, elaborate.
2023-04-15 15:33:07 -04:00
Nick Chan 5ce2196268 docs: mention another bug 2023-04-09 16:01:38 +08:00
azreal fe50b7c966 Update dfuhelper.c grammer (#380) 2023-04-06 13:28:48 +08:00
Nebula e02d977c5d chore: add new patreon 2023-04-05 21:50:19 -04:00
ねむい d82965f140 disable verbose boot if bootargs has 'serial=' str 2023-03-31 01:24:56 +09:00
Nick Chan 2623569d67 bakepale sounds better 2023-03-30 12:34:37 +08:00
Nick Chan 2637758372 s/16\.3\.1/16.4/g 2023-03-30 07:01:17 +08:00
Nick Chan 87a2f6b60b baked palera1n 2023-03-29 19:43:55 +08:00
Nick Chan 5e1291d7c4 add long only option in synposis 2023-03-29 18:52:02 +08:00
Nick Chan 1214aed3a7 make tui a build option 2023-03-29 18:46:01 +08:00
Nick Chan e96cd19295 remove a warning even if it is still true atm 2023-03-29 18:02:11 +08:00
Nick Chan f37643b93e ifdef ROOTFUL 2023-03-29 12:22:58 +08:00
Nick Chan 2a9f65c870 debug libusbmuxd 2023-03-28 23:38:54 +08:00
Nick Chan 11b594bec6 fixes 2023-03-28 23:17:29 +08:00
Nick Chan 047b334752 changes 2023-03-28 20:43:19 +08:00
Nick Chan c2bb49287a plush features 2023-03-28 12:43:46 +08:00
Nick Chan 2d932dd26b fix POSIX 2002 C 2023-03-25 13:40:45 +08:00
Nick Chan 03e6739bc9 stop defining _DARWIN_C_SOURCE 2023-03-25 13:36:03 +08:00
junepark678 b360e8dd02 add lto and debug symbols so we can generate the .dSYM (#376)
* add lto and debug symbols so we can generate the .DSYM

* add lto and debug symbols so we can generate the .DSYM

* fix pythonplayer moment
2023-03-23 22:13:21 +08:00
junepark678 d72e95fccc Make unrelated PRs not rebuild (#375)
(this isn’t tested, and there’s no way for me to know if it works)
2023-03-22 19:16:40 +08:00
junepark678 60f241e0db fixing discord links (proofread pass 1) (#374)
* fixing discord links (proofread pass 1)

* fix readme text (thanks ploosh)
2023-03-22 07:04:51 -04:00
junepark678 9a7d6151ae add logo that you can actually read for light mode users (#373) 2023-03-22 07:04:22 -04:00
Nick Chan ac34d4d2be revert adding version number
that would result in debs piling up on my server
i should just rename them when copying them over to
the release folder
2023-03-22 18:33:51 +08:00
junepark678 8cae820cb8 add guide to readme (#372) 2023-03-22 18:26:48 +08:00
Nick Chan b89fd2b915 use ~ 2023-03-22 18:26:22 +08:00
Nick Chan 4070ed9da9 2023-03-22 18:09:51 +08:00
Nick Chan 6c7f666bb3 fix @itsnebulalol moment
DONT PUT MACOS BUILD INTO AN IOS DEB
2023-03-22 17:47:35 +08:00
Nick Chan 36fc50d2f1 actually commit the macos control 2023-03-22 15:24:11 +08:00
Nick Chan 15b2372daa Do not depend usbmuxd on macOS 2023-03-22 15:22:56 +08:00
Nick Chan b7b52febe3 Depend usbmuxd 2023-03-22 15:18:07 +08:00
Nick Chan a29a279693 remove ohio 2023-03-22 12:11:04 +08:00
Nebula b693f1af29 fix: procursus bins go into $prefix/bin, chmod too 2023-03-21 20:29:45 -04:00
Nebula 41f7909597 fix: remove v from version string 2023-03-21 20:05:24 -04:00
Nebula 52167fc32d fix: i think this is better 2023-03-21 19:54:45 -04:00
Nebula a060fe7374 chore: edit deb names 2023-03-21 19:47:30 -04:00
Nebula f6450e0a5d fix: im going to cry 2023-03-21 19:29:29 -04:00
Nebula 6dec16ff2b fix: linux ARCH_NAME 2023-03-21 19:23:24 -04:00
Nebula 8807f4775f fix: version in control 2023-03-21 19:17:17 -04:00
Nebula 4b0457b6ee fix: macos deb building 2023-03-21 19:09:57 -04:00
Nebula 6e05ecd1f9 chore: add mandoc to linux build 2023-03-21 18:59:32 -04:00
Nebula 16cbb134aa fix: macos deb builds, actually this time 2023-03-21 18:45:24 -04:00
Nebula f267c3e714 fix: linux deb build (I hate this) 2023-03-21 18:32:23 -04:00
Nebula e4f46c4276 fix: i dont know anymore 2023-03-21 18:26:49 -04:00
Nebula 67b9b86940 fix: linux deb build and possibly macos 2023-03-21 18:11:41 -04:00
Nebula 3f73bd0b31 fix: github moment? 2023-03-21 17:51:42 -04:00
Nebula 8aca098801 fix: build linux debs 2023-03-21 17:49:16 -04:00
Nebula 831794f5eb chore: add deb creation to workflow 2023-03-21 17:38:26 -04:00
Nick Chan 5eb0a08727 credits goes to stderr 2023-03-21 09:46:47 +08:00
Nick Chan 4572ed5984 more doc fixes 2023-03-21 00:10:34 +08:00
Nick Chan e81a06513a update docs/palera1n.1 2023-03-20 23:47:21 +08:00
Nick Chan c17107da40 Add -S, --no-colors 2023-03-15 16:43:25 +08:00
43 changed files with 945 additions and 1048 deletions

No files matched your search

+182 -294
View File
@@ -11,12 +11,20 @@ on:
- 'CMakeLists.txt' - 'CMakeLists.txt'
- '.github/workflows/build.yml' - '.github/workflows/build.yml'
pull_request: pull_request:
paths:
- 'src/**'
- 'docs/**'
- 'patches/**'
- 'include/**'
- 'Makefile'
- 'CMakeLists.txt'
- '.github/workflows/build.yml'
workflow_dispatch: workflow_dispatch:
jobs: jobs:
build-docs: build-docs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
@@ -31,248 +39,22 @@ jobs:
mkdir ready mkdir ready
cp docs/*.html docs/mandoc.css docs/palera1n.1 ready cp docs/*.html docs/mandoc.css docs/palera1n.1 ready
- name: Get branch name
id: branch-name
uses: tj-actions/branch-names@v7
- name: Upload artifact - name: Upload artifact
if: ${{ github.event_name != 'pull_request' }} if: ${{ github.event_name != 'pull_request' }}
uses: wangyucode/sftp-upload-action@v1.4.8 uses: wangyucode/sftp-upload-action@v2.0.2
with: with:
host: ${{ secrets.NICKCHAN_FTP_HOST }} host: ${{ secrets.NICKCHAN_FTP_HOST }}
port: ${{ secrets.NICKCHAN_FTP_PORT }} port: ${{ secrets.NICKCHAN_FTP_PORT }}
username: palera1n username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }} password: ${{ secrets.NICKCHAN_FTP_PASS }}
forceUpload: true forceUpload: true
dryRun: false dryRun: false
localDir: 'ready/' localDir: 'ready/'
remoteDir: '/palera1n/artifacts/c-rewrite' remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref_name }}/${{ github.run_number }}"
build-loader:
runs-on: macos-12
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Get loader commit
run: echo "LOADER_COMMIT=$(git -C src/loader rev-parse HEAD)" >> $GITHUB_ENV
- name: Cache compile
id: loader_cache
uses: actions/cache@v3
with:
path: src/loader/packages
key: loader-${{ env.LOADER_COMMIT }}
- name: Install dependencies (packages)
if: steps.loader_cache.outputs.cache-hit != 'true'
run: |
curl -LO https://github.com/ProcursusTeam/ldid/releases/download/v2.1.5-procursus7/ldid_macosx_x86_64
sudo install -m755 ldid_macosx_x86_64 /usr/local/bin/ldid
- name: Compile
if: steps.loader_cache.outputs.cache-hit != 'true'
run: make -C src/loader
- name: Upload loader
uses: actions/upload-artifact@v3
with:
name: palera1n.ipa
path: src/loader/packages/palera1n.ipa
retention-days: 1
build-binpack:
needs: build-loader
runs-on: macos-12
steps:
- name: Cache Procursus
uses: actions/cache@v3
id: procache
with:
path: |
~/__cache
key: ${{ runner.os }}-procursus
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Get binpack commit
run: echo "BINPACK_COMMIT=$(git -C src/binpack rev-parse HEAD)" >> $GITHUB_ENV
- name: Cache binpack.tgz
uses: actions/cache@v3
id: binpack_cache
with:
path: src/jbinit/binpack.tgz
key: binpack-${{ env.BINPACK_COMMIT }}
- name: Download loader
uses: actions/download-artifact@v3
with:
name: palera1n.ipa
path: src/jbinit/palera1n.ipa
- name: Checkout Procursus
if: steps.binpack_cache.outputs.cache-hit != 'true'
uses: actions/checkout@v3
with:
repository: ProcursusTeam/Procursus
path: src/Procursus
- name: Setup Procursus Bootstrap (install)
if: steps.procache.outputs.cache-hit != 'true' && steps.binpack_cache.outputs.cache-hit != 'true'
run: |
wget https://apt.procurs.us/bootstraps/big_sur/bootstrap-darwin-amd64.tar.zst
sudo gtar --preserve-permissions -xkf ./bootstrap-darwin-amd64.tar.zst -C /
echo '/opt/procursus/sbin:/opt/procursus/bin' >> $GITHUB_PATH
PATH=/opt/procursus/sbin:/opt/procursus/bin:$PATH sudo /opt/procursus/bin/apt update
sudo /opt/procursus/bin/apt -V full-upgrade -y || :
sudo /opt/procursus/bin/apt install asciidoc autoconf autoconf-archive automake autopoint bash bison cmake docbook-xml docbook-xsl fakeroot findutils flex file gawk git gnupg gpgrt-tools groff gzip ldid libtool libltdl-dev llvm make ncurses-bin openssl patch pkg-config po4a python3 sed tar triehash wget xz-utils zstd -y
- name: Add Procursus to PATH
if: steps.binpack_cache.outputs.cache-hit != 'true'
run: |
echo '/opt/procursus/sbin:/opt/procursus/bin' >> $GITHUB_PATH
- name: Setup Procursus Bootstrap (cache)
if: steps.procache.outputs.cache-hit == 'true' && steps.binpack_cache.outputs.cache-hit != 'true'
run: |
sudo mkdir -p ~/__cache/procursus/var/cache/apt/archives/partial ~/__cache/procursus/var/lib/apt/lists/partial
sudo rsync -aP ~/__cache/procursus /opt
sudo /opt/procursus/bin/apt update
sudo /opt/procursus/bin/apt --allow-downgrades -V dist-upgrade -y
sudo /opt/procursus/bin/apt --allow-downgrades -V dist-upgrade -y
- name: Build binpack
if: steps.binpack_cache.outputs.cache-hit != 'true'
run: |
cd src/binpack
gmake MEMO_CFVER=1800 MEMO_PREFIX=/cores/binpack MEMO_TARGET=iphoneos-arm64 binpack
cd ../..
- name: Process binpack.tar into binpack.tgz
if: steps.binpack_cache.outputs.cache-hit != 'true'
run: |
cd src/jbinit
cp ../binpack/build_strap/iphoneos-arm64/1800/binpack.tar .
sudo tar --preserve-permissions -xf binpack.tar
sudo cp -R cores/binpack .
sudo chown $UID:$GID .
sudo mkdir -p binpack/Library/LaunchDaemons
sudo sed 's|/binpack|/cores/binpack|' binpack/usr/share/dropbear.plist.example | sudo tee binpack/Library/LaunchDaemons/dropbear.plist
sudo rm -rf binpack/usr/share/dropbear.plist.example
sudo plutil -convert binary1 binpack/Library/LaunchDaemons/dropbear.plist
sudo chown 0:0 binpack/Library/LaunchDaemons/dropbear.plist
sudo gchmod 755 -R binpack/Library
sudo gchmod 644 binpack/Library/LaunchDaemons/dropbear.plist
tar -zcf binpack.tgz binpack
cd ../..
- name: Generate binpack.dmg
run: |
cd src/jbinit
sudo gmake binpack.dmg
cd ../..
- name: Upload binpack
uses: actions/upload-artifact@v3
with:
name: binpack.dmg
path: src/jbinit/binpack.dmg
retention-days: 1
- name: Copy Procursus to Cache Location
run: |
sudo mkdir -p ~/__cache
sudo rsync -aP /opt/procursus ~/__cache
sudo rm -rf ~/__cache/procursus/var/cache/apt/archives/partial ~/__cache/procursus/var/lib/apt/lists/partial ~/__cache/procursus/Library/dpkg/triggers/Lock
build-jbinit:
runs-on: macos-12
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Get jbinit commit
run: echo "JBINIT_COMMIT=$(git -C src/jbinit rev-parse HEAD)" >> $GITHUB_ENV
- name: Cache jbinit
uses: actions/cache@v3
id: jbinit_cache
with:
path: src/jbinit/ramdisk.dmg
key: jbinit-${{ env.JBINIT_COMMIT }}
- name: Download dependencies
if: steps.jbinit_cache.cache_hit != 'true'
run: |
brew install make coreutils
curl -LO https://github.com/ProcursusTeam/ldid/releases/download/v2.1.5-procursus7/ldid_macosx_x86_64
sudo install -m755 ldid_macosx_x86_64 /usr/local/bin/ldid
- name: Build jbinit
if: steps.jbinit_cache.cache_hit != 'true'
run: |
cd src/jbinit
git submodule update --init --recursive
sudo cp -a $(xcrun -sdk macosx --show-sdk-path)/usr/include/{xpc,{launch,bootstrap}.h} $(xcrun -sdk iphoneos --show-sdk-path)/usr/include
sudo sed -i.bak -Ee 's/API_UNAVAILABLE\(.*\)//g' $(xcrun -sdk iphoneos --show-sdk-path)//System/Library/Frameworks/CoreFoundation.framework/Headers/CFUserNotification.h
sudo sed -i.bak -e 's/;}/;/g' $(xcrun -sdk iphoneos --show-sdk-path)//System/Library/Frameworks/CoreFoundation.framework/Headers/CFUserNotification.h
sudo sed -i.bak -e 's/__UNAVAILABLE_PUBLIC_IOS;/;/g' $(xcrun -sdk iphoneos --show-sdk-path)/System/Library/Frameworks/IOKit.framework/Headers/IOKitLib.h
ruby -e "File.write(ARGV[0], File.read(ARGV[0]).gsub(ARGV[1]) { ARGV[2] })" $(xcrun -sdk iphoneos --show-sdk-path)/System/Library/Frameworks/IOKit.framework/Headers/IOKitLib.h '__API_DEPRECATED_WITH_REPLACEMENT("kIOMainPortDefault", macos(10.0, 12.0)) __API_UNAVAILABLE(ios, watchos, tvos);' '__API_DEPRECATED_WITH_REPLACEMENT("kIOMainPortDefault", macos(10.0, 12.0)) /*__API_UNAVAILABLE(ios, watchos, tvos)*/;'
sudo chown $UID:$GID .
sudo gmake -j$(sysctl -n hw.ncpu) ramdisk.dmg
- name: Upload ramdisk
uses: actions/upload-artifact@v3
with:
name: ramdisk.dmg
path: src/jbinit/ramdisk.dmg
retention-days: 1
build-kpf:
runs-on: ubuntu-20.04
steps:
- name: Install toolchain
run: |
echo 'deb https://assets.checkra.in/debian /' | sudo tee /etc/apt/sources.list.d/checkra1n.list
sudo apt-key adv --fetch-keys https://assets.checkra.in/debian/archive.key
sudo apt-get update
sudo apt-get install -y ld64 cctools-strip
- name: Checkout repository
uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: true
- name: Get Pongo commit
run: echo "PONGO_COMMIT=$(git -C src/PongoOS rev-parse HEAD)" >> $GITHUB_ENV
- name: Voodoo magic
id: voodoo
uses: actions/cache@v2
with:
key: ${{ github.event_name }}-${{ env.PONGO_COMMIT }}-${{ github.run_id }}
restore-keys: |
pongo-${{ env.PONGO_COMMIT }}-
pongo-
path: |
src/PongoOS/**
- name: Compile
run: |
cd src/PongoOS
EMBEDDED_CC='clang-10' EMBEDDED_AR='llvm-ar-10' EMBEDDED_RANLIB='llvm-ranlib-10' DEV_BUILD=1 make build/checkra1n-kpf-pongo
- name: Upload checkra1n-kpf-pongo
uses: actions/upload-artifact@v3
with:
name: checkra1n-kpf-pongo
path: src/PongoOS/build/checkra1n-kpf-pongo
retention-days: 1
build-darwin: build-darwin:
strategy: strategy:
@@ -291,9 +73,8 @@ jobs:
os: iphoneos os: iphoneos
minos: 7.0 minos: 7.0
runs-on: macos-12 runs-on: macos-12
needs: [build-loader, build-jbinit, build-binpack, build-kpf]
env: env:
MBEDTLS_VERSION: 3.3.0 MBEDTLS_VERSION: 3.4.0
READLINE_VERSION: 8.2 READLINE_VERSION: 8.2
SLANG_VERSION: 2.3.3 SLANG_VERSION: 2.3.3
NEWT_VERSION: 0.52.23 NEWT_VERSION: 0.52.23
@@ -316,24 +97,6 @@ jobs:
- name: Download dependencies (embedded binaries) - name: Download dependencies (embedded binaries)
run: | run: |
echo "SDK=$(xcrun -sdk ${{ matrix.os }} --show-sdk-path)" >> $GITHUB_ENV echo "SDK=$(xcrun -sdk ${{ matrix.os }} --show-sdk-path)" >> $GITHUB_ENV
- name: Download binpack.dmg
uses: actions/download-artifact@v3
with:
name: binpack.dmg
path: src/palera1n/binpack.dmg
- name: Download ramdisk.dmg
uses: actions/download-artifact@v3
with:
name: ramdisk.dmg
path: src/palera1n/ramdisk.dmg
- name: Download checkra1n-kpf-pongo
uses: actions/download-artifact@v3
with:
name: checkra1n-kpf-pongo
path: src/palera1n/checkra1n-kpf-pongo
- name: Download dependencies (source code) - name: Download dependencies (source code)
run: | run: |
@@ -369,7 +132,7 @@ jobs:
echo "CC=$(xcrun --find cc)" >> $GITHUB_ENV echo "CC=$(xcrun --find cc)" >> $GITHUB_ENV
echo "CXX=$(xcrun --find c++)" >> $GITHUB_ENV echo "CXX=$(xcrun --find c++)" >> $GITHUB_ENV
echo "CPP=$(xcrun --find cc) -E" >> $GITHUB_ENV echo "CPP=$(xcrun --find cc) -E" >> $GITHUB_ENV
echo "CFLAGS=-g -Os -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isysroot ${{ env.SDK }} -isystem $(pwd)/sysroot/usr/local/include -Os" >> $GITHUB_ENV echo "CFLAGS=-g -Os -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isysroot ${{ env.SDK }} -isystem $(pwd)/sysroot/usr/local/include -Os -g -flto=full -Wl,-object_path_lto,lto.o" >> $GITHUB_ENV
echo "CPPFLAGS=-g -Os -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isysroot ${{ env.SDK }} -isystem $(pwd)/sysroot/usr/local/include -Wno-error-implicit-function-declaration -Os" >> $GITHUB_ENV echo "CPPFLAGS=-g -Os -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isysroot ${{ env.SDK }} -isystem $(pwd)/sysroot/usr/local/include -Wno-error-implicit-function-declaration -Os" >> $GITHUB_ENV
echo "CXXFLAGS=-stdlib=libc++ -g -Os -isysroot ${{ env.SDK }} -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isystem $(pwd)/sysroot/usr/local/include -Os" >> $GITHUB_ENV echo "CXXFLAGS=-stdlib=libc++ -g -Os -isysroot ${{ env.SDK }} -arch ${{ matrix.arch }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -isystem $(pwd)/sysroot/usr/local/include -Os" >> $GITHUB_ENV
echo "LDFLAGS=-g -Wl,-dead_strip -arch ${{ matrix.arch }} -isysroot ${{ env.SDK }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -L$(pwd)/sysroot/usr/local/lib" >> $GITHUB_ENV echo "LDFLAGS=-g -Wl,-dead_strip -arch ${{ matrix.arch }} -isysroot ${{ env.SDK }} -m${{ matrix.os }}-version-min=${{ matrix.minos }} -L$(pwd)/sysroot/usr/local/lib" >> $GITHUB_ENV
@@ -566,18 +329,22 @@ jobs:
mkdir -p ready mkdir -p ready
tar -zcf ready/dep_root-${{ matrix.os }}-${{ matrix.arch }}.tgz dep_root tar -zcf ready/dep_root-${{ matrix.os }}-${{ matrix.arch }}.tgz dep_root
- name: Get branch name
id: branch-name
uses: tj-actions/branch-names@v7
- name: Upload artifact - name: Upload artifact
if: ${{ github.event_name != 'pull_request' }} if: ${{ github.event_name != 'pull_request' }}
uses: wangyucode/sftp-upload-action@v1.4.8 uses: wangyucode/sftp-upload-action@v2.0.2
with: with:
host: ${{ secrets.NICKCHAN_FTP_HOST }} host: ${{ secrets.NICKCHAN_FTP_HOST }}
port: ${{ secrets.NICKCHAN_FTP_PORT }} port: ${{ secrets.NICKCHAN_FTP_PORT }}
username: palera1n username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }} password: ${{ secrets.NICKCHAN_FTP_PASS }}
forceUpload: true forceUpload: true
dryRun: false dryRun: false
localDir: 'ready/' localDir: 'ready/'
remoteDir: '/palera1n/artifacts/c-rewrite' remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref }}/${{ github.run_number }}"
- name: Upload ${{ matrix.os }} thin ${{ matrix.arch }} build - name: Upload ${{ matrix.os }} thin ${{ matrix.arch }} build
if: ${{ github.event_name != 'pull_request' }} if: ${{ github.event_name != 'pull_request' }}
@@ -594,12 +361,24 @@ jobs:
name: palera1n-${{ matrix.os }}-${{ matrix.arch }}.dSYM name: palera1n-${{ matrix.os }}-${{ matrix.arch }}.dSYM
path: palera1n-${{ matrix.os }}-${{ matrix.arch }}.dSYM path: palera1n-${{ matrix.os }}-${{ matrix.arch }}.dSYM
retention-days: 1 retention-days: 1
darwin-dist: darwin-dist:
if: ${{ github.event_name != 'pull_request' }} if: ${{ github.event_name != 'pull_request' }}
runs-on: macos-latest runs-on: macos-latest
needs: build-darwin needs: build-darwin
steps: steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Setup Procursus
uses: beerpiss/[email protected]
with:
packages: sed coreutils
cache: true
mirror: 'https://procursus.itsnebula.net/'
- name: Download all Darwin artifacts - name: Download all Darwin artifacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
@@ -614,22 +393,107 @@ jobs:
cp palera1n-macos ready/palera1n-macos-universal cp palera1n-macos ready/palera1n-macos-universal
cp ./palera1n-macosx-x86_64/palera1n-macosx-x86_64 ready/palera1n-macos-x86_64 cp ./palera1n-macosx-x86_64/palera1n-macosx-x86_64 ready/palera1n-macos-x86_64
cp ./palera1n-macosx-arm64/palera1n-macosx-arm64 ready/palera1n-macos-arm64 cp ./palera1n-macosx-arm64/palera1n-macosx-arm64 ready/palera1n-macos-arm64
cp ./palera1n-iphoneos-arm64/palera1n-iphoneos-arm64 ready/palera1n-ios zip -r9 ready/palera1n-iphoneos-arm64.dSYM.zip palera1n-iphoneos-arm64.dSYM
zip -r9 ready/palera1n-ios.dSYM.zip palera1n-iphoneos-arm64.dSYM
zip -r9 ready/palera1n-macos.dSYM.zip palera1n-macos.dSYM zip -r9 ready/palera1n-macos.dSYM.zip palera1n-macos.dSYM
- name: Build debs
run: |
make -j$(sysctl -n hw.ncpu) docs
version=$(git describe --dirty --tags --abbrev=7 | sed 's|^v||' | sed 's|-beta|~beta|')
# Darwin x86_64
mkdir -p stage/DEBIAN
mkdir -p stage/opt/procursus/bin
mkdir -p stage/opt/procursus/usr/share/man/man1
cp packaging/control.macosx stage/DEBIAN/control
gsed 's|@DEB_ARCH@|darwin-amd64|g' -i stage/DEBIAN/control
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
ginstall -Dm644 ready/palera1n-macos-x86_64 stage/opt/procursus/bin/palera1n
ginstall -Dm644 docs/palera1n.1 stage/opt/procursus/usr/share/man/man1/palera1n.1
chmod +x stage/opt/procursus/bin/palera1n
dpkg-deb -Zzstd -b stage palera1n_darwin-amd64.deb
mv palera1n*.deb ready/
rm -rf stage
# Darwin arm64
mkdir -p stage/DEBIAN
mkdir -p stage/opt/procursus/bin
mkdir -p stage/opt/procursus/usr/share/man/man1
cp packaging/control.macosx stage/DEBIAN/control
gsed 's|@DEB_ARCH@|darwin-arm64|g' -i stage/DEBIAN/control
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
ginstall -Dm644 ready/palera1n-macos-arm64 stage/opt/procursus/bin/palera1n
ginstall -Dm644 docs/palera1n.1 stage/opt/procursus/usr/share/man/man1/palera1n.1
chmod +x stage/opt/procursus/bin/palera1n
dpkg-deb -Zzstd -b stage palera1n_darwin-arm64.deb
mv palera1n*.deb ready/
rm -rf stage
# iPhoneOS
mkdir -p stage/DEBIAN
mkdir -p stage/usr/bin
mkdir -p stage/usr/share/man/man1
cp packaging/control stage/DEBIAN/control
gsed 's|@DEB_ARCH@|iphoneos-arm|g' -i stage/DEBIAN/control
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
ginstall -Dm644 ready/palera1n-iphoneos-arm64 stage/usr/bin/palera1n
ginstall -Dm644 docs/palera1n.1 stage/usr/share/man/man1/palera1n.1
chmod +x stage/usr/bin/palera1n
dpkg-deb -Zzstd -b stage palera1n_iphoneos-arm.deb
mv palera1n*.deb ready/
rm -rf stage
# iPhoneOS (rootless)
mkdir -p stage/DEBIAN
mkdir -p stage/var/jb/usr/bin
mkdir -p stage/var/jb/usr/share/man/man1
cp packaging/control stage/DEBIAN/control
gsed 's|@DEB_ARCH@|iphoneos-arm64|g' -i stage/DEBIAN/control
gsed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
ginstall -Dm644 ready/palera1n-iphoneos-arm64 stage/var/jb/usr/bin/palera1n
ginstall -Dm644 docs/palera1n.1 stage/var/jb/usr/share/man/man1/palera1n.1
chmod +x stage/var/jb/usr/bin/palera1n
dpkg-deb -Zzstd -b stage palera1n_iphoneos-arm64.deb
mv palera1n*.deb ready/
rm -rf stage
- name: Save build tag
run: echo "$(git describe --dirty --tags --abbrev=7 | sed 's|-dirty||')" > build-tag.txt
- name: Upload build tag
uses: actions/upload-artifact@v3
with:
name: build-tag
path: build-tag.txt
- name: Get branch name
id: branch-name
uses: tj-actions/branch-names@v7
- name: Upload artifact - name: Upload artifact
if: ${{ github.event_name != 'pull_request' }} if: ${{ github.event_name != 'pull_request' }}
uses: wangyucode/sftp-upload-action@v1.4.8 uses: wangyucode/sftp-upload-action@v2.0.2
with: with:
host: ${{ secrets.NICKCHAN_FTP_HOST }} host: ${{ secrets.NICKCHAN_FTP_HOST }}
port: ${{ secrets.NICKCHAN_FTP_PORT }} port: ${{ secrets.NICKCHAN_FTP_PORT }}
username: palera1n username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }} password: ${{ secrets.NICKCHAN_FTP_PASS }}
forceUpload: true forceUpload: true
dryRun: false dryRun: false
localDir: 'ready/' localDir: 'ready/'
remoteDir: '/palera1n/artifacts/c-rewrite' remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref }}/${{ github.run_number }}"
build-Linux: build-Linux:
strategy: strategy:
@@ -640,9 +504,8 @@ jobs:
- armel-linux-musleabi - armel-linux-musleabi
- aarch64-linux-musl - aarch64-linux-musl
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [build-loader, build-jbinit, build-binpack, build-kpf]
env: env:
MBEDTLS_VERSION: 3.3.0 MBEDTLS_VERSION: 3.4.0
LIBUSB_VERSION: 1.0.26 LIBUSB_VERSION: 1.0.26
READLINE_VERSION: 8.2 READLINE_VERSION: 8.2
SLANG_VERSION: 2.3.3 SLANG_VERSION: 2.3.3
@@ -659,7 +522,7 @@ jobs:
- name: Install build dependencies (packages) - name: Install build dependencies (packages)
run: | run: |
sudo apt-get remove -y libssl-dev libreadline-dev sudo apt-get remove -y libssl-dev libreadline-dev
sudo apt-get install -y pkg-config autoconf automake autopoint sudo apt-get install -y pkg-config autoconf automake autopoint mandoc
sudo pip3 install jsonschema jinja2 sudo pip3 install jsonschema jinja2
- name: Download toolchain checksum - name: Download toolchain checksum
@@ -679,24 +542,6 @@ jobs:
run: | run: |
curl -LO https://musl.cc/${{ matrix.triple }}-cross.tgz curl -LO https://musl.cc/${{ matrix.triple }}-cross.tgz
- name: Download binpack.dmg
uses: actions/download-artifact@v3
with:
name: binpack.dmg
path: src/palera1n/binpack.dmg
- name: Download ramdisk.dmg
uses: actions/download-artifact@v3
with:
name: ramdisk.dmg
path: src/palera1n/ramdisk.dmg
- name: Download checkra1n-kpf-pongo
uses: actions/download-artifact@v3
with:
name: checkra1n-kpf-pongo
path: src/palera1n/checkra1n-kpf-pongo
- name: Setup environment - name: Setup environment
run: | run: |
tar -xf ${{ matrix.triple }}-cross.tgz tar -xf ${{ matrix.triple }}-cross.tgz
@@ -705,15 +550,19 @@ jobs:
case ${{ matrix.triple }} in case ${{ matrix.triple }} in
i486-linux-musl) i486-linux-musl)
echo "CHECKRA1N_NAME=linux-x86" >> $GITHUB_ENV echo "CHECKRA1N_NAME=linux-x86" >> $GITHUB_ENV
echo "ARCH_NAME=i386" >> $GITHUB_ENV
;; ;;
x86_64-linux-musl) x86_64-linux-musl)
echo "CHECKRA1N_NAME=linux-x86_64" >> $GITHUB_ENV echo "CHECKRA1N_NAME=linux-x86_64" >> $GITHUB_ENV
echo "ARCH_NAME=amd64" >> $GITHUB_ENV
;; ;;
armel-linux-musleabi) armel-linux-musleabi)
echo "CHECKRA1N_NAME=linux-armel" >> $GITHUB_ENV echo "CHECKRA1N_NAME=linux-armel" >> $GITHUB_ENV
echo "ARCH_NAME=armel" >> $GITHUB_ENV
;; ;;
aarch64-linux-musl) aarch64-linux-musl)
echo "CHECKRA1N_NAME=linux-arm64" >> $GITHUB_ENV echo "CHECKRA1N_NAME=linux-arm64" >> $GITHUB_ENV
echo "ARCH_NAME=arm64" >> $GITHUB_ENV
;; ;;
esac esac
echo "PKG_CONFIG_PATH=$(pwd)/sysroot/usr/local/lib/pkgconfig" >> $GITHUB_ENV echo "PKG_CONFIG_PATH=$(pwd)/sysroot/usr/local/lib/pkgconfig" >> $GITHUB_ENV
@@ -727,6 +576,7 @@ jobs:
echo "CROSS_COMPILE=${{ matrix.triple }}-" >> $GITHUB_ENV echo "CROSS_COMPILE=${{ matrix.triple }}-" >> $GITHUB_ENV
mkdir -p $(pwd)/sysroot/usr/local/lib mkdir -p $(pwd)/sysroot/usr/local/lib
ln -sf $(pwd)/sysroot/usr/local/lib{,64} ln -sf $(pwd)/sysroot/usr/local/lib{,64}
- name: Download dependencies (source code) - name: Download dependencies (source code)
run: | run: |
curl -LOOOOOOO \ curl -LOOOOOOO \
@@ -920,25 +770,63 @@ jobs:
mv src/palera1n ready/palera1n-${{ env.CHECKRA1N_NAME }} mv src/palera1n ready/palera1n-${{ env.CHECKRA1N_NAME }}
tar -zcf ready/dep_root_${{ matrix.triple }}.tgz dep_root tar -zcf ready/dep_root_${{ matrix.triple }}.tgz dep_root
- name: Build debs
run: |
version=$(git describe --dirty --tags --abbrev=7 | sed 's|^v||' | sed 's|-beta|~beta|')
make -j$(nproc) docs
mkdir -p stage/DEBIAN
mkdir -p stage/usr/bin
mkdir -p stage/usr/share/man/man1
cp packaging/control stage/DEBIAN/control
sed 's|@DEB_ARCH@|${{ env.ARCH_NAME }}|g' -i stage/DEBIAN/control
sed "s|@DEB_VERSION@|$version|g" -i stage/DEBIAN/control
install -Dm644 ready/palera1n-${{ env.CHECKRA1N_NAME }} stage/usr/bin/palera1n
install -Dm644 docs/palera1n.1 stage/usr/share/man/man1/palera1n.1
chmod +x stage/usr/bin/palera1n
dpkg-deb -b stage palera1n_${{ env.ARCH_NAME }}.deb
mv palera1n*.deb ready/
rm -rf stage
- name: Get branch name
id: branch-name
uses: tj-actions/branch-names@v7
- name: Upload artifact - name: Upload artifact
if: ${{ github.event_name != 'pull_request' }} if: ${{ github.event_name != 'pull_request' }}
uses: wangyucode/sftp-upload-action@v1.4.8 uses: wangyucode/sftp-upload-action@v2.0.2
with: with:
host: ${{ secrets.NICKCHAN_FTP_HOST }} host: ${{ secrets.NICKCHAN_FTP_HOST }}
port: ${{ secrets.NICKCHAN_FTP_PORT }} port: ${{ secrets.NICKCHAN_FTP_PORT }}
username: palera1n username: palera1n
privateKey: ${{ secrets.NICKCHAN_FTP_KEY }} password: ${{ secrets.NICKCHAN_FTP_PASS }}
forceUpload: true forceUpload: true
dryRun: false dryRun: false
localDir: 'ready/' localDir: 'ready/'
remoteDir: '/palera1n/artifacts/c-rewrite' remoteDir: "/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch || github.ref }}/${{ github.run_number }}"
delete-artifacts: finish-build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [darwin-dist, build-Linux] if: ${{ github.event_name != 'pull_request' }}
needs: [build-docs, build-darwin, darwin-dist, build-Linux]
steps: steps:
- name: Delete all artifacts on GitHub - name: Checkout
uses: geekyeggo/delete-artifact@v2 uses: actions/checkout@v3
- name: Get branch name
id: branch-name
uses: tj-actions/branch-names@v7
- name: Download build tag
uses: actions/download-artifact@v3
with: with:
name: '*' name: build-tag
failOnError: false
- name: Send Discord build message
run: |
COMMITMESSAGE=`git log --pretty=format:'- \`%h\` %s' -1 --reverse` &&
(curl "${{ secrets.DISCORD_WEBHOOK }}" -sS -H "Content-Type:application/json" -X POST -d "{\"content\":null,\"embeds\":[{\"title\":\"[palera1n:${{ steps.branch-name.outputs.ref_branch }}] Nightly Build ${{ github.run_number }}\",\"url\":\"https://github.com/palera1n/palera1n/actions/runs/${GITHUB_RUN_ID}\",\"color\":2829617,\"fields\":[{\"name\":\"Build tag\",\"value\":\"- \`$(cat build-tag.txt | sed 's|\n||')\`\"},{\"name\":\"Destination\",\"value\":\"- https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}\"},{\"name\":\"Documentation\",\"value\":\"- [palera1n.1.html](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n.1.html)\"},{\"name\":\"Main Artifacts\",\"value\":\"- [palera1n-iphoneos-arm64](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-iphoneos-arm64)\n- [palera1n-linux-arm64](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-linux-arm64)\n- [palera1n-linux-armel](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-linux-armel)\n- [palera1n-linux-x86](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/$${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-linux-x86)\n- [palera1n-linux-x86_64](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-linux-x86_64)\n- [palera1n-macos-universal](https://cdn.nickchan.lol/palera1n/artifacts/c-rewrite/${{ steps.branch-name.outputs.ref_branch }}/${{ github.run_number }}/palera1n-macos-universal)\"}],\"footer\":{\"text\":\"${{ github.actor }}\", \"icon_url\": \"https://github.com/${{ github.actor }}.png\",\"timestamp\":\"$(date -u +"%FT%TZ")\"}}],\"username\":\"GitHub Actions\",\"avatar_url\":\"https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png\"}")
+8 -6
View File
@@ -7,17 +7,19 @@ contrib/
.vscode .vscode
checkra1n* checkra1n*
payload.c payload.c
src/palera1n/palera1n src/palera1n
!xxd-embedded.h !xxd-embedded.h
src/palera1n/binpack.dmg src/binpack.dmg
src/palera1n/ramdisk.dmg src/ramdisk.dmg
src/palera1n/xxd-*.c src/xxd-*.c
.DS_Store .DS_Store
!palera1n.1 !palera1n.1
palera1n.1.html palera1n.1.html
Payload Payload
docs/*.html docs/*.html
build build
src/palera1n/*.dmg.c src/*.dmg.c
.idea .idea
src/palera1n/libcheckra1nhelper.dylib* src/stage2/
src/libcheckra1nhelper.dylib*
src/Pongo.bin
-12
View File
@@ -1,12 +0,0 @@
[submodule "src/PongoOS"]
path = src/PongoOS
url = [email protected]:plooshi/PongoOS.git
[submodule "src/jbinit"]
path = src/jbinit
url = [email protected]:palera1n/jbinit.git
[submodule "src/loader"]
path = src/loader
url = [email protected]:palera1n/loader.git
[submodule "src/binpack"]
path = src/binpack
url = [email protected]:palera1n/binpack.git
+20 -12
View File
@@ -1,14 +1,14 @@
NAME = The Beginning of the End NAME = Dawn
SRC = $(shell pwd) SRC = $(shell pwd)
DEP = $(SRC)/dep_root DEP = $(SRC)/dep_root
STRIP = strip STRIP = strip
CC ?= cc CC ?= cc
CFLAGS += -I$(DEP)/include -I$(SRC)/include -I$(SRC) CFLAGS += -I$(DEP)/include -I$(SRC)/include -I$(SRC) -D_XOPEN_SOURCE=500
CFLAGS += -Wall -Wextra -DPALERAIN_VERSION=\"2.0.0\" -Wall -Wextra -Wno-unused-parameter CFLAGS += -Wall -Wextra -Wno-unused-parameter -DPALERAIN_VERSION=\"2.0.0\"
CFLAGS += -Wno-unused-variable -I$(SRC)/src/palera1n -std=c99 -pedantic-errors -D_C99_SOURCE -D_POSIX_C_SOURCE=200112L -D_DARWIN_C_SOURCE CFLAGS += -Wno-unused-variable -I$(SRC)/src -std=c99 -pedantic-errors -D_C99_SOURCE -D_POSIX_C_SOURCE=200112L
LIBS += $(DEP)/lib/libimobiledevice-1.0.a $(DEP)/lib/libirecovery-1.0.a $(DEP)/lib/libusbmuxd-2.0.a LIBS += $(DEP)/lib/libimobiledevice-1.0.a $(DEP)/lib/libirecovery-1.0.a $(DEP)/lib/libusbmuxd-2.0.a
LIBS += $(DEP)/lib/libimobiledevice-glue-1.0.a $(DEP)/lib/libplist-2.0.a -pthread LIBS += $(DEP)/lib/libimobiledevice-glue-1.0.a $(DEP)/lib/libplist-2.0.a -pthread -lm
ifeq ($(TARGET_OS),) ifeq ($(TARGET_OS),)
TARGET_OS = $(shell uname -s) TARGET_OS = $(shell uname -s)
endif endif
@@ -25,11 +25,13 @@ LDFLAGS += -static -no-pie -Wl,--gc-sections
endif endif
LIBS += $(DEP)/lib/libmbedtls.a $(DEP)/lib/libmbedcrypto.a $(DEP)/lib/libmbedx509.a $(DEP)/lib/libreadline.a LIBS += $(DEP)/lib/libmbedtls.a $(DEP)/lib/libmbedcrypto.a $(DEP)/lib/libmbedx509.a $(DEP)/lib/libreadline.a
ifeq ($(DEV_BUILD),1) ifeq ($(TUI),1)
LIBS += $(DEP)/lib/libnewt.a $(DEP)/lib/libpopt.a $(DEP)/lib/libslang.a LIBS += $(DEP)/lib/libnewt.a $(DEP)/lib/libpopt.a $(DEP)/lib/libslang.a
ifeq ($(TARGET_OS),Linux) ifeq ($(TARGET_OS),Linux)
LIBS += $(DEP)/lib/libgpm.a LIBS += $(DEP)/lib/libgpm.a
endif endif
endif
ifeq ($(DEV_BUILD),1)
CFLAGS += -O0 -g -DDEV_BUILD -fno-omit-frame-pointer CFLAGS += -O0 -g -DDEV_BUILD -fno-omit-frame-pointer
ifeq ($(ASAN),1) ifeq ($(ASAN),1)
BUILD_STYLE=ASAN BUILD_STYLE=ASAN
@@ -51,30 +53,36 @@ CFLAGS += -DBAKERAIN_DEVELOPE_R="\"$(BAKERAIN_DEVELOPE_R)\""
endif endif
BUILD_DATE := $(shell LANG=C date) BUILD_DATE := $(shell LANG=C date)
BUILD_NUMBER := $(shell git rev-list --count HEAD)
BUILD_TAG := $(shell git describe --dirty --tags --abbrev=7) BUILD_TAG := $(shell git describe --dirty --tags --abbrev=7)
BUILD_WHOAMI := $(shell whoami) BUILD_WHOAMI := $(shell whoami)
BUILD_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
BUILD_COMMIT := $(shell git rev-parse HEAD)
CFLAGS += -DBUILD_STYLE="\"$(BUILD_STYLE)\"" -DBUILD_DATE="\"$(BUILD_DATE)\"" -DBUILD_WHOAMI=\"$(BUILD_WHOAMI)\" -DBUILD_TAG=\"$(BUILD_TAG)\" CFLAGS += -DBUILD_STYLE="\"$(BUILD_STYLE)\"" -DBUILD_DATE="\"$(BUILD_DATE)\""
CFLAGS += -DBUILD_WHOAMI="\"$(BUILD_WHOAMI)\"" -DBUILD_TAG="\"$(BUILD_TAG)\""
CFLAGS += -DBUILD_NUMBER="\"$(BUILD_NUMBER)\"" -DBUILD_BRANCH="\"$(BUILD_BRANCH)\""
CFLAGS += -DBUILD_COMMIT="\"$(BUILD_COMMIT)\""
export SRC DEP CC CFLAGS LDFLAGS LIBS TARGET_OS DEV_BUILD BUILD_DATE BUILD_TAG BUILD_WHOAMI BUILD_STYLE export SRC DEP CC CFLAGS LDFLAGS LIBS TARGET_OS DEV_BUILD BUILD_DATE BUILD_TAG BUILD_WHOAMI BUILD_STYLE BUILD_NUMBER BUILD_BRANCH
all: palera1n all: palera1n
palera1n: download-deps palera1n: download-deps
$(MAKE) -C src/palera1n $(MAKE) -C src
clean: clean:
$(MAKE) -C src/palera1n clean $(MAKE) -C src clean
$(MAKE) -C docs clean $(MAKE) -C docs clean
download-deps: download-deps:
$(MAKE) -C src/palera1n checkra1n-macos checkra1n-linux-arm64 checkra1n-linux-armel checkra1n-linux-x86 checkra1n-linux-x86_64 checkra1n-kpf-pongo ramdisk.dmg binpack.dmg $(MAKE) -C src checkra1n-macos checkra1n-linux-arm64 checkra1n-linux-armel checkra1n-linux-x86 checkra1n-linux-x86_64 checkra1n-kpf-pongo ramdisk.dmg binpack.dmg Pongo.bin
docs: docs:
$(MAKE) -C docs $(MAKE) -C docs
distclean: clean distclean: clean
rm -rf palera1n-* palera1n*.dSYM src/checkra1n-* src/checkra1n-kpf-pongo src/ramdisk.dmg src/binpack.dmg rm -rf palera1n-* palera1n*.dSYM src/checkra1n-* src/checkra1n-kpf-pongo src/ramdisk.dmg src/binpack.dmg src/Pongo.bin
.PHONY: all palera1n clean docs distclean .PHONY: all palera1n clean docs distclean
+29 -60
View File
@@ -1,34 +1,34 @@
<img align="left" height="120" src="https://cdn.discordapp.com/attachments/1017854329887129611/1073858292159352862/thing.png" alt="palera1n logo" style="float: left;"/> <center>
<h3 align="right">An iOS 15.0-16.3.1 work-in-progress, <br>semi-tethered checkm8 jailbreak</h3> <a href="#"><img src="https://cdn.discordapp.com/attachments/1103485261196832779/1126450758523572285/pxd.png" alt="Logo"></a>
</center>
<p align="right" > <p align="center">
<strong><a href="https://cdn.nickchan.lol/palera1n/c-rewrite/releases/v2.0.0-beta.4/palera1n.1.html">Usage</a></strong> <a href="https://cdn.nickchan.lol/palera1n/c-rewrite/releases/v2.0.0-beta.7/palera1n.1.html">Documentation</a> •
• <a href="https://ios.cfw.guide/installing-palera1n">Installation Guide</a> •
<strong><a href="https://github.com/palera1n/palera1n/graphs/contributors">Contributors</a></strong> <a href="#requirements">Requirements</a> •
• <a href="https://discord.gg/palera1n">Support Discord</a> •
<strong><a href="https://dsc.gg/palera1n">Discord</a></strong> <a href="https://palera.in">Website</a>
•
<strong><a href="https://twitter.com/palera1n">Twitter</a></strong>
</p> </p>
<div class="clear"></div>
### You can obtain v2.0.0 beta [here](https://github.com/palera1n/palera1n/releases). ## Information
If you need an older v2.0.0 beta, please get it [here](https://github.com/palera1n/palera1n-c/releases/tag/v2.0.0-beta.4). This is the official repo for the palera1n project, a jailbreak for arm64 devices on iOS 15.0+
# Warnings - Loader application used in palera1n can be found [here](https://github.com/palera1n/loader).
- This palera1n rewrite has noticeably different arguments compared to the shell version of palera1n. - palera1ns jbinit can be found [here](https://github.com/palera1n/jbinit).
- Highly recommended that you take a look at how to use palera1n-c [here](https://cdn.nickchan.lol/palera1n/c-rewrite/releases/v2.0.0-beta.1/palera1n.1.html). - palera1ns custom PongoOS can be found [here](https://github.com/palera1n/pongoos).
- This does **NOT** support tethered creation or booting. You must use the older [shell version of palera1n](https://github.com/palera1n/palera1n/tree/legacy) (clone with `-b legacy`). Website & credits can be found at https://palera.in (scroll down for credits).
- We are **NOT** responsible for any data loss, or the result of a device being bricked. The user of this program accepts responsibility should something happen to their device. While nothing should happen, jailbreaking has risks in itself. ## Warnings
- If your device is stuck in recovery, please run futurerestore `--exit-recovery`, or use `irecovery -n`. We are **NOT** responsible for any data loss, or the result of a device being bricked. The user of this program accepts responsibility should something happen to their device. While nothing should happen, jailbreaking has risks in itself.
- If your device is stuck in recovery, please run futurerestore `--exit-recovery`, or use `irecovery -n`.
- If you're unable to get out of recovery via these methods please restore with iTunes or Finder.
- palera1n will never work in VirtualBox, VMware or any virtual machine that doesn't support PCI passthrough. - palera1n will never work in VirtualBox, VMware or any virtual machine that doesn't support PCI passthrough.
# Requirements ## Requirements
- A checkm8 vulnerable iOS device on iOS 15.x or 16.x (`A8` - `A11`) - A checkm8 vulnerable iOS device on iOS 15+ (`A8` - `A11`)
- If using rootful, you will need **5-10GB of space** for the fakefs. This means 16GB devices cannot use the full fakefs creation. However, you can change the arguments to `-Bf` to create a fakefs with bind mounts, so it uses a smaller size, at the expense having unwritable parts in rarely-written paths, and then boot it
- On `A11`, **you must disable your passcode while in the jailbroken state** (on iOS 16, you need to **reset your device** before proceeding with palera1n). - On `A11`, **you must disable your passcode while in the jailbroken state** (on iOS 16, you need to **reset your device** before proceeding with palera1n).
- **USB-A** cables are recommended to use, USB-C may have issues with palera1n and getting into DFU mode.<details><summary>Technical explanation</summary>The BootROM will only enter DFU if it detects USB voltage, which boils down to checking whether a certain pin is asserted from the Tristar chip. The Tristar does this based on the cable's accessory ID, and apparently USB-A and USB-C cables have different accessory IDs, and the one of the USB-C cables makes the Tristar not assert the USB voltage pin.</details> - **USB-A** cables are recommended to use, USB-C may have issues with palera1n and getting into DFU mode.<details><summary>Technical explanation</summary>The BootROM will only enter DFU if it detects USB voltage, which boils down to checking whether a certain pin is asserted from the Tristar chip. The Tristar does this based on the cable's accessory ID, and apparently USB-A and USB-C cables have different accessory IDs, and the one of the USB-C cables makes the Tristar not assert the USB voltage pin.</details>
@@ -36,8 +36,12 @@ If you need an older v2.0.0 beta, please get it [here](https://github.com/palera
- A Linux or macOS computer - A Linux or macOS computer
- AMD CPUs (not AMD Mobile) have an issue [with (likely) their USB controllers] that causes them to have a very low success rate with checkm8. It is not recommended that you use them with palera1n. - AMD CPUs (not AMD Mobile) have an issue [with (likely) their USB controllers] that causes them to have a very low success rate with checkm8. It is not recommended that you use them with palera1n.
- If your device does not successfully jailbreak, try a computer with an Intel or other CPU - If your device does not successfully jailbreak, try a computer with an Intel or other CPU
- Apple Silicon Macs with USB-C
- USB-C port on Apple Silicon Macs may require manual unplugging and replugging of the lightning cable after checkm8 exploit.
- This problem may be solved by connecting via USB hub, though extensions can vary.
# Need help? ## Need help?
Make sure you provide full details on your device, such as: Make sure you provide full details on your device, such as:
- iDevice - iDevice
@@ -45,41 +49,6 @@ Make sure you provide full details on your device, such as:
- Passcode enabled? - Passcode enabled?
- Logs, if panicked then send latest `panic-full` log from your iDevice. - Logs, if panicked then send latest `panic-full` log from your iDevice.
Using `-V` and `-v` would help with debugging. Using `-VvL` would help with debugging.
Join the [Support Discord](https://dsc.gg/palera1n), and find the palera1n-c thread under #jailbreak [here](https://discord.com/channels/1028398973452570725/1074251283143344180). Join the [Support Discord](https://dsc.gg/palera1n), and create a thread in [#support](https://discord.com/channels/1028398973452570725/1028730487700738130) or ask in [#general](https://discord.com/channels/1028398973452570725/1028398976640229380).
# Credits
<details><summary>palera1n-c Contributors and Credits</summary>
<p>
- [Nick Chan](https://github.com/asdfugil) for the rewrite
- [Nebula](https://github.com/itsnebulalol) - palera1n owner and manager
- [Mineek](https://github.com/mineek)
- [Tom](https://github.com/plooshi) for updated ploosh kpf and universal loader
- [Lakhan Lothiyi](https://github.com/llsc12) for palera1n loader app
- [checkra1n](https://github.com/checkra1n) for the base of the kpf
- [the Procursus Team](https://github.com/ProcursusTeam) for the amazing [bootstrap](https://github.com/ProcursusTeam/Procursus)
- [Évelyne](https://github.com/evelyneee) for [ElleKit](https://github.com/evelyneee/ellekit), rootless tweak injection
- [Sam Bingner](https://github.com/sbingner) for [Substitute](https://github.com/sbingner/substitute), rootful tweak injection
</details>
</p>
<br>
<p align="center">
Thank you so much to our Patreons that make the future development possible! You may sub <a href="https://patreon.com/palera1n">here</a>, if you'd like to.</br>
</p>
<p align="center">
<a href="https://github.com/samh06"><img width=64 style="border-radius: 25%;" src="https://user-images.githubusercontent.com/18669106/206333607-881d7ca1-f3bf-4e18-b620-25de0c527315.png"></img></a>
<a href="https://havoc.app"><img width=64 style="border-radius: 25%;" src="https://docs.havoc.app/img/standard_icon.png"></img></a>
<a href="https://twitter.com/yyyyyy_public"><img width=64 style="border-radius: 25%;" src="https://cdn.discordapp.com/attachments/1054239098006683688/1072587455779328040/image.png?size=400"></img></a>
<a href="https://twitter.com/0xSp00kyb0t"><img width=64 style="border-radius: 25%;" src="https://pbs.twimg.com/profile_images/1603601553226620935/1t4yD1bD_400x400.jpg"></img></a>
<a href="https://chariz.com"><img width=64 src="https://chariz.com/img/favicon.png"></img></a>
<a href="https://twitter.com/stars6220"><img width=64 style="border-radius: 25%;" src="https://pbs.twimg.com/profile_images/1621062976982728706/pWVZQ-NO_400x400.jpg"></img></a>
<a href="https://github.com/TheFunnyMan16"><img width=64 style="border-radius: 25%;" src="https://cdn.discordapp.com/attachments/1050068822473842778/1082867264807772281/IMG_3942.jpg">
<a href="https://github.com/beast9265"><img width=64 style="border-radius: 25%;" src="https://avatars.githubusercontent.com/u/79794946?v=4"></img></a>
<a href="https://twitter.com/0x7FF7"><img width=64 style="border-radius: 25%;" src="https://pbs.twimg.com/profile_images/1630818481191919618/8MWaJ1F7_400x400.jpg"></img></a>
<a href="https://sideloadly.io/"><img width=64 style="border-radius: 25%;" src="https://sideloadly.io/icon.png"></img></a>
<a href="https://blog.stevesec.com/"><img width=64 style="border-radius: 25%;" src="https://blog.stevesec.com/img/avatar.jpg"></img></a>
</p>
+32 -77
View File
@@ -2,33 +2,29 @@
.\" Copyright (c) 2023 Nick Chan .\" Copyright (c) 2023 Nick Chan
.\" SPDX-License-Identifier: MIT .\" SPDX-License-Identifier: MIT
.\" .\"
.Dd "06 February 2023" .Dd "2 July 2023"
.Dt "Nick Chan utilities manual" 1 "palera1n"
.Dt palera1n 1 .Dt palera1n 1
.Os
.Sh NAME .Sh NAME
.Nm palera1n .Nm palera1n
.Nd iOS 15.0-16.3.1 arm64 iOS/iPadOS jailbreaking tool .Nd iOS 15.0-16.5 arm64 iOS/iPadOS jailbreaking tool
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl BcdDEfhlnLOpRsvVI .Op Fl dDEhILnpRsSvV
.Op Fl e Ar Boot arguments .Op Fl e Ar Boot arguments
.Op Fl k Ar Pongo image .Op Fl k Ar Pongo image
.Op Fl o Ar overlay file .Op Fl o Ar overlay file
.Op Fl r Ar ramdisk file .Op Fl r Ar ramdisk file
.Op Fl K Ar KPF file .Op Fl K Ar KPF file
.Op Fl i Ar checkra1n file .Op Fl i Ar checkra1n file
.Op Fl -version
.Op Fl -force-revert
.Sh DESCRIPTION .Sh DESCRIPTION
.Nm .Nm
jailbreaks any iOS/iPadOS device with an arm64 (arm64e excluded) on iOS 15.0-16.3.1, jailbreaks any iOS/iPadOS device with an arm64 (arm64e excluded) on iOS 15.0-16.5,
utilizing the utilizing the
.Em checkm8 .Em checkm8
bootROM exploit. bootROM exploit.
.Pp .Pp
.Nm
is able to jailbreak the device in fakefs-rootful mode, where /
is writable, as well as rootless mode, where / cannot be written to.
.Pp
Due to the nature of the Due to the nature of the
.Em checkm8 .Em checkm8
exploit, exploit,
@@ -48,8 +44,11 @@ On iOS 16, the passcode must be off since restore, and
from settings app counts as a restore. from settings app counts as a restore.
A backup may be used in this case. A backup may be used in this case.
.Pp .Pp
In the remainder of this document, the term "iOS" and "iPadOS" will be used interchangably
as the difference is negligible as far as the jailbreak is concerened.
.Pp
.Sh SUPPORTED DEVICES .Sh SUPPORTED DEVICES
As described above, arm64 iOS/iPadOS 15.0-16.3.1 devices are supported, here is an explicit As described above, arm64 iOS 15.0-16.5 devices are supported, here is an explicit
list of supported devicecs: list of supported devicecs:
.Bl -tag -compact .Bl -tag -compact
@@ -92,22 +91,7 @@ Prints the program version and exit.
Remove the jailbreak while keeping user data. Some jailbreak files may remain Remove the jailbreak while keeping user data. Some jailbreak files may remain
after running this command. Additionally, jailbreak apps will remain on the after running this command. Additionally, jailbreak apps will remain on the
home screen on for a while even when the files are deleted as the icon cache home screen on for a while even when the files are deleted as the icon cache
still has their icons. When used with still has their icons.
.Fl f , -fakefs ,
this will actually boot the device in rootless mode then delete the jailbreak
files. As a result, using the loader app to install the jailbreak environment
is not supported when this option is used together with
.Fl f , -fakefs
\[char46]
.It Fl B , -setup-fakefs-partial
Like
.Fl c , -setup-fakefs
but the size of the created fakefs is smaller at the expense of having unwritable
parts in rarely-written paths. (good for 16 GB devices)
.It Fl c , -setup-fakefs
When used with
.Fl f , -fakefs ,
Create the new APFS volume required for rootful. Will fail if one already exists.
.It Fl d , -demote .It Fl d , -demote
Set the effective production fuse to 0, so as to enable hardware debugging features. Set the effective production fuse to 0, so as to enable hardware debugging features.
.It Fl D , -dfuhelper .It Fl D , -dfuhelper
@@ -118,13 +102,9 @@ Specify custom XNU kernel command line. The
.Em rootdev=md0 .Em rootdev=md0
argument is used by argument is used by
.Nm .Nm
and cannot be overriden. Additionally, the and cannot be overriden.
.Em wdt=-1
argument is used during fakefs setup.
.It Fl E , -enter-recovery .It Fl E , -enter-recovery
Exit after entering recovery mode. Exit after entering recovery mode.
.It Fl f , -fakefs
Jailbreak in rootful mode.
.It Fl h , -help .It Fl h , -help
Prints help text. Prints help text.
.It Fl i , -checkra1n-file Ar checkra1n file .It Fl i , -checkra1n-file Ar checkra1n file
@@ -138,18 +118,19 @@ Override the kernel patchfinder PongoOS module. The module is required to suppor
root filesystem in paleinfo with root filesystem in paleinfo with
.Em rootfs .Em rootfs
command. If in doubt, use command. If in doubt, use
.Sy https://github.com/guacaplushy/PongoOS .Sy https://github.com/palera1n/PongoOS
iOS15 branch or your own fork of it. iOS15 branch or your own fork of it.
.It Fl l , -rootless
Jailbreak in rootless mode, this is the default when neither
.Fl l , -rootless
and
.Fl f , -fakefs
is specified.
.Fl L , -jbinit-log-to-file .Fl L , -jbinit-log-to-file
Makes jbinit log to Makes jbinit log to
.Em /cores/jbinit.log .Em /cores/jbinit.log
This file may be viewed from sandboxed applications while jailbroken. This file may be viewed from sandboxed applications while jailbroken.
.It Fl l , -rootless
Proceed in rootless mode, this is the default when neither
.Fl l , -rootless
and
.Fl f , -fakefs
is specified.
>>>>>>> a8e6075 (paleinfo v2)
.It Fl n , -exit-recovery .It Fl n , -exit-recovery
Exit recovery mode and exit. Exit recovery mode and exit.
.It Fl o , -override-overlay Ar overlay file .It Fl o , -override-overlay Ar overlay file
@@ -161,8 +142,6 @@ at the root of it, as well as a dmg named
.Em loader.dmg .Em loader.dmg
at the root of it. Otherwise, the device will not boot. It is also expected that it at the root of it. Otherwise, the device will not boot. It is also expected that it
contains a shell, a ssh server, and various command line utilities. contains a shell, a ssh server, and various command line utilities.
.It Fl O , -disable-ohio
Disable ohio (disable analytics)
.It Fl p , -pongo-shell .It Fl p , -pongo-shell
Exit after booting into a clean PongoOS shell Exit after booting into a clean PongoOS shell
.It Fl P , -pongo-full .It Fl P , -pongo-full
@@ -183,6 +162,8 @@ specified (see
.Sy FILES .Sy FILES
section below) will be executed. The loader app and the built in SSH server can still be used, section below) will be executed. The loader app and the built in SSH server can still be used,
as well as any jailbreak-specific apps you have installed. as well as any jailbreak-specific apps you have installed.
.It Fl S , -no-colors
Disable colors on the command line. External programs like checkra1n clones may still output colors.
.It Fl v , -debug-logging .It Fl v , -debug-logging
Enable debug logging. The option may be repeated for extra verbosity. Enable debug logging. The option may be repeated for extra verbosity.
.It Fl V , -verbose-boot .It Fl V , -verbose-boot
@@ -192,7 +173,7 @@ Prints info about device and exits.
.El .El
.Sh ENVIRONMENTAL VARIABLES .Sh ENVIRONMENTAL VARIABLES
.Bl -tag -width -indent .Bl -tag -width -indent
.It TMPDIR .It Ev TMPDIR
This environmental variable should contain the a directory for temporary This environmental variable should contain the a directory for temporary
files. Without the files. Without the
.Fl i , -override-checkra1n .Fl i , -override-checkra1n
@@ -204,32 +185,10 @@ To (re-)jailbreak in rootless mode:
.Pp .Pp
.Dl "palera1n" .Dl "palera1n"
.Pp .Pp
To setup fakefs for rootful mode:
.Pp
.Dl "palera1n -fc"
.Pp
After the device has rebooted, follow the following example.
.Pp
To re-jailbreak in rootful mode:
.Pp
.Dl "palera1n -f"
.Pp
To remove the jailbreak in rootful mode:
.Pp
.Dl "palera1n --force-revert -f"
.Pp
To remove the jailbreak in rootless mode: To remove the jailbreak in rootless mode:
.Pp .Pp
.Dl "palera1n --force-revert" .Dl "palera1n --force-revert"
.Pp .Pp
To verbose boot in rootful mode:
.Pp
.Dl "palera1n -Vf"
.Pp
To create a partial fakefs with bind mounts:
.Pp
.Dl "palera1n -Bf"
.Pp
To exit recovery mode: To exit recovery mode:
.Pp .Pp
.Dl "palera1n -n" .Dl "palera1n -n"
@@ -237,14 +196,12 @@ To exit recovery mode:
.Sh CAVEATS .Sh CAVEATS
.Pp .Pp
.Em -v .Em -v
is not a real XNU boot argument. It is intercepted by iBoot. However, since XNU is not a real XNU boot argument. It is interpreted by iBoot. However, since XNU
boot arguments are set in PongoOS, which is ran after iBoot has ran, it does nothing. boot arguments are set in PongoOS, which is ran after iBoot has ran, it does nothing.
To verbose boot, use the To verbose boot, use the
.Fl V , -verbose-boot .Fl V , -verbose-boot
option when jailbreaking. option when jailbreaking.
.Pp .Pp
Fakefs takes up around 5-10 GB of storage, and take up to 10 minutes to setup.
.Pp
iOS 15.0 requires DER entitlements, and iOS 15.1 requires hash agility in code signatures. iOS 15.0 requires DER entitlements, and iOS 15.1 requires hash agility in code signatures.
As a result, binaries with the old code signature format need to be resigned with a recent As a result, binaries with the old code signature format need to be resigned with a recent
version of the Procursus fork of version of the Procursus fork of
@@ -252,11 +209,11 @@ version of the Procursus fork of
before they can be ran on a device jailbroken with before they can be ran on a device jailbroken with
.Nm .Nm
\[char46] \[char46]
.Sh POST INSTLLATION .Sh POST INSTALLATION
The palera1n loader app will take up to 30 seconds to appear on the homescreen after the The palera1n loader app will take up to 30 seconds to appear on the homescreen after the
device has booted. If it does not appear, you can try using the shortcut: device has booted. If it does not appear, you can try using the shortcut:
.Pp .Pp
.Sy https://www.icloud.com/shortcuts/8cd5f489c8854ee0ab9ee38f2e62f87d .Lk https://www.icloud.com/shortcuts/8cd5f489c8854ee0ab9ee38f2e62f87d
.Pp .Pp
to open it. After opening the loader app, press install to install a bootstrap as well as to open it. After opening the loader app, press install to install a bootstrap as well as
the the
@@ -276,18 +233,11 @@ The location of the temporary filesystem where jailbreak files are stash during
When When
.Fl L .Fl L
is used, the log file of jbinit. is used, the log file of jbinit.
.It Pa /Library/LaunchDaemons The log file of jbinit.
The directory where jailbreak-specific
.Xr launchd.plist 5
property list files should be placed on rootful.
.It Pa /var/jb/Library/LaunchDaemons .It Pa /var/jb/Library/LaunchDaemons
The directory where jailbreak-specific The directory where jailbreak-specific
.Xr launchd.plist 5 .Xr launchd.plist 5
property list files should be placed on rootless. property list files should be placed on rootless.
.It Pa /etc/rc.d
The directory where executable filse that needs to be executed during boot, before
daemons are launched, are placed rootful. They are executed after all filesystems
has been mounted.
.It Pa /var/jb/etc/rc.d .It Pa /var/jb/etc/rc.d
The directory where executable files that needs to be executed during boot, before The directory where executable files that needs to be executed during boot, before
daemons are launched, are placed on rootless. They are executed after all filesystems daemons are launched, are placed on rootless. They are executed after all filesystems
@@ -300,11 +250,16 @@ may crash if the machine it is running on:
.Dl "- Has non-compliant USB devices plugged in" .Dl "- Has non-compliant USB devices plugged in"
.Pp .Pp
The exploit may also work less reliably on some hosts, like AMD desktops, or some MediaTek devices. The exploit may also work less reliably on some hosts, like AMD desktops, or some MediaTek devices.
.Pp
The device may randomly crash and reboot due to launchd exiting with code 7.
.Sh NOTES .Sh NOTES
.Nm .Nm
injects a dylib into launchd to allow the injects a dylib into launchd to allow the
.Sy launchctl runstats .Sy launchctl runstats
command to be used on the device. command to be used on the device.
.Sh DEPRECATED AND REMOVED FUNCTIONALITY
.Pp
The fakefs functionality was removed.
.Sh SEE ALSO .Sh SEE ALSO
.Xr launchd 8 .Xr launchd 8
.Xr launchd.plist 5 .Xr launchd.plist 5
-138
View File
@@ -1,138 +0,0 @@
/*
* pongoOS - https://checkra.in
*
* Copyright (C) 2019-2022 checkra1n team
*
* This file is part of pongoOS.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
#ifndef _KERNINFO_H
#define _KERNINFO_H
#include <stdbool.h>
#include <stdint.h>
#define MAX_BOOTARGS_LEN 256
#define checkrain_option_none 0x00000000
#define checkrain_option_all 0x7fffffff
#define checkrain_option_failure 0x80000000
// Host options
#define checkrain_option_verbose_logging (1 << 0)
#define checkrain_option_demote (1 << 1)
#define checkrain_option_early_exit (1 << 2)
#define checkrain_option_quick_mode (1 << 3)
#define checkrain_option_pongo_shell (1 << 4)
#define checkrain_option_pongo_full (1 << 5)
// KPF options
#define checkrain_option_verbose_boot (1 << 0)
// Global options
#define checkrain_option_safemode (1 << 0)
#define checkrain_option_bind_mount (1 << 1)
#define checkrain_option_overlay (1 << 2)
#define checkrain_option_force_revert (1 << 7) /* keep this at 7 */
// palera1n option
#define palerain_option_rootful (1 << 0) /* rootful jailbreak */
#define palerain_option_jbinit_log_to_file (1 << 1) /* log to /cores/jbinit.log */
#define palerain_option_setup_rootful (1 << 2) /* create fakefs */
#define palerain_option_setup_rootful_forced (1 << 3) /* create fakefs over an existing one */
#define palerain_option_setup_partial_root (1 << 4) /* fakefs creating should be partial */
#define palerain_option_checkrain_is_clone (1 << 5) /* supplied checkra1n is checkra1n clone */
#ifdef DEV_BUILD
#define palerain_option_test1 (1 << 29)
#define palerain_option_test2 (1 << 30)
#endif
// palerain host options
#define host_option_dfuhelper_only (1 << 0) /* dfuhelper only */
#define host_option_pongo_exit (1 << 1) /* boot to clean pongo shell */
#ifdef DEV_BUILD
#define host_option_tui (1 << 2) /* use terminal user interface */
#else
#define host_option_res1 (1 << 2) /* reserved */
#endif
#define host_option_demote (1 << 3) /* Demote effective production fuse status */
#define host_option_no_ohio (1 << 4) /* Disable Ohio (Analytics) */
#define host_option_pongo_full (1 << 5) /* Boot to pongo with default images and options */
#define host_option_palerain_version (1 << 6) /* Print version */
#define host_option_exit_recovery (1 << 7) /* Exit recovery mode */
#define host_option_reboot_device (1 << 8) /* Reboot device in normal mode */
#define host_option_enter_recovery (1 << 9) /* Enter recovery mode */
#define host_option_device_info (1 << 10) /* Print device info */
#define PALEINFO_MAGIC 'PLSH'
#define PALEINFO_CIGAM 'HSLP'
typedef uint32_t checkrain_option_t, *checkrain_option_p;
typedef enum {
jailbreak_capability_tfp0 = 1 << 0,
jailbreak_capability_userspace_reboot = 1 << 1,
jailbreak_capability_dyld_ignore_os = 1 << 2, // TODO: This needs a better name
} jailbreak_capability_t, *jailbreak_capability_p;
#define DEFAULT_CAPABILITIES (jailbreak_capability_tfp0|jailbreak_capability_userspace_reboot)
struct kerninfo {
uint64_t size;
uint64_t base;
uint64_t slide;
checkrain_option_t flags;
};
struct paleinfo {
uint32_t magic; // 'PLSH' / 0x504c5348
uint32_t version; // 1
checkrain_option_t flags;
char rootdev[0x10];
};
struct kpfinfo {
struct kerninfo k;
checkrain_option_t kpf_flags;
char bootargs[MAX_BOOTARGS_LEN];
};
#define checkrain_set_option(options, option, enabled) do { \
if (enabled) \
options = (checkrain_option_t)(options | option); \
else \
options = (checkrain_option_t)(options & ~option); \
} while (0);
static inline bool checkrain_option_enabled(checkrain_option_t flags, checkrain_option_t opt)
{
if(flags == checkrain_option_failure)
{
switch(opt)
{
case checkrain_option_safemode:
return true;
default:
return false;
}
}
return (flags & opt) != 0;
}
#endif
+65
View File
@@ -0,0 +1,65 @@
/*
* jbinit - https://github.com/palera1n/jbinit
*
* This file is part of jbinit
*
* SPDX-License-Identifier: MIT
*/
#ifndef PALEINFO_H
#define PALEINFO_H
#include <stdint.h>
#define PALEINFO_VERSION 2U
typedef uint64_t palerain_option_t;
// unified palera1n options
#define palerain_option_rootful (UINT64_C(1) << 0) /* rootful jailbreak */
#define palerain_option_rootless (UINT64_C(1) << 1) /* rootless jailbreak */
#define palerain_option_setup_rootful (UINT64_C(1) << 2) /* create fakefs */
/* reserved */
#define palerain_option_setup_partial_root (UINT64_C(1) << 4) /* fakefs creating should be partial */
#define palerain_option_checkrain_is_clone (UINT64_C(1) << 5) /* supplied checkra1n is checkra1n clone */
#define palerain_option_rootless_livefs (UINT64_C(1) << 6) /* mount root livefs on rootless */
// #define palerain_option_no_ssv (UINT64_C(1) << 7) /* no signed system volume */
// #define palerain_option_force_fakefs (UINT64_C(1) << 8) /* force fakefs, even without SSV */
#define palerain_option_clean_fakefs (UINT64_C(1) << 9) /* clean fakefs, but does not delete it */
#define palerain_option_tui (UINT64_C(1) << 10) /* terminal user interface */
// #define palerain_option_gui (UINT64_C(1) << 11) /* graphical user interface*/
#define palerain_option_dfuhelper_only (UINT64_C(1) << 12) /* dfuhelper only */
#define palerain_option_pongo_exit (UINT64_C(1) << 13) /* boot to clean pongo shell */
#define palerain_option_demote (UINT64_C(1) << 14) /* Demote effective production fuse status */
#define palerain_option_pongo_full (UINT64_C(1) << 15) /* Boot to pongo with default images and options */
#define palerain_option_palerain_version (UINT64_C(1) << 16) /* Print version */
#define palerain_option_exit_recovery (UINT64_C(1) << 17) /* Exit recovery mode */
#define palerain_option_reboot_device (UINT64_C(1) << 18) /* Reboot device in normal mode */
#define palerain_option_enter_recovery (UINT64_C(1) << 19) /* Enter recovery mode */
#define palerain_option_device_info (UINT64_C(1) << 20) /* Print device info */
#define palerain_option_no_colors (UINT64_C(1) << 21) /* no colors */
#define palerain_option_bind_mount (UINT64_C(1) << 22) /* bind mounts should be used (always true iOS 15+)*/
#define palerain_option_overlay (UINT64_C(1) << 23) /* there is an overlay (should always be true) */
#define palerain_option_force_revert (UINT64_C(1) << 24) /* Unjailbreak */
#define palerain_option_safemode (UINT64_C(1) << 25) /* Enter safe mode */
#define palerain_option_verbose_boot (UINT64_C(1) << 26) /* verbose boot */
#define palerain_option_jbinit_log_to_file (UINT64_C(1) << 50) /* make ramdisk log to file (jbinit2) */
#define palerain_option_setup_rootful_forced (UINT64_C(1) << 51) /* create fakefs over an existing one (jbinit2) */
#define palerain_option_flower_chain (UINT64_C(1) << 61) /* Flower chain */
#define palerain_option_test1 (UINT64_C(1) << 62) /* Developer test option 1 */
#define palerain_option_test2 (UINT64_C(1) << 63) /* Developer test option 2 */
#define PALEINFO_MAGIC 'PLSH'
/* paleinfo version 2, appended to ramdisk */
struct paleinfo {
uint32_t magic; /* 'PLSH' */
uint32_t version; /* 2 */
uint64_t kbase; /* kernel base */
uint64_t kslide; /* kernel slide */
uint64_t flags; /* unified palera1n flags */
char rootdev[0x10]; /* ex. disk0s1s8 */
}__attribute__((packed));
#endif
+12 -12
View File
@@ -2,11 +2,11 @@
#define PALERAIN_H #define PALERAIN_H
#if defined(__APPLE__) #if defined(__APPLE__)
#define _DARWIN_C_SOURCE 1 #define NSIG __DARWIN_NSIG
#endif #endif
#include "xxd-embedded.h" #include "xxd-embedded.h"
#include "kerninfo.h" #include "paleinfo.h"
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
@@ -100,6 +100,8 @@ struct mach_header_64
}; };
#endif #endif
typedef void *(*pthread_start_t)(void *);
// Keep in sync with Pongo // Keep in sync with Pongo
#define PONGO_USB_VENDOR 0x05ac #define PONGO_USB_VENDOR 0x05ac
#define PONGO_USB_PRODUCT 0x4141 #define PONGO_USB_PRODUCT 0x4141
@@ -149,12 +151,12 @@ typedef unsigned char niarelap_file_t[];
extern unsigned int verbose; extern unsigned int verbose;
extern char* pongo_path; extern char* pongo_path;
#ifdef DEV_BUILD #ifdef TUI
extern bool tui_started; extern bool tui_started;
#endif #endif
extern checkrain_option_t host_flags; extern uint64_t palerain_flags;
extern checkrain_option_p host_flags_p; extern uint64_t* palerain_flags_p;
extern pthread_t dfuhelper_thread, pongo_thread; extern pthread_t dfuhelper_thread, pongo_thread;
extern int pongo_thr_running, dfuhelper_thr_running; extern int pongo_thr_running, dfuhelper_thr_running;
@@ -163,7 +165,7 @@ extern niarelap_file_t *kpf_to_upload_1, *ramdisk_to_upload_1, *overlay_to_uploa
extern niarelap_file_t **kpf_to_upload, **ramdisk_to_upload, **overlay_to_upload; extern niarelap_file_t **kpf_to_upload, **ramdisk_to_upload, **overlay_to_upload;
extern override_file_t override_ramdisk, override_kpf, override_overlay; extern override_file_t override_ramdisk, override_kpf, override_overlay;
extern uint32_t checkrain_flags, palerain_flags, kpf_flags; extern uint64_t palerain_flags;
extern pthread_mutex_t log_mutex; extern pthread_mutex_t log_mutex;
extern pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex; extern pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex;
@@ -171,9 +173,7 @@ extern pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex;
extern int pongo_thr_running, dfuhelper_thr_running; extern int pongo_thr_running, dfuhelper_thr_running;
extern bool device_has_booted; extern bool device_has_booted;
extern char xargs_cmd[0x270]; extern char xargs_cmd[0x270];
extern char checkrain_flags_cmd[0x20]; extern char palerain_flags_cmd[0x30];
extern char palerain_flags_cmd[0x20];
extern char kpf_flags_cmd[0x20];
extern char dtpatch_cmd[0x20]; extern char dtpatch_cmd[0x20];
extern char rootfs_cmd[512]; extern char rootfs_cmd[512];
extern char* ext_checkra1n; extern char* ext_checkra1n;
@@ -203,7 +203,7 @@ boyermoore_horspool_memmem(const unsigned char* haystack, size_t hlen,
const unsigned char* needle, size_t nlen); const unsigned char* needle, size_t nlen);
extern void* pongo_usb_callback(void* arg); extern void* pongo_usb_callback(stuff_t* arg);
usb_ret_t USBControlTransfer(usb_device_handle_t handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint32_t wLength, void *data, uint32_t *wLenDone); usb_ret_t USBControlTransfer(usb_device_handle_t handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint32_t wLength, void *data, uint32_t *wLenDone);
const char *usb_strerror(usb_ret_t err); const char *usb_strerror(usb_ret_t err);
int wait_for_pongo(void); int wait_for_pongo(void);
@@ -226,9 +226,9 @@ void io_stop(stuff_t *stuff);
void print_credits(void); void print_credits(void);
#ifdef DEV_BUILD #ifdef TUI
#include <newt.h> #include <newt.h>
newtComponent get_tui_log(); newtComponent get_tui_log(void);
newtComponent set_tui_log(newtComponent co); newtComponent set_tui_log(newtComponent co);
#endif #endif
#endif #endif
+10 -9
View File
@@ -11,6 +11,7 @@
#include <locale.h> #include <locale.h>
#include <unistd.h> #include <unistd.h>
#include <newt.h> #include <newt.h>
#include <paleinfo.h>
#define WIDTH 76 #define WIDTH 76
#define HEIGHT 19 #define HEIGHT 19
@@ -19,7 +20,7 @@
#define PI_STEP_CURRENT NEWT_COLORSET_CUSTOM(1) #define PI_STEP_CURRENT NEWT_COLORSET_CUSTOM(1)
#define PI_STEP_OTHER NEWT_COLORSET_CUSTOM(2) #define PI_STEP_OTHER NEWT_COLORSET_CUSTOM(2)
#define CHECKBOX_STATE(flags, opt) checkrain_option_enabled(flags, opt) ? '*' : ' ' #define CHECKBOX_STATE(flags, opt) (flags & opt) != 0 ? '*' : ' '
typedef enum tui_screens { typedef enum tui_screens {
ERROR_SCREEN = -1, ERROR_SCREEN = -1,
@@ -32,17 +33,17 @@ typedef enum tui_screens {
} tui_screen_t; } tui_screen_t;
typedef struct bitfield_checkbox_info { typedef struct bitfield_checkbox_info {
checkrain_option_p flags_p; uint64_t* flags_p;
checkrain_option_t opt; uint64_t opt;
} tui_bit_info_t; } tui_bit_info_t;
tui_screen_t tui_screen_main(); tui_screen_t tui_screen_main(void);
tui_screen_t tui_screen_options(); tui_screen_t tui_screen_options(void);
tui_screen_t tui_screen_enter_recovery(); tui_screen_t tui_screen_enter_recovery(void);
tui_screen_t tui_screen_enter_dfu(); tui_screen_t tui_screen_enter_dfu(void);
tui_screen_t tui_screen_jailbreak(); tui_screen_t tui_screen_jailbreak(void);
int redraw_screen(); int redraw_screen(void);
#endif #endif
+3
View File
@@ -17,6 +17,9 @@ extern unsigned int ramdisk_dmg_len;
extern unsigned char binpack_dmg[]; extern unsigned char binpack_dmg[];
extern unsigned int binpack_dmg_len; extern unsigned int binpack_dmg_len;
extern unsigned char Pongo_bin[];
extern unsigned int Pongo_bin_len;
#if defined(__APPLE__) && (TARGET_OS_IPHONE || defined(DEV_BUILD)) #if defined(__APPLE__) && (TARGET_OS_IPHONE || defined(DEV_BUILD))
extern unsigned char libcheckra1nhelper_dylib[]; extern unsigned char libcheckra1nhelper_dylib[];
extern unsigned int libcheckra1nhelper_dylib_len; extern unsigned int libcheckra1nhelper_dylib_len;
+17
View File
@@ -0,0 +1,17 @@
Package: palera1n
Name: palera1n
Version: @DEB_VERSION@
Architecture: @DEB_ARCH@
Maintainer: palera1n team
Author: palera1n team
Depends: usbmuxd
Section: Utilities
Priority: optional
Homepage: https://palera.in
Description: iOS 15.0-16.5 semi-tethered checkm8 jailbreak
palera1n is an iOS/iPadOS 15.0-16.5 semi tethered jailbreak
based on the checkm8 exploit.
.
palera1n is able to jailbreak the device in fakefs-rootful mode,
where / is writable, as well as rootless mode, where / cannot be
written to.
+16
View File
@@ -0,0 +1,16 @@
Package: palera1n
Name: palera1n
Version: @DEB_VERSION@
Architecture: @DEB_ARCH@
Maintainer: palera1n team
Author: palera1n team
Section: Utilities
Priority: optional
Homepage: https://palera.in
Description: iOS 15.0-16.5 semi-tethered checkm8 jailbreak
palera1n is an iOS/iPadOS 15.0-16.5 semi tethered jailbreak
based on the checkm8 exploit.
.
palera1n is able to jailbreak the device in fakefs-rootful mode,
where / is writable, as well as rootless mode, where / cannot be
written to.
@@ -1,6 +1,6 @@
From 632cdb6de3f1693fb90d60d81552b723e8dd5e84 Mon Sep 17 00:00:00 2001 From a2d012f3ba459f6debe636b576ad9aeab7b3c2aa Mon Sep 17 00:00:00 2001
From: Nick Chan <[email protected]> From: Nick Chan <[email protected]>
Date: Wed, 25 Jan 2023 01:53:00 +0800 Date: Sat, 27 May 2023 23:50:23 +0800
Subject: [PATCH] Allow empty x509 cert issuer Subject: [PATCH] Allow empty x509 cert issuer
--- ---
@@ -8,25 +8,24 @@ Subject: [PATCH] Allow empty x509 cert issuer
1 file changed, 4 insertions(+), 4 deletions(-) 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/library/x509_crt.c b/library/x509_crt.c diff --git a/library/x509_crt.c b/library/x509_crt.c
index 0eee97cb6..46702f683 100644 index cf62532f2..ef25b3d77 100644
--- a/library/x509_crt.c --- a/library/x509_crt.c
+++ b/library/x509_crt.c +++ b/library/x509_crt.c
@@ -1185,14 +1185,14 @@ static int x509_crt_parse_der_core( mbedtls_x509_crt *crt, @@ -1061,13 +1061,13 @@ static int x509_crt_parse_der_core(mbedtls_x509_crt *crt,
if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,
MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 ) if ((ret = mbedtls_asn1_get_tag(&p, end, &len,
{ MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
- mbedtls_x509_crt_free( crt ); - mbedtls_x509_crt_free(crt);
- return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_FORMAT, ret ) ); - return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);
+ // mbedtls_x509_crt_free( crt ); + /*mbedtls_x509_crt_free(crt);
+ // return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_FORMAT, ret ) ); + return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_X509_INVALID_FORMAT, ret);*/
} }
if( ( ret = mbedtls_x509_get_name( &p, p + len, &crt->issuer ) ) != 0 ) if ((ret = mbedtls_x509_get_name(&p, p + len, &crt->issuer)) != 0) {
{ - mbedtls_x509_crt_free(crt);
- mbedtls_x509_crt_free( crt ); - return ret;
- return( ret ); + /*mbedtls_x509_crt_free(crt);
+ // mbedtls_x509_crt_free( crt ); + return ret;*/
+ // return( ret );
} }
crt->issuer_raw.len = p - crt->issuer_raw.p; crt->issuer_raw.len = p - crt->issuer_raw.p;
+37 -5
View File
@@ -14,35 +14,49 @@ endif
ifeq ($(FORCE_HELPER),1) ifeq ($(FORCE_HELPER),1)
OBJECTS += xxd-libcheckra1nhelper.dylib.o OBJECTS += xxd-libcheckra1nhelper.dylib.o
CFLAGS += -DFORCE_HELPER CFLAGS += -DFORCE_HELPER
BUILD_OPTIONS += FORCE_HELPER
endif endif
ifneq ($(NO_RAMDISK),1) ifneq ($(NO_RAMDISK),1)
OBJECTS += xxd-ramdisk.dmg.o OBJECTS += xxd-ramdisk.dmg.o
else else
CFLAGS += -DNO_RAMDISK CFLAGS += -DNO_RAMDISK
BUILD_OPTIONS += NO_RAMDISK
endif endif
ifneq ($(NO_KPF),1) ifneq ($(NO_KPF),1)
OBJECTS += xxd-checkra1n-kpf-pongo.o OBJECTS += xxd-checkra1n-kpf-pongo.o
else else
CFLAGS += -DNO_KPF CFLAGS += -DNO_KPF
BUILD_OPTIONS += NO_KPF
endif endif
ifneq ($(NO_BINPACK),1) ifneq ($(NO_OVERLAY),1)
OBJECTS += xxd-binpack.dmg.o OBJECTS += xxd-binpack.dmg.o
else else
CFLAGS += -DNO_BINPACK CFLAGS += -DNO_OVERLAY
BUILD_OPTIONS += NO_OVERLAY
endif endif
ifneq ($(NO_CHECKRAIN),1) ifneq ($(NO_CHECKRAIN),1)
OBJECTS += xxd-checkra1n.o OBJECTS += xxd-checkra1n.o
else else
CFLAGS += -DNO_CHECKRAIN CFLAGS += -DNO_CHECKRAIN
BUILD_OPTIONS += NO_CHECKRAIN
endif endif
ifeq ($(DEV_BUILD),1) ifneq ($(NO_CUSTOM_PONGO),1)
OBJECTS += xxd-Pongo.bin.o
else
CFLAGS += -DNO_CUSTOM_PONGO
BUILD_OPTIONS += NO_CUSTOM_PONGO
endif
ifeq ($(TUI),1)
OBJECTS += tui_screen_enter_recovery.o tui_screen_enter_dfu.o tui_main.o 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 OBJECTS += tui_screen_jailbreak.o tui_screen_main.o tui_screen_options.o
BUILD_OPTIONS += TUI
CFLAGS += -DTUI
endif endif
CHECKRA1N_VERSION ?= 0.1337.1 CHECKRA1N_VERSION ?= 0.1337.2
LIPO = lipo LIPO = lipo
LDID = ldid LDID = ldid
@@ -51,7 +65,11 @@ ifneq ($(USE_LIBUSB),1)
OBJECTS += usb_iokit.o OBJECTS += usb_iokit.o
else else
LIBS += -framework SystemConfiguration -framework Security LIBS += -framework SystemConfiguration -framework Security
BUILD_OPTIONS += USE_LIBUSB
endif endif
# add lto and debug symbols for lto
CFLAGS += -flto=full -g
LDFLAGS += -Wl,-object_path_lto,lto.o
else else
USE_LIBUSB = 1 USE_LIBUSB = 1
endif endif
@@ -62,6 +80,17 @@ CFLAGS += -DUSE_LIBUSB=1
LIBS += $(DEP)/lib/libusb-1.0.a LIBS += $(DEP)/lib/libusb-1.0.a
endif endif
ifeq ($(ROOTFUL),1)
CFLAGS += -DROOTFUL=1
BUILD_OPTIONS += ROOTFUL
endif
ifeq ($(BUILD_OPTIONS),)
BUILD_OPTIONS = (none)
endif
CFLAGS += -DBUILD_OPTIONS=\""$(BUILD_OPTIONS)"\"
checkra1n-%: checkra1n-%:
curl -LO https://assets.checkra.in/downloads/preview/$(CHECKRA1N_VERSION)/$@ curl -LO https://assets.checkra.in/downloads/preview/$(CHECKRA1N_VERSION)/$@
chmod 755 $@ chmod 755 $@
@@ -111,11 +140,14 @@ checkra1n-kpf-pongo:
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/checkra1n-kpf-pongo curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/checkra1n-kpf-pongo
ramdisk.dmg: ramdisk.dmg:
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/jbinit_rootless/ramdisk.dmg curl -LO https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg
binpack.dmg: binpack.dmg:
curl -LO https://cdn.nickchan.lol/palera1n/c-rewrite/deps/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: clean:
rm -rf *.o palera1n checkra1n checkra1n.c palera1n.dSYM libcheckra1nhelper.dylib rm -rf *.o palera1n checkra1n checkra1n.c palera1n.dSYM libcheckra1nhelper.dylib
Submodule src/PongoOS deleted from f3e1294f42.
Submodule src/binpack deleted from dc0ef6423c.
File renamed without changes.
File renamed without changes.
+4 -4
View File
@@ -1,7 +1,7 @@
#include <stdio.h> #include <stdio.h>
#ifndef BAKERAIN_DEVELOPE_R #ifndef BAKERAIN_DEVELOPE_R
#define BAKERAIN_DEVELOPE_R "dora2ios" #define BAKERAIN_DEVELOPE_R "kok3shidoll"
#endif #endif
#define THE_PLUSH "Ploosh" #define THE_PLUSH "Ploosh"
@@ -9,11 +9,11 @@
#define R print_credits(void) { #define R print_credits(void) {
#define O fprintf #define O fprintf
#define U ( #define U (
#define B stdout #define B stderr
#define L , #define L ,
#define E "# == palera1n-c == \n#\n" #define E "# == palera1n-c == \n#\n"
#define M "# Made by: Nick Chan, " THE_PLUSH ", Mineek, Nebula, llsc12\n#\n" #define M "# Made by: Nick Chan, " THE_PLUSH ", Samara, Nebula, staturnz, " BAKERAIN_DEVELOPE_R " \n#\n"
#define A "# Thanks to: " BAKERAIN_DEVELOPE_R ", pythonplayer, tihmstar, nikias\n" #define A "# Thanks to: pythonplayer123, llsc12, Mineek, tihmstar, nikias\n"
#define K "# (libimobiledevice), checkra1n team (Siguza, axi0mx, littlelailo\n" #define K "# (libimobiledevice), checkra1n team (Siguza, axi0mx, littlelailo\n"
#define I "# et al.), Procursus Team (Hayden Seay, Cameron Katri, Keto et.al)\n\n" #define I "# et al.), Procursus Team (Hayden Seay, Cameron Katri, Keto et.al)\n\n"
#define N ) #define N )
+78 -75
View File
@@ -76,27 +76,27 @@ bool cpid_is_arm64(unsigned int cpid) {
* ========== 0x8960 =========== * ========== 0x8960 ===========
* (ARM64) A7 * (ARM64) A7
*/ */
if ( return (
cpid == 0x8960 || cpid == 0x7000 || cpid == 0x7001 cpid == 0x8960 || cpid == 0x7000 || cpid == 0x7001 ||
|| cpid == 0x8000 || cpid == 0x8001 || cpid == 0x8003 cpid == 0x8000 || cpid == 0x8001 || cpid == 0x8003 ||
|| cpid == 0x8010 || cpid == 0x8011 || cpid == 0x8012 cpid == 0x8010 || cpid == 0x8011 || cpid == 0x8012 ||
|| cpid == 0x8015 cpid == 0x8015
);
) return true;
return false;
} }
int subscribe_cmd(usbmuxd_event_cb_t device_event_cb, irecv_device_event_cb_t irecv_event_cb) int subscribe_cmd(usbmuxd_event_cb_t device_event_cb, irecv_device_event_cb_t irecv_event_cb)
{ {
usbmuxd_events_subscribe(&usbmuxdctx, device_event_cb, NULL); int ret;
irecv_device_event_subscribe(&irecvctx, irecv_event_cb, NULL); if ((ret = usbmuxd_events_subscribe(&usbmuxdctx, device_event_cb, NULL))) return ret;
if ((ret = irecv_device_event_subscribe(&irecvctx, irecv_event_cb, NULL))) return ret;
return 0; return 0;
} }
int unsubscribe_cmd(void) int unsubscribe_cmd(void)
{ {
usbmuxd_events_unsubscribe(usbmuxdctx); int ret;
irecv_device_event_unsubscribe(irecvctx); if ((ret = usbmuxd_events_unsubscribe(usbmuxdctx))) return ret;
if ((ret = irecv_device_event_unsubscribe(irecvctx))) return ret;
irecvctx = NULL; irecvctx = NULL;
usbmuxdctx = NULL; usbmuxdctx = NULL;
return 0; return 0;
@@ -119,15 +119,15 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
} }
if (lockdownd_client_new(device, &lockdown, "palera1n") != LOCKDOWN_E_SUCCESS) if (lockdownd_client_new(device, &lockdown, "palera1n") != LOCKDOWN_E_SUCCESS)
{ {
idevice_free(device); (void)idevice_free(device);
LOG(LOG_ERROR, "Device is not in normal mode."); LOG(LOG_ERROR, "Device is not in normal mode.");
return -1; return -1;
} }
plist_t node = NULL; plist_t node = NULL;
if (lockdownd_get_value(lockdown, NULL, "UniqueChipID", &node) != LOCKDOWN_E_SUCCESS) if (lockdownd_get_value(lockdown, NULL, "UniqueChipID", &node) != LOCKDOWN_E_SUCCESS)
{ {
lockdownd_client_free(lockdown); (void)lockdownd_client_free(lockdown);
idevice_free(device); (void)idevice_free(device);
LOG(LOG_ERROR, "Error getting ECID"); LOG(LOG_ERROR, "Error getting ECID");
return -1; return -1;
} }
@@ -137,8 +137,8 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
node = NULL; node = NULL;
if (lockdownd_get_value(lockdown, NULL, "ProductType", &node) != LOCKDOWN_E_SUCCESS) if (lockdownd_get_value(lockdown, NULL, "ProductType", &node) != LOCKDOWN_E_SUCCESS)
{ {
lockdownd_client_free(lockdown); (void)lockdownd_client_free(lockdown);
idevice_free(device); (void)idevice_free(device);
LOG(LOG_ERROR, "Error getting product type"); LOG(LOG_ERROR, "Error getting product type");
return -1; return -1;
} }
@@ -148,8 +148,8 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
node = NULL; node = NULL;
if (lockdownd_get_value(lockdown, NULL, "CPUArchitecture", &node) != LOCKDOWN_E_SUCCESS) if (lockdownd_get_value(lockdown, NULL, "CPUArchitecture", &node) != LOCKDOWN_E_SUCCESS)
{ {
lockdownd_client_free(lockdown); (void)lockdownd_client_free(lockdown);
idevice_free(device); (void)idevice_free(device);
LOG(LOG_ERROR, "Error getting CPU type"); LOG(LOG_ERROR, "Error getting CPU type");
return -1; return -1;
} }
@@ -159,8 +159,8 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
node = NULL; node = NULL;
if (lockdownd_get_value(lockdown, NULL, "ProductVersion", &node) != LOCKDOWN_E_SUCCESS) if (lockdownd_get_value(lockdown, NULL, "ProductVersion", &node) != LOCKDOWN_E_SUCCESS)
{ {
lockdownd_client_free(lockdown); (void)lockdownd_client_free(lockdown);
idevice_free(device); (void)idevice_free(device);
LOG(LOG_ERROR, "Error getting product version"); LOG(LOG_ERROR, "Error getting product version");
return -1; return -1;
} }
@@ -170,21 +170,21 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
node = NULL; node = NULL;
if (lockdownd_get_value(lockdown, NULL, "BuildVersion", &node) != LOCKDOWN_E_SUCCESS) if (lockdownd_get_value(lockdown, NULL, "BuildVersion", &node) != LOCKDOWN_E_SUCCESS)
{ {
lockdownd_client_free(lockdown); (void)lockdownd_client_free(lockdown);
idevice_free(device); (void)idevice_free(device);
LOG(LOG_ERROR, "Error getting build version"); LOG(LOG_ERROR, "Error getting build version");
return -1; return -1;
} }
plist_get_string_val(node, &buildVersion); plist_get_string_val(node, &buildVersion);
plist_free(node); plist_free(node);
lockdownd_client_free(lockdown); (void)lockdownd_client_free(lockdown);
idevice_free(device); (void)idevice_free(device);
irecv_device_t rcvydev; irecv_device_t rcvydev;
if (irecv_devices_get_device_by_product_type(productType, &rcvydev) == IRECV_E_SUCCESS) if (irecv_devices_get_device_by_product_type(productType, &rcvydev) == IRECV_E_SUCCESS)
{ {
displayName = rcvydev->display_name; displayName = rcvydev->display_name;
} } else
else
{ {
displayName = productType; displayName = productType;
} }
@@ -209,23 +209,22 @@ int enter_recovery_cmd(const char* udid) {
LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret)); LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret));
return -1; return -1;
} }
do { ldret = lockdownd_enter_recovery(lockdown);
ldret = lockdownd_enter_recovery(lockdown); if (ldret == LOCKDOWN_E_SESSION_INACTIVE) {
if (ldret == LOCKDOWN_E_SESSION_INACTIVE) { lockdownd_client_free(lockdown);
lockdownd_client_free(lockdown); lockdown = NULL;
lockdown = NULL; ldret = lockdownd_client_new_with_handshake(device, &lockdown, "palera1n");
if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &lockdown, "palera1n"))) {
LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret));
return -1;
}
ldret = lockdownd_enter_recovery(lockdown);
}
if (ldret != LOCKDOWN_E_SUCCESS) { if (ldret != LOCKDOWN_E_SUCCESS) {
LOG(LOG_ERROR, "Could not trigger entering recovery mode: %s", lockdownd_strerror(ldret)); LOG(LOG_ERROR, "Could not connect to lockdownd: %s", lockdownd_strerror(ldret));
return -1; return -1;
} }
lockdownd_client_free(lockdown); ldret = lockdownd_enter_recovery(lockdown);
} while (0); }
if (ldret != LOCKDOWN_E_SUCCESS) {
LOG(LOG_ERROR, "Could not trigger entering recovery mode: %s", lockdownd_strerror(ldret));
return -1;
}
lockdownd_client_free(lockdown);
idevice_free(device); idevice_free(device);
return 0; return 0;
} }
@@ -242,8 +241,8 @@ int reboot_cmd(const char* udid) {
if (diagnostics_relay_restart(diag, DIAGNOSTICS_RELAY_ACTION_FLAG_WAIT_FOR_DISCONNECT) != DIAGNOSTICS_RELAY_E_SUCCESS) { if (diagnostics_relay_restart(diag, DIAGNOSTICS_RELAY_ACTION_FLAG_WAIT_FOR_DISCONNECT) != DIAGNOSTICS_RELAY_E_SUCCESS) {
LOG(LOG_ERROR, "Could not reboot device."); LOG(LOG_ERROR, "Could not reboot device.");
} }
diagnostics_relay_goodbye(diag); (void)diagnostics_relay_goodbye(diag);
diagnostics_relay_client_free(diag); (void)diagnostics_relay_client_free(diag);
} else { } else {
LOG(LOG_ERROR, "Could not connect to device."); LOG(LOG_ERROR, "Could not connect to device.");
return -1; return -1;
@@ -302,9 +301,9 @@ int passstat_cmd(unsigned char* status, const char* udid) {
derr = diagnostics_relay_query_mobilegestalt(diagnostics_client, keys, &node); derr = diagnostics_relay_query_mobilegestalt(diagnostics_client, keys, &node);
plist_free(keys); plist_free(keys);
diagnostics_relay_client_free(diagnostics_client); (void)diagnostics_relay_client_free(diagnostics_client);
lockdownd_service_descriptor_free(service); (void)lockdownd_service_descriptor_free(service);
idevice_free(dev); (void)idevice_free(dev);
if (derr != DIAGNOSTICS_RELAY_E_SUCCESS || !node) if (derr != DIAGNOSTICS_RELAY_E_SUCCESS || !node)
{ {
@@ -322,7 +321,7 @@ int passstat_cmd(unsigned char* status, const char* udid) {
plist_get_string_val(status_node, &passstat_status); plist_get_string_val(status_node, &passstat_status);
if (!status || strncmp(passstat_status, "Succ", 4)) if (!status || strncmp(passstat_status, "Succ", 4))
{ {
if (passstat_status) if (passstat_status)
free(passstat_status); free(passstat_status);
passstat_status = NULL; passstat_status = NULL;
plist_free(node); plist_free(node);
@@ -349,20 +348,16 @@ int passstat_cmd(unsigned char* status, const char* udid) {
int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid) { int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid) {
irecv_client_t client = NULL; irecv_client_t client = NULL;
irecv_error_t err = irecv_open_with_ecid(&client, ecid); irecv_error_t err = irecv_open_with_ecid(&client, ecid);
if (err != IRECV_E_SUCCESS) { if (err != IRECV_E_SUCCESS) goto err;
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
return -1;
}
int mode = 0; int mode = 0;
irecv_get_mode(client, &mode); err = irecv_get_mode(client, &mode);
if (err != IRECV_E_SUCCESS) goto err;
char *ibootver = NULL; char *ibootver = NULL;
irecv_getenv(client, "build-version", &ibootver); err = irecv_getenv(client, "build-version", &ibootver);
if (err != IRECV_E_SUCCESS) goto err;
irecv_device_t device; irecv_device_t device;
err = irecv_devices_get_device_by_client(client, &device); err = irecv_devices_get_device_by_client(client, &device);
if (err != IRECV_E_SUCCESS) { if (err != IRECV_E_SUCCESS) goto err;
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
return -1;
}
info->mode = mode; info->mode = mode;
info->cpid = device->chip_id; info->cpid = device->chip_id;
snprintf(info->product_type, 0x20, "%s", device->product_type); snprintf(info->product_type, 0x20, "%s", device->product_type);
@@ -371,33 +366,41 @@ int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid) {
free(ibootver); free(ibootver);
irecv_close(client); irecv_close(client);
return 0; return 0;
err:
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
return -1;
} }
int autoboot_cmd(const uint64_t ecid) { int autoboot_cmd(const uint64_t ecid) {
irecv_client_t client = NULL; irecv_client_t client = NULL;
irecv_error_t err = irecv_open_with_ecid(&client, ecid); irecv_error_t err = irecv_open_with_ecid(&client, ecid);
if (err == IRECV_E_SUCCESS) { if (err != IRECV_E_SUCCESS) goto err;
irecv_setenv(client, "auto-boot", "true"); err = irecv_setenv(client, "auto-boot", "true");
irecv_saveenv(client); if (err != IRECV_E_SUCCESS) goto err;
irecv_close(client); err = irecv_saveenv(client);
return 0; if (err != IRECV_E_SUCCESS) goto err;
} else { err = irecv_close(client);
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err)); if (err != IRECV_E_SUCCESS) goto err;
return 0;
err:
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
return -1; return -1;
}
} }
int exitrecv_cmd(const uint64_t ecid) { int exitrecv_cmd(const uint64_t ecid) {
irecv_client_t client = NULL; irecv_client_t client = NULL;
irecv_error_t err = irecv_open_with_ecid(&client, ecid); irecv_error_t err = irecv_open_with_ecid(&client, ecid);
if (err == IRECV_E_SUCCESS) { if (err != IRECV_E_SUCCESS) goto err;
irecv_setenv(client, "auto-boot", "true"); err = irecv_setenv(client, "auto-boot", "true");
irecv_saveenv(client); if (err != IRECV_E_SUCCESS) goto err;
irecv_reboot(client); err = irecv_saveenv(client);
irecv_close(client); if (err != IRECV_E_SUCCESS) goto err;
return 0; err = irecv_reboot(client);
} else { if (err != IRECV_E_SUCCESS) goto err;
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err)); err = irecv_close(client);
return -1; if (err != IRECV_E_SUCCESS) goto err;
} return 0;
err:
LOG(LOG_ERROR, "libirecovery error: %d (%s)", err, irecv_strerror(err));
return -1;
} }
+111 -81
View File
@@ -36,12 +36,20 @@ int dfuhelper_thr_running = false;
void step(int time, int time2, char *text, bool (*cond)(uint64_t), uint64_t cond_arg) { void step(int time, int time2, char *text, bool (*cond)(uint64_t), uint64_t cond_arg) {
for (int i = time2; i < time; i++) { for (int i = time2; i < time; i++) {
printf(BCYN "\r\033[K%s (%d)" CRESET, text, time - i + time2); printf(
(palerain_flags & palerain_option_no_colors)
? "\r\033[K%s (%d)"
: BCYN "\r\033[K%s (%d)" CRESET, text, time - i + time2
);
fflush(stdout); fflush(stdout);
sleep(1); sleep(1);
if (cond != NULL && cond(cond_arg)) pthread_exit(NULL); if (cond != NULL && cond(cond_arg)) pthread_exit(NULL);
} }
printf(CYN "\r%s (%d)" CRESET, text, time2); printf(
(palerain_flags & palerain_option_no_colors)
? "\r%s (%d)"
: CYN "\r%s (%d)" CRESET, text, time2
);
if (time2 == 0) puts(""); if (time2 == 0) puts("");
} }
@@ -53,13 +61,14 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
LOG(LOG_ERROR, "Unable to get device information"); LOG(LOG_ERROR, "Unable to get device information");
return 0; return 0;
} }
if (strcmp(dev.CPUArchitecture, "arm64")) { if (strncmp(dev.CPUArchitecture, "arm64", strlen("arm64"))) {
devinfo_free(&dev); devinfo_free(&dev);
LOG(LOG_WARNING, "Ignoring non-arm64 device..."); LOG(LOG_WARNING, "Ignoring non-arm64 device...");
LOG(LOG_WARNING, "palera1n doesn't and never will work on A12+ (arm64e)");
return -1; return -1;
} }
if (!strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) { if (!strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) {
if (!checkrain_option_enabled(host_flags, host_option_device_info)) if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_VERBOSE2, "Product %s requires passcode to be disabled", dev.productType); LOG(LOG_VERBOSE2, "Product %s requires passcode to be disabled", dev.productType);
unsigned char passcode_state = 0; unsigned char passcode_state = 0;
ret = passstat_cmd(&passcode_state, usbmuxd_device->udid); ret = passstat_cmd(&passcode_state, usbmuxd_device->udid);
@@ -70,14 +79,14 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
} }
if (passcode_state) { if (passcode_state) {
LOG(LOG_ERROR, "Passcode must be disabled on this device"); LOG(LOG_ERROR, "Passcode must be disabled on this device");
if (!checkrain_option_enabled(host_flags, host_option_device_info)) if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_ERROR, "Additionally, passcode must never be set since restore on iOS 16+"); LOG(LOG_ERROR, "Additionally, passcode must never be set since a restore on iOS 16+");
devinfo_free(&dev); devinfo_free(&dev);
return -1; return -1;
} }
} }
if (checkrain_option_enabled(host_flags, host_option_device_info)) { if ((palerain_flags & palerain_option_device_info)) {
printf("Mode: normal\n"); printf("Mode: normal\n");
printf("ProductType: %s\n", dev.productType); printf("ProductType: %s\n", dev.productType);
printf("Architecture: %s\n", dev.CPUArchitecture); printf("Architecture: %s\n", dev.CPUArchitecture);
@@ -89,10 +98,16 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
unsubscribe_cmd(); unsubscribe_cmd();
return 0; return 0;
} }
LOG(LOG_INFO, "Telling device with udid %s to enter recovery mode immediately", usbmuxd_device->udid); if (verbose > 1) {
/* (LOG_VERBOSE - 3) or below*/
LOG(LOG_INFO, "Telling device with udid %s to enter recovery mode immediately", usbmuxd_device->udid);
} else {
/* At least (LOG_VERBOSE2 - 3) */
LOG(LOG_INFO, "Entering recovery mode");
}
enter_recovery_cmd(usbmuxd_device->udid); enter_recovery_cmd(usbmuxd_device->udid);
devinfo_free(&dev); devinfo_free(&dev);
if (checkrain_option_enabled(host_flags, host_option_enter_recovery)) { if ((palerain_flags & palerain_option_enter_recovery)) {
device_has_booted = true; device_has_booted = true;
set_spin(0); set_spin(0);
unsubscribe_cmd(); unsubscribe_cmd();
@@ -137,17 +152,14 @@ void* connected_recovery_mode(struct irecv_device_info* info) {
return NULL; return NULL;
} }
printf("\r\033[K"); printf("\r\033[K");
bool nohome = NOHOME; if (NOHOME) {
if (nohome)
step(2, 0, "Hold volume down + side button", NULL, 0); step(2, 0, "Hold volume down + side button", NULL, 0);
else
step(2, 0, "Hold home + power button", NULL, 0);
if (nohome)
step(10, 0, "Hold volume down button", conditional, ecid); step(10, 0, "Hold volume down button", conditional, ecid);
else
step(10, 0, "Hold home button", conditional, ecid);
if (get_ecid_wait_for_dfu() != ecid) {
} else { } else {
step(2, 0, "Hold home + power button", NULL, 0);
step(10, 0, "Hold home button", conditional, ecid);
}
if (get_ecid_wait_for_dfu() == ecid) {
LOG(LOG_WARNING, "Whoops, device did not enter DFU mode"); LOG(LOG_WARNING, "Whoops, device did not enter DFU mode");
LOG(LOG_INFO, "Waiting for device to reconnect..."); LOG(LOG_INFO, "Waiting for device to reconnect...");
set_ecid_wait_for_dfu(0); set_ecid_wait_for_dfu(0);
@@ -175,13 +187,15 @@ void device_event_cb(const usbmuxd_event_t *event, void* userdata) {
switch (event->event) { switch (event->event) {
case UE_DEVICE_ADD: case UE_DEVICE_ADD:
LOG(LOG_VERBOSE, "Normal mode device connected"); LOG(LOG_VERBOSE, "Normal mode device connected");
if (checkrain_option_enabled(host_flags, host_option_exit_recovery)) { if ((palerain_flags & palerain_option_exit_recovery)) {
break; break;
} else if (checkrain_option_enabled(host_flags, host_option_reboot_device)) { } else if ((palerain_flags & palerain_option_reboot_device)) {
reboot_cmd(event->device.udid); int ret = reboot_cmd(event->device.udid);
LOG(LOG_INFO, "Restarted device"); if (!ret) {
set_spin(0); LOG(LOG_INFO, "Restarted device");
unsubscribe_cmd(); set_spin(0);
unsubscribe_cmd();
}
pthread_exit(NULL); pthread_exit(NULL);
break; break;
} }
@@ -195,69 +209,85 @@ void device_event_cb(const usbmuxd_event_t *event, void* userdata) {
void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) { void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) {
pthread_t recovery_thread, dfu_thread; pthread_t recovery_thread, dfu_thread;
int ret;
switch(event->type) { switch(event->type) {
case IRECV_DEVICE_ADD: case IRECV_DEVICE_ADD:
if (event->mode == IRECV_K_RECOVERY_MODE_1 || event->mode == IRECV_K_RECOVERY_MODE_2 || event->mode == IRECV_K_RECOVERY_MODE_3 || event->mode == IRECV_K_RECOVERY_MODE_4) { if (event->mode == IRECV_K_RECOVERY_MODE_1 ||
if (!checkrain_option_enabled(host_flags, host_option_device_info)) event->mode == IRECV_K_RECOVERY_MODE_2 ||
LOG(LOG_VERBOSE, "Recovery mode device %ld connected", event->device_info->ecid); event->mode == IRECV_K_RECOVERY_MODE_3 ||
if (checkrain_option_enabled(host_flags, host_option_exit_recovery)) { event->mode == IRECV_K_RECOVERY_MODE_4) {
exitrecv_cmd(event->device_info->ecid); if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_INFO, "Exited recovery mode"); LOG(LOG_VERBOSE, "Recovery mode device %ld connected", event->device_info->ecid);
device_has_booted = true; if ((palerain_flags & palerain_option_exit_recovery)) {
set_spin(0); ret = exitrecv_cmd(event->device_info->ecid);
unsubscribe_cmd(); if (!ret) {
if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread); LOG(LOG_INFO, "Exited recovery mode");
pthread_exit(NULL); device_has_booted = true;
break; set_spin(0);
} unsubscribe_cmd();
} else {
if (checkrain_option_enabled(host_flags, host_option_device_info)) { LOG(LOG_WARNING, "Could not exit recovery mode");
recvinfo_t info; }
recvinfo_cmd(&info, event->device_info->ecid); if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread);
printf("Mode: recovery\n"); pthread_exit(NULL);
printf("ProductType: %s\n", info.product_type);
printf("DisplayName: %s\n", info.display_name);
device_has_booted = true;
set_spin(0);
unsubscribe_cmd();
if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread);
pthread_exit(NULL);
break;
}
if (checkrain_option_enabled(host_flags, host_option_enter_recovery) ||
checkrain_option_enabled(host_flags, host_option_reboot_device)) return;
pthread_create(&recovery_thread, NULL, (void* (*)(void*))connected_recovery_mode, event->device_info);
} else if (event->mode == IRECV_K_DFU_MODE) {
if (!checkrain_option_enabled(host_flags, host_option_device_info))
LOG(LOG_VERBOSE, "DFU mode device %ld connected", event->device_info->ecid);
if (checkrain_option_enabled(host_flags, host_option_device_info)) {
recvinfo_t info;
recvinfo_cmd(&info, event->device_info->ecid);
printf("Mode: dfu\n");
printf("ProductType: %s\n", info.product_type);
printf("DisplayName: %s\n", info.display_name);
device_has_booted = true;
set_spin(0);
unsubscribe_cmd();
if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread);
pthread_exit(NULL);
break;
}
if (
checkrain_option_enabled(host_flags, host_option_exit_recovery) ||
checkrain_option_enabled(host_flags, host_option_enter_recovery) ||
checkrain_option_enabled(host_flags, host_option_reboot_device)) {
break; break;
}
if ((palerain_flags & palerain_option_device_info)) {
recvinfo_t info;
ret = recvinfo_cmd(&info, event->device_info->ecid);
if (ret) {
LOG(LOG_WARNING, "Could not get info from device");
} else {
printf("Mode: Recovery\n");
printf("ProductType: %s\n", info.product_type);
printf("DisplayName: %s\n", info.display_name);
device_has_booted = true;
set_spin(0);
unsubscribe_cmd();
}
if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread);
pthread_exit(NULL);
break;
}
if ((palerain_flags & palerain_option_enter_recovery) ||
(palerain_flags & palerain_option_reboot_device)) return;
pthread_create(&recovery_thread, NULL, (pthread_start_t)connected_recovery_mode, event->device_info);
} else if (event->mode == IRECV_K_DFU_MODE) {
if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_VERBOSE, "DFU mode device %ld connected", event->device_info->ecid);
if ((palerain_flags & palerain_option_device_info)) {
recvinfo_t info;
ret = recvinfo_cmd(&info, event->device_info->ecid);
if (ret) {
LOG(LOG_WARNING, "Could not get info from device");
} else {
printf("Mode: DFU\n");
printf("ProductType: %s\n", info.product_type);
printf("DisplayName: %s\n", info.display_name);
device_has_booted = true;
set_spin(0);
unsubscribe_cmd();
}
if (dfuhelper_thr_running) pthread_cancel(dfuhelper_thread);
pthread_exit(NULL);
break;
}
if (
(palerain_flags & palerain_option_exit_recovery) ||
(palerain_flags & palerain_option_enter_recovery) ||
(palerain_flags & palerain_option_reboot_device)) {
break;
}
pthread_create(&dfu_thread, NULL, (pthread_start_t)connected_dfu_mode, event->device_info);
} }
pthread_create(&dfu_thread, NULL, (void* (*)(void*))connected_dfu_mode, event->device_info); break;
}
break;
case IRECV_DEVICE_REMOVE: case IRECV_DEVICE_REMOVE:
LOG(LOG_VERBOSE, "Recovery mode device disconnected"); LOG(LOG_VERBOSE, "Recovery mode device disconnected");
break; break;
@@ -26,37 +26,65 @@ extern char **environ;
#include <palerain.h> #include <palerain.h>
#include <xxd-embedded.h> #include <xxd-embedded.h>
char* pongo_path = NULL; char* pongo_path = NULL;
bool external_pongo = false;
char* ext_checkra1n = NULL; char* ext_checkra1n = NULL;
#define tmpdir getenv("TMPDIR") == NULL ? "/tmp" : getenv("TMPDIR") #define tmpdir getenv("TMPDIR") == NULL ? "/tmp" : getenv("TMPDIR")
int exec_checkra1n(void) { int exec_checkra1n(void) {
LOG(LOG_INFO, "About to execute checkra1n"); LOG(LOG_INFO, "About to execute checkra1n");
int fd, ret; int fd_checkra1n, fd_pongo, ret;
char* checkra1n_path = NULL; char* checkra1n_path = NULL;
if (ext_checkra1n != NULL) { if (ext_checkra1n != NULL) {
checkra1n_path = ext_checkra1n; checkra1n_path = ext_checkra1n;
goto checkra1n_exec; 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); checkra1n_path = malloc(strlen(tmpdir) + 20);
snprintf(checkra1n_path, strlen(tmpdir) + 20, "%s/checkra1n.XXXXXX", tmpdir); snprintf(checkra1n_path, strlen(tmpdir) + 20, "%s/checkra1n.XXXXXX", tmpdir);
fd = mkstemp(checkra1n_path); fd_checkra1n = mkstemp(checkra1n_path);
if (fd == -1) { if (fd_checkra1n == -1) {
LOG(LOG_FATAL, "Cannot open temporary file: %d (%s)", errno, strerror(errno)); LOG(LOG_FATAL, "Cannot open temporary file %s: %d (%s)", checkra1n_path, errno, strerror(errno));
free(checkra1n_path);
checkra1n_path = NULL;
return -1; return -1;
} }
ssize_t didWrite = write(fd, checkra1n, checkra1n_len); ssize_t didWrite_checkra1n = write(fd_checkra1n, checkra1n, checkra1n_len);
if (didWrite != (ssize_t)checkra1n_len) { if (didWrite_checkra1n != (ssize_t)checkra1n_len) {
LOG(LOG_FATAL, "Size written does not match expected: %lld != %d: %d (%s)", didWrite, checkra1n_len, errno, strerror(errno)); 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); close(fd_checkra1n);
unlink(checkra1n_path); unlink(checkra1n_path);
free(checkra1n_path);
checkra1n_path = NULL;
return -1; return -1;
} }
close(fd); close(fd_checkra1n);
ret = chmod(checkra1n_path, 0700); ret = chmod(checkra1n_path, 0700);
if (ret) { if (ret) {
LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", checkra1n_path, errno, strerror(errno)); LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", checkra1n_path, errno, strerror(errno));
unlink(checkra1n_path); unlink(checkra1n_path);
free(checkra1n_path);
checkra1n_path = NULL;
return -1; return -1;
} }
#if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER)) #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)); LOG(LOG_FATAL, "Cannot open temporary file: %d (%s)", errno, strerror(errno));
return -1; return -1;
} }
ssize_t didWrite = write(helper_fd, libcheckra1nhelper_dylib, libcheckra1nhelper_dylib_len); ssize_t didWrite_libcheckra1nhelper = write(helper_fd, libcheckra1nhelper_dylib, libcheckra1nhelper_dylib_len);
if ((unsigned int)didWrite != 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_dylib_len, errno, strerror(errno)); LOG(LOG_FATAL, "Size written does not match expected: %lld != %d: %d (%s)", didWrite_libcheckra1nhelper, libcheckra1nhelper_dylib_len, errno, strerror(errno));
close(helper_fd); close(helper_fd);
unlink(libcheckra1nhelper_dylib_path); unlink(libcheckra1nhelper_dylib_path);
return -1; return -1;
@@ -98,24 +126,32 @@ int exec_checkra1n(void) {
#endif #endif
checkra1n_exec: {}; checkra1n_exec: {};
char args[0x10] = "-E"; char args[0x10] = "-E";
if (checkrain_option_enabled(host_flags, host_option_demote)) strncat(args, "d", 0xf); if ((palerain_flags & palerain_option_demote)) strncat(args, "d", 0xf);
if (!checkrain_option_enabled(host_flags, palerain_option_checkrain_is_clone)) { if (!(palerain_flags & palerain_option_checkrain_is_clone)) {
strncat(args, "p", 0xf); strncat(args, "p", 0xf);
if (verbose >= 2) strncat(args, "v", 0xf); if (verbose >= 2) strncat(args, "v", 0xf);
if ((palerain_flags & palerain_option_no_colors)) strncat(args, "n", 0xf);
} else { } else {
strncat(args, "R", 0xf); strncat(args, "R", 0xf);
} }
if (pongo_path != NULL) strncat(args, "k", 0xf); // keep this at last LOG(LOG_VERBOSE5, args);
if (pongo_path != NULL) LOG(LOG_VERBOSE5, pongo_path);
pid_t pid; pid_t pid;
char* checkra1n_argv[] = { if (pongo_path != NULL) {
checkra1n_path, ret = posix_spawn(&pid, checkra1n_path, NULL, NULL, (char* []){
args, checkra1n_path,
pongo_path, args,
NULL "-k",
}; pongo_path,
ret = posix_spawn(&pid, checkra1n_path, NULL, NULL, checkra1n_argv, environ); NULL
if (pongo_path != NULL) free(pongo_path); }, environ);
pongo_path = NULL; } else {
ret = posix_spawn(&pid, checkra1n_path, NULL, NULL, (char* []){
checkra1n_path,
args,
NULL
}, environ);
}
if (ret) { if (ret) {
LOG(LOG_FATAL, "Cannot posix spawn %s: %d (%s)", checkra1n_path, errno, strerror(errno)); LOG(LOG_FATAL, "Cannot posix spawn %s: %d (%s)", checkra1n_path, errno, strerror(errno));
if (ext_checkra1n != NULL) unlink(checkra1n_path); if (ext_checkra1n != NULL) unlink(checkra1n_path);
@@ -128,6 +164,12 @@ checkra1n_exec: {};
free(checkra1n_path); free(checkra1n_path);
checkra1n_path = NULL; checkra1n_path = NULL;
} }
waitpid(pid, NULL, 0);
if (!external_pongo && pongo_path != NULL) {
unlink(pongo_path);
}
if (pongo_path != NULL) free(pongo_path);
pongo_path = NULL;
#if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER)) #if defined(__APPLE__) && defined(__arm64__) && (TARGET_OS_IPHONE || defined(FORCE_HELPER))
if (libcheckra1nhelper_dylib_path != NULL) { if (libcheckra1nhelper_dylib_path != NULL) {
unlink(libcheckra1nhelper_dylib_path); unlink(libcheckra1nhelper_dylib_path);
@@ -137,6 +179,5 @@ checkra1n_exec: {};
libcheckra1nhelper_dylib_path = NULL; libcheckra1nhelper_dylib_path = NULL;
} }
#endif #endif
waitpid(pid, NULL, 0);
return 0; return 0;
} }
@@ -15,7 +15,12 @@ unsigned char* checkra1n = NULL;
unsigned int checkra1n_len = 0; unsigned int checkra1n_len = 0;
#endif #endif
#ifdef NO_BINPACK #ifdef NO_OVERLAY
unsigned char* binpack_dmg = NULL; unsigned char* binpack_dmg = NULL;
unsigned int binpack_dmg_len = 0; unsigned int binpack_dmg_len = 0;
#endif #endif
#ifdef NO_CUSTOM_PONGO
unsigned char* Pongo_bin = NULL;
unsigned int Pongo_bin_len = 0;
#endif
Submodule src/jbinit deleted from 68dfd57cd5.
Submodule src/loader deleted from d73b4ac49f.
+4 -4
View File
@@ -27,10 +27,10 @@
#include <ANSI-color-codes.h> #include <ANSI-color-codes.h>
#include <palerain.h> #include <palerain.h>
#include <xxd-embedded.h> #include <xxd-embedded.h>
#include <kerninfo.h> #include <paleinfo.h>
pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex; pthread_mutex_t spin_mutex, found_pongo_mutex, ecid_dfu_wait_mutex;
#ifdef DEV_BUILD #ifdef TUI
#include <newt.h> #include <newt.h>
pthread_mutex_t tui_log_mutex; pthread_mutex_t tui_log_mutex;
newtComponent tui_log_output = NULL; newtComponent tui_log_output = NULL;
@@ -89,8 +89,8 @@ uint64_t set_ecid_wait_for_dfu(uint64_t ecid) {
return ecid; return ecid;
} }
#ifdef DEV_BUILD #ifdef TUI
newtComponent get_tui_log() { newtComponent get_tui_log(void) {
pthread_mutex_lock(&tui_log_mutex); pthread_mutex_lock(&tui_log_mutex);
newtComponent ret = tui_log_output; newtComponent ret = tui_log_output;
pthread_mutex_unlock(&tui_log_mutex); pthread_mutex_unlock(&tui_log_mutex);
@@ -11,22 +11,19 @@
#ifdef DEBUG #ifdef DEBUG
#define log_debug(...) fprintf(stderr, __VA_ARGS__); fputc('\n', stderr) #define log_debug(...) fprintf(stderr, __VA_ARGS__); fputc('\n', stderr)
#else #else
#define log_debug(...) #define log_debug(...) do {} while (0)
#endif #endif
#define log_error(...) fprintf(stderr, __VA_ARGS__); fputc('\n', stderr) #define log_error(...) fprintf(stderr, __VA_ARGS__); fputc('\n', stderr)
int lockdown_connect_handle(uint32_t handle) int lockdown_connect_handle(uint32_t handle) {
{
int fd = usbmuxd_connect(handle, 62078); int fd = usbmuxd_connect(handle, 62078);
if (fd < 0) { if (fd < 0) {
log_debug("Can't connect to lockownd on device #%u", handle); log_debug("Can't connect to lockownd on device #%u", handle);
return fd;
} }
return fd; return fd;
} }
int lockdown_connect_udid(const char* udid) int lockdown_connect_udid(const char* udid) {
{
usbmuxd_device_info_t device; usbmuxd_device_info_t device;
if (usbmuxd_get_device_by_udid(udid, &device) < 0) { if (usbmuxd_get_device_by_udid(udid, &device) < 0) {
log_debug("Can't find device %s", udid); log_debug("Can't find device %s", udid);
@@ -35,8 +32,7 @@ int lockdown_connect_udid(const char* udid)
return lockdown_connect_handle(device.handle); return lockdown_connect_handle(device.handle);
} }
void lockdown_disconnect(int fd) void lockdown_disconnect(int fd) {
{
usbmuxd_disconnect(fd); usbmuxd_disconnect(fd);
} }
@@ -56,8 +52,7 @@ static const int INTEGER_NODE_SIZE = sizeof(INTEGER_NODE)-1;
static const int STRING_NODE_SIZE = sizeof(STRING_NODE)-1; static const int STRING_NODE_SIZE = sizeof(STRING_NODE)-1;
static const int ERROR_KEY_NODE_SIZE = sizeof(ERROR_KEY_NODE)-1; static const int ERROR_KEY_NODE_SIZE = sizeof(ERROR_KEY_NODE)-1;
static void skip_ws(char** cur, char* end) static void skip_ws(char** cur, char* end) {
{
char* p = *cur; char* p = *cur;
while (p < end && ((*p == ' ') || (*p == '\t') || (*p == '\r') || (*p == '\n'))) { while (p < end && ((*p == ' ') || (*p == '\t') || (*p == '\r') || (*p == '\n'))) {
p++; p++;
@@ -65,8 +60,7 @@ static void skip_ws(char** cur, char* end)
*cur = p; *cur = p;
} }
static char* _send_request_and_get_reply(int fd, const char* request, uint32_t len, uint32_t* received) static char* _send_request_and_get_reply(int fd, const char* request, uint32_t len, uint32_t* received) {
{
uint32_t sent_bytes = 0; uint32_t sent_bytes = 0;
usbmuxd_send(fd, request, len, &sent_bytes); usbmuxd_send(fd, request, len, &sent_bytes);
if (sent_bytes != len) { if (sent_bytes != len) {
@@ -100,8 +94,7 @@ static char* _send_request_and_get_reply(int fd, const char* request, uint32_t l
return resp; return resp;
} }
int lockdown_check_type(int fd, const char* type_match) int lockdown_check_type(int fd, const char* type_match) {
{
unsigned char tmp[512]; unsigned char tmp[512];
uint32_t len = (uint32_t)snprintf((char*)tmp, 512, QUERY_TYPE_REQUEST); uint32_t len = (uint32_t)snprintf((char*)tmp, 512, QUERY_TYPE_REQUEST);
uint32_t belen = htonl(len-4); uint32_t belen = htonl(len-4);
@@ -119,8 +112,7 @@ int lockdown_check_type(int fd, const char* type_match)
return result; return result;
} }
int lockdown_get_uint_value(int fd, const char* domain, const char* key, uint64_t* value) int lockdown_get_uint_value(int fd, const char* domain, const char* key, uint64_t* value) {
{
char tmp[1024]; char tmp[1024];
uint32_t len; uint32_t len;
if (domain) { if (domain) {
@@ -159,8 +151,7 @@ int lockdown_get_uint_value(int fd, const char* domain, const char* key, uint64_
return 0; return 0;
} }
int lockdown_get_string_value(int fd, const char* domain, const char* key, char** value) int lockdown_get_string_value(int fd, const char* domain, const char* key, char** value) {
{
char tmp[1024]; char tmp[1024];
uint32_t len; uint32_t len;
if (domain) { if (domain) {
@@ -212,8 +203,7 @@ int lockdown_get_string_value(int fd, const char* domain, const char* key, char*
return 0; return 0;
} }
int lockdown_enter_recovery(int fd) int lockdown_enter_recovery(int fd) {
{
char tmp[512]; char tmp[512];
uint32_t len = (uint32_t)snprintf(tmp, 512, ENTER_RECOVERY_REQUEST); uint32_t len = (uint32_t)snprintf(tmp, 512, ENTER_RECOVERY_REQUEST);
*(uint32_t*)&tmp = htonl(len-4); *(uint32_t*)&tmp = htonl(len-4);
File renamed without changes.
+25 -10
View File
@@ -11,8 +11,8 @@
int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxname, const char *__restrict format, ...) int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxname, const char *__restrict format, ...)
{ {
if (verbose >= 5 if (verbose >= 5
#ifdef DEV_BUILD #ifdef TUI
&& !checkrain_option_enabled(host_flags, host_option_tui) && !(palerain_flags & palerain_option_tui)
#endif #endif
) fprintf(stderr, "p1_log: loglevel %d from %s:%d:%s()\n", loglevel, fname, lineno, fxname); ) fprintf(stderr, "p1_log: loglevel %d from %s:%d:%s()\n", loglevel, fname, lineno, fxname);
int ret = 0; int ret = 0;
@@ -23,7 +23,7 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
va_start(args, format); va_start(args, format);
if (verbose < (loglevel - 3) && loglevel > LOG_INFO) { if (verbose < (loglevel - 3) && loglevel > LOG_INFO) {
if (verbose >= 5 if (verbose >= 5
#ifdef DEV_BUILD #ifdef TUI
&& !tui_started && !tui_started
#endif #endif
) fprintf(stderr, "p1_log: hid log with high log level (%d < %d)\n", verbose, loglevel - 3); ) fprintf(stderr, "p1_log: hid log with high log level (%d < %d)\n", verbose, loglevel - 3);
@@ -57,8 +57,12 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
snprintf(colour_bold, 0x10, "%s", BWHT); snprintf(colour_bold, 0x10, "%s", BWHT);
break; break;
} }
#ifdef DEV_BUILD if ((palerain_flags & palerain_option_no_colors)) {
if (checkrain_option_enabled(host_flags, host_option_tui) && tui_started) { colour[0] = '\0';
colour_bold[0] = '\0';
}
#ifdef TUI
if ((palerain_flags & palerain_option_tui) && tui_started) {
newtComponent co = get_tui_log(); newtComponent co = get_tui_log();
if (co == NULL) { if (co == NULL) {
return 0; /* 0 bytes printed */ return 0; /* 0 bytes printed */
@@ -75,20 +79,31 @@ int p1_log(log_level_t loglevel, const char *fname, int lineno, const char *fxna
time_t curtime; time_t curtime;
time(&curtime); time(&curtime);
struct tm* timeinfo = localtime(&curtime); struct tm* timeinfo = localtime(&curtime);
snprintf(timestring, 0x80, "%s[%s%02d/%02d/%d %02d:%02d:%02d%s]", CRESET, HBLK, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_year - 100, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, CRESET); if (!(palerain_flags & palerain_option_no_colors))
if (verbose >= 2) { snprintf(timestring, 0x80, "%s[%s%02d/%02d/%d %02d:%02d:%02d%s]", CRESET, HBLK, timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_year - 100, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, CRESET);
else
snprintf(timestring, 0x80, "[%02d/%02d/%d %02d:%02d:%02d]", timeinfo->tm_mon + 1, timeinfo->tm_mday, timeinfo->tm_year - 100, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
if (verbose >= 2 && !(palerain_flags & palerain_option_no_colors)) {
printf("%s| - %s%s <%s> " CRESET "%s" HBLU "%s" CRESET ":" BLU "%d" CRESET ":" BMAG "%s()" CRESET ": \n%s| ----> ", colour_bold, timestring, colour_bold, type, WHT, fname, lineno, fxname, colour_bold); printf("%s| - %s%s <%s> " CRESET "%s" HBLU "%s" CRESET ":" BLU "%d" CRESET ":" BMAG "%s()" CRESET ": \n%s| ----> ", colour_bold, timestring, colour_bold, type, WHT, fname, lineno, fxname, colour_bold);
} else { } else if (!(palerain_flags & palerain_option_no_colors)) {
printf(" - %s %s<%s>%s: ", timestring, colour_bold, type, CRESET); printf(" - %s %s<%s>%s: ", timestring, colour_bold, type, CRESET);
} else if (verbose >= 2 && (palerain_flags & palerain_option_no_colors)) {
printf("%s| - %s%s <%s> %s:%d:%s(): \n%s| ----> ", colour_bold, timestring, colour_bold, type, fname, lineno, fxname, colour_bold);
} else if ((palerain_flags & palerain_option_no_colors)) {
printf(" - %s %s<%s>: ", timestring, colour_bold, type);
} }
printf("%s", colour); printf("%s", colour);
ret = vprintf(format, args); ret = vprintf(format, args);
va_end(args); va_end(args);
if (verbose < 2) if (verbose < 2 && !(palerain_flags & palerain_option_no_colors))
printf(CRESET "\n"); printf(CRESET "\n");
else else if (!(palerain_flags & palerain_option_no_colors))
printf("\n%s-%s\n", colour, CRESET); printf("\n%s-%s\n", colour, CRESET);
else if (verbose < 2)
printf("\n");
else
printf("\n%s-\n", colour);
fflush(stdout); fflush(stdout);
} }
pthread_mutex_unlock(&log_mutex); pthread_mutex_unlock(&log_mutex);
+20 -44
View File
@@ -27,14 +27,14 @@
#include <ANSI-color-codes.h> #include <ANSI-color-codes.h>
#include <palerain.h> #include <palerain.h>
#include <xxd-embedded.h> #include <xxd-embedded.h>
#include <kerninfo.h> #include <paleinfo.h>
#define CMD_LEN_MAX 512 #define CMD_LEN_MAX 512
#define OVERRIDE_MAGIC 0xd803b376 #define OVERRIDE_MAGIC 0xd803b376
unsigned int verbose = 0; unsigned int verbose = 0;
char xargs_cmd[0x270] = "xargs ", checkrain_flags_cmd[0x20] = "deadbeef", palerain_flags_cmd[0x20] = "deadbeef"; char xargs_cmd[0x270] = "xargs ", palerain_flags_cmd[0x30] = "deadbeef";
char kpf_flags_cmd[0x20] = "deadbeef", dtpatch_cmd[0x20] = "deadbeef", rootfs_cmd[512] = "deadbeef"; char dtpatch_cmd[0x20] = "deadbeef", rootfs_cmd[512] = "deadbeef";
extern char** environ; extern char** environ;
niarelap_file_t* kpf_to_upload_1 = &checkra1n_kpf_pongo; niarelap_file_t* kpf_to_upload_1 = &checkra1n_kpf_pongo;
@@ -47,7 +47,7 @@ niarelap_file_t** overlay_to_upload = &overlay_to_upload_1;
override_file_t override_ramdisk, override_kpf, override_overlay; override_file_t override_ramdisk, override_kpf, override_overlay;
uint32_t checkrain_flags = 0, palerain_flags = 0, kpf_flags = 0; uint64_t palerain_flags = 0;
pthread_mutex_t log_mutex; pthread_mutex_t log_mutex;
pthread_t dfuhelper_thread, pongo_thread; pthread_t dfuhelper_thread, pongo_thread;
@@ -72,9 +72,8 @@ int build_checks(void) {
if (checkra1n_len <= (UCHAR_MAX + 1)) { if (checkra1n_len <= (UCHAR_MAX + 1)) {
LOG(LOG_FATAL, "checkra1n too small"); LOG(LOG_FATAL, "checkra1n too small");
} }
if (boyermoore_horspool_memmem(&checkra1n[0], checkra1n_len, (const unsigned char*)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL) { if (boyermoore_horspool_memmem(&checkra1n[0], checkra1n_len, (const unsigned char *)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL) {
host_flags |= palerain_option_checkrain_is_clone; palerain_flags |= palerain_option_checkrain_is_clone;
LOG(LOG_WARNING, "Do not distribute!");
} }
#endif #endif
#ifndef NO_KPF #ifndef NO_KPF
@@ -82,8 +81,7 @@ int build_checks(void) {
if (kpf_hdr->magic != MH_MAGIC_64 && kpf_hdr->magic != MH_CIGAM_64) { if (kpf_hdr->magic != MH_MAGIC_64 && kpf_hdr->magic != MH_CIGAM_64) {
LOG(LOG_FATAL, "Broken build: Invalid kernel patchfinder: Not thin 64-bit Mach-O"); LOG(LOG_FATAL, "Broken build: Invalid kernel patchfinder: Not thin 64-bit Mach-O");
return -1; return -1;
} else } else if (kpf_hdr->filetype != MH_KEXT_BUNDLE) {
if (kpf_hdr->filetype != MH_KEXT_BUNDLE) {
LOG(LOG_FATAL, "Broken build: Invalid kernel patchfinder: Not a kext bundle"); LOG(LOG_FATAL, "Broken build: Invalid kernel patchfinder: Not a kext bundle");
return -1; return -1;
} else if (kpf_hdr->cputype != CPU_TYPE_ARM64) { } else if (kpf_hdr->cputype != CPU_TYPE_ARM64) {
@@ -94,7 +92,7 @@ int build_checks(void) {
return 0; return 0;
} }
#ifdef DEV_BUILD #ifdef TUI
bool tui_started = false; bool tui_started = false;
#endif #endif
@@ -105,6 +103,7 @@ void log_cb(libusb_context *ctx, enum libusb_log_level level, const char *str) {
#endif #endif
int palera1n(int argc, char *argv[]) { int palera1n(int argc, char *argv[]) {
print_credits();
int ret = 0; int ret = 0;
pthread_mutex_init(&log_mutex, NULL); pthread_mutex_init(&log_mutex, NULL);
pthread_mutex_init(&spin_mutex, NULL); pthread_mutex_init(&spin_mutex, NULL);
@@ -112,11 +111,9 @@ int palera1n(int argc, char *argv[]) {
pthread_mutex_init(&ecid_dfu_wait_mutex, NULL); pthread_mutex_init(&ecid_dfu_wait_mutex, NULL);
if ((ret = build_checks())) return ret; if ((ret = build_checks())) return ret;
if ((ret = optparse(argc, argv))) goto cleanup; if ((ret = optparse(argc, argv))) goto cleanup;
if (!checkrain_option_enabled(host_flags, host_option_device_info)) if (!(palerain_flags & palerain_option_device_info) && (palerain_flags & palerain_option_palerain_version)) goto normal_exit;
print_credits(); #ifdef TUI
if (checkrain_option_enabled(host_flags, host_option_palerain_version)) goto normal_exit; if ((palerain_flags & palerain_option_tui)) {
#ifdef DEV_BUILD
if (checkrain_option_enabled(host_flags, host_option_tui)) {
ret = tui(); ret = tui();
if (ret) goto cleanup; if (ret) goto cleanup;
else goto normal_exit; else goto normal_exit;
@@ -136,7 +133,7 @@ int palera1n(int argc, char *argv[]) {
} }
#endif #endif
if (!checkrain_option_enabled(host_flags, host_option_device_info)) if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_INFO, "Waiting for devices"); LOG(LOG_INFO, "Waiting for devices");
if (access("/var/run/usbmuxd", F_OK) != 0) if (access("/var/run/usbmuxd", F_OK) != 0)
@@ -146,16 +143,16 @@ int palera1n(int argc, char *argv[]) {
pthread_create(&dfuhelper_thread, NULL, dfuhelper, NULL); pthread_create(&dfuhelper_thread, NULL, dfuhelper, NULL);
pthread_join(dfuhelper_thread, NULL); pthread_join(dfuhelper_thread, NULL);
set_spin(0); set_spin(0);
if (checkrain_option_enabled(host_flags, host_option_dfuhelper_only) || if ((palerain_flags & (palerain_option_dfuhelper_only |
checkrain_option_enabled(host_flags, host_option_reboot_device) || palerain_option_reboot_device |
checkrain_option_enabled(host_flags, host_option_exit_recovery) || palerain_option_exit_recovery |
checkrain_option_enabled(host_flags, host_option_enter_recovery) || palerain_option_enter_recovery |
checkrain_option_enabled(host_flags, host_option_device_info) || palerain_option_device_info)
device_has_booted) ) || device_has_booted)
goto normal_exit; goto normal_exit;
if (exec_checkra1n()) goto cleanup; if (exec_checkra1n()) goto cleanup;
if (checkrain_option_enabled(host_flags, host_option_pongo_exit) || checkrain_option_enabled(host_flags, host_option_demote)) if ((palerain_flags & (palerain_option_pongo_exit | palerain_option_demote)))
goto normal_exit; goto normal_exit;
set_spin(1); set_spin(1);
sleep(2); sleep(2);
@@ -166,27 +163,6 @@ int palera1n(int argc, char *argv[]) {
sleep(1); sleep(1);
} }
normal_exit: normal_exit:
if (access("/usr/bin/curl", F_OK) == 0 && !checkrain_option_enabled(host_flags, host_option_no_ohio)) {
LOG(LOG_VERBOSE4, "Ohio");
char* ohio_argv[] = {
"/usr/bin/curl",
"-sX",
"POST",
"-d",
"{\"app_name\": \"palera1n_c-rewrite\"}",
"-H",
"Content-Type: application/json",
"-H",
"User-Agent: python-requests/99 palera1n-c-rewrite/0",
"-o",
"/dev/null",
"https://ohio.itsnebula.net/hit",
NULL
};
pid_t pid;
posix_spawn(&pid, ohio_argv[0], NULL, NULL, ohio_argv, environ);
}
cleanup: cleanup:
if (override_kpf.magic == OVERRIDE_MAGIC) { if (override_kpf.magic == OVERRIDE_MAGIC) {
munmap(override_kpf.ptr, (size_t)override_kpf.len); munmap(override_kpf.ptr, (size_t)override_kpf.len);
+92 -54
View File
@@ -13,13 +13,15 @@
#include <errno.h> #include <errno.h>
#include <palerain.h> #include <palerain.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <inttypes.h>
checkrain_option_t host_flags = 0; uint64_t* palerain_flags_p = &palerain_flags;
checkrain_option_p host_flags_p = &host_flags; static bool force_use_verbose_boot = false;
static struct option longopts[] = { static struct option longopts[] = {
{"setup-partial-fakefs", no_argument, NULL, 'B'}, {"setup-partial-fakefs", no_argument, NULL, 'B'},
{"setup-fakefs", no_argument, NULL, 'c'}, {"setup-fakefs", no_argument, NULL, 'c'},
{"clean-fakefs", no_argument, NULL, 'c'},
{"dfuhelper", no_argument, NULL, 'D'}, {"dfuhelper", no_argument, NULL, 'D'},
{"help", no_argument, NULL, 'h'}, {"help", no_argument, NULL, 'h'},
{"pongo-shell", no_argument, NULL, 'p'}, {"pongo-shell", no_argument, NULL, 'p'},
@@ -29,16 +31,15 @@ static struct option longopts[] = {
{"boot-args", required_argument, NULL, 'e'}, {"boot-args", required_argument, NULL, 'e'},
{"fakefs", no_argument, NULL, 'f'}, {"fakefs", no_argument, NULL, 'f'},
{"rootless", no_argument, NULL, 'l'}, {"rootless", no_argument, NULL, 'l'},
{"jbinit-log-to-file", no_argument, NULL, 'L'},
{"demote", no_argument, NULL, 'd'}, {"demote", no_argument, NULL, 'd'},
{"force-revert", no_argument, NULL, palerain_option_case_force_revert}, {"force-revert", no_argument, NULL, palerain_option_case_force_revert},
{"no-colors", no_argument, NULL, 'S'},
{"safe-mode", no_argument, NULL, 's'}, {"safe-mode", no_argument, NULL, 's'},
{"version", no_argument, NULL, palerain_option_case_version}, {"version", no_argument, NULL, palerain_option_case_version},
{"override-pongo", required_argument, NULL, 'k'}, {"override-pongo", required_argument, NULL, 'k'},
{"override-overlay", required_argument, NULL, 'o'}, {"override-overlay", required_argument, NULL, 'o'},
{"override-ramdisk", required_argument, NULL, 'r'}, {"override-ramdisk", required_argument, NULL, 'r'},
{"override-kpf", required_argument, NULL, 'K'}, {"override-kpf", required_argument, NULL, 'K'},
{"disable-ohio", no_argument, NULL, 'O'},
{"override-checkra1n", required_argument, NULL, 'i'}, {"override-checkra1n", required_argument, NULL, 'i'},
{"reboot-device", no_argument, NULL, 'R'}, {"reboot-device", no_argument, NULL, 'R'},
{"exit-recovery", no_argument, NULL, 'n'}, {"exit-recovery", no_argument, NULL, 'n'},
@@ -47,6 +48,8 @@ static struct option longopts[] = {
#ifdef DEV_BUILD #ifdef DEV_BUILD
{"test1", no_argument, NULL, '1'}, {"test1", no_argument, NULL, '1'},
{"test2", no_argument, NULL, '2'}, {"test2", no_argument, NULL, '2'},
#endif
#ifdef TUI
{"tui", no_argument, NULL, 't'}, {"tui", no_argument, NULL, 't'},
#endif #endif
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
@@ -55,47 +58,60 @@ static struct option longopts[] = {
static int usage(int e, char* prog_name) static int usage(int e, char* prog_name)
{ {
fprintf(stderr, fprintf(stderr,
"Usage: %s [-"
"DEhpvVdsSLRnPI"
#ifdef DEV_BUILD #ifdef DEV_BUILD
"Usage: %s [-12cCdDEfhlLnOpRstvV]" "12"
#else
"Usage: %s [-cCdDEfhlLnOpRsvV]"
#endif #endif
" [-e boot arguments] [-k Pongo image] [-o overlay file] [-r ramdisk file] [-K KPF file] [-i checkra1n file]\n" #ifdef ROOTFUL
"cCfBl"
#endif
#ifdef TUI
"t"
#endif
"] [-e boot arguments] [-k Pongo image] [-o overlay file] [-r ramdisk file] [-K KPF file] [-i checkra1n file]\n"
"Copyright (C) 2023, palera1n team, All Rights Reserved.\n\n" "Copyright (C) 2023, palera1n team, All Rights Reserved.\n\n"
"iOS/iPadOS 15.0-16.3.1 arm64 jailbreaking tool\n\n" "iOS/iPadOS 15.0-16.5 arm64 jailbreaking tool\n\n"
"\t--version\t\t\t\tPrint version\n" "\t--version\t\t\t\tPrint version\n"
"\t--force-revert\t\t\t\tRemove jailbreak\n" "\t--force-revert\t\t\t\tRemove jailbreak\n"
#ifdef DEV_BUILD #ifdef DEV_BUILD
"\t-1, --test1\t\t\t\tSet palerain_option_test1\n" "\t-1, --test1\t\t\t\tSet palerain_option_test1\n"
"\t-2, --test2\t\t\t\tSet palerain_option_test2\n" "\t-2, --test2\t\t\t\tSet palerain_option_test2\n"
#endif #endif
#ifdef ROOTFUL
"\t-B, --setup-partial-fakefs\t\tSetup partial fakefs\n" "\t-B, --setup-partial-fakefs\t\tSetup partial fakefs\n"
"\t-c, --setup-fakefs\t\t\tSetup fakefs\n" "\t-c, --setup-fakefs\t\t\tSetup fakefs\n"
"\t-C, --clean-fakefs\t\t\tClean fakefs\n"
#endif
"\t-d, --demote\t\t\t\tDemote\n" "\t-d, --demote\t\t\t\tDemote\n"
"\t-D, --dfuhelper\t\t\tExit after entering DFU\n" "\t-D, --dfuhelper\t\t\t\tExit after entering DFU\n"
"\t-e, --boot-args <boot arguments>\tXNU boot arguments\n" "\t-e, --boot-args <boot arguments>\tXNU boot arguments\n"
"\t-E, --enter-recovery\t\t\tEnter recovery mode\n" "\t-E, --enter-recovery\t\t\tEnter recovery mode\n"
#ifdef ROOTFUL
"\t-f, --fakefs \t\t\t\tBoots fakefs\n" "\t-f, --fakefs \t\t\t\tBoots fakefs\n"
#endif
"\t-h, --help\t\t\t\tShow this help\n" "\t-h, --help\t\t\t\tShow this help\n"
"\t-i, --override-checkra1n <file>\t\tOverride checkra1n\n" "\t-i, --override-checkra1n <file>\t\tOverride checkra1n\n"
"\t-k, --override-pongo <file>\t\tOverride Pongo image\n" "\t-k, --override-pongo <file>\t\tOverride Pongo image\n"
"\t-K, --override-kpf <file>\t\tOverride kernel patchfinder\n" "\t-K, --override-kpf <file>\t\tOverride kernel patchfinder\n"
#ifdef ROOTFUL
"\t-l, --rootless\t\t\t\tBoots rootless. This is the default\n" "\t-l, --rootless\t\t\t\tBoots rootless. This is the default\n"
#endif
"\t-L, --jbinit-log-to-file\t\tMake jbinit log to /cores/jbinit.log (can be read from sandbox while jailbroken)\n" "\t-L, --jbinit-log-to-file\t\tMake jbinit log to /cores/jbinit.log (can be read from sandbox while jailbroken)\n"
"\t-n, --exit-recovery\t\t\tExit recovery mode\n" "\t-n, --exit-recovery\t\t\tExit recovery mode\n"
"\t-I, --device-info\t\t\tPrint info about the connected device\n" "\t-I, --device-info\t\t\tPrint info about the connected device\n"
"\t-o, --override-overlay <file>\t\tOverride overlay\n" "\t-o, --override-overlay <file>\t\tOverride overlay\n"
"\t-O, --disable-ohio\t\t\tDisable Ohio\n"
"\t-p, --pongo-shell\t\t\tBoots to PongoOS shell\n" "\t-p, --pongo-shell\t\t\tBoots to PongoOS shell\n"
"\t-P, --pongo-full\t\t\tBoots to a PongoOS shell with default images already uploaded\n" "\t-P, --pongo-full\t\t\tBoots to a PongoOS shell with default images already uploaded\n"
"\t-r, --override-ramdisk <file>\t\tOverride ramdisk\n" "\t-r, --override-ramdisk <file>\t\tOverride ramdisk\n"
"\t-R, --reboot-device\t\t\tReboot connected device in normal mode\n" "\t-R, --reboot-device\t\t\tReboot connected device in normal mode\n"
"\t-s, --safe-mode\t\t\t\tEnter safe mode\n" "\t-s, --safe-mode\t\t\t\tEnter safe mode\n"
"\t-S, --no-colors\t\t\t\tDisable colors on the command line\n"
"\t-v, --debug-logging\t\t\tEnable debug logging\n" "\t-v, --debug-logging\t\t\tEnable debug logging\n"
"\t\tThis option can be repeated for extra verbosity.\n" "\t\tThis option can be repeated for extra verbosity.\n"
"\t-V, --verbose-boot\t\t\tVerbose boot\n" "\t-V, --verbose-boot\t\t\tVerbose boot\n"
#ifdef DEV_BUILD #ifdef TUI
"\t-t, --tui\t\t\t\tTerminal user interface\n" "\t-t, --tui\t\t\t\tTerminal user interface\n"
#endif #endif
"\nEnvironmental variables:\n" "\nEnvironmental variables:\n"
@@ -108,32 +124,35 @@ static int usage(int e, char* prog_name)
int optparse(int argc, char* argv[]) { int optparse(int argc, char* argv[]) {
int opt; int opt;
int index; int index;
while ((opt = getopt_long(argc, argv, while ((opt = getopt_long(argc, argv,
"DEhpvVlLdsStRnPIe:o:r:K:k:i:"
#ifdef DEV_BUILD #ifdef DEV_BUILD
"12BcDEhpvVldsOLftRnPIe:o:r:K:k:i:", "12"
#else
"BcDEhpvVldsOLfRnPIe:o:r:K:k:i:",
#endif #endif
longopts, NULL)) != -1) "fCcB"
,longopts, NULL)) != -1)
{ {
switch (opt) { switch (opt) {
case 'B': case 'B':
palerain_flags |= palerain_option_setup_partial_root; palerain_flags |= palerain_option_setup_partial_root;
palerain_flags |= palerain_option_setup_rootful; palerain_flags |= palerain_option_setup_rootful;
kpf_flags |= checkrain_option_verbose_boot; palerain_flags |= palerain_option_verbose_boot;
break; break;
case 'c': case 'c':
palerain_flags |= palerain_option_setup_rootful; palerain_flags |= palerain_option_setup_rootful;
kpf_flags |= checkrain_option_verbose_boot; palerain_flags |= palerain_option_verbose_boot;
break;
case 'C':
palerain_flags |= palerain_option_clean_fakefs;
break; break;
case 'p': case 'p':
host_flags |= host_option_pongo_exit; palerain_flags |= palerain_option_pongo_exit;
break; break;
case 'P': case 'P':
host_flags |= host_option_pongo_full; palerain_flags |= palerain_option_pongo_full;
break; break;
case 'D': case 'D':
host_flags |= host_option_dfuhelper_only; palerain_flags |= palerain_option_dfuhelper_only;
break; break;
case 'h': case 'h':
usage(0, argv[0]); usage(0, argv[0]);
@@ -142,7 +161,8 @@ int optparse(int argc, char* argv[]) {
verbose++; verbose++;
break; break;
case 'V': case 'V':
kpf_flags |= checkrain_option_verbose_boot; palerain_flags |= palerain_option_verbose_boot;
force_use_verbose_boot = true;
break; break;
case 'e': case 'e':
if (strstr(optarg, "rootdev=") != NULL) { if (strstr(optarg, "rootdev=") != NULL) {
@@ -158,21 +178,23 @@ int optparse(int argc, char* argv[]) {
snprintf(rootfs_cmd, sizeof(rootfs_cmd), "rootfs %s", optarg); snprintf(rootfs_cmd, sizeof(rootfs_cmd), "rootfs %s", optarg);
snprintf(dtpatch_cmd, 0x20, "dtpatch %s", optarg); snprintf(dtpatch_cmd, 0x20, "dtpatch %s", optarg);
palerain_flags |= palerain_option_rootful; palerain_flags |= palerain_option_rootful;
palerain_flags &= ~palerain_option_rootless;
break; break;
case 'l': case 'l':
palerain_flags &= ~palerain_option_rootful; palerain_flags &= ~palerain_option_rootful;
palerain_flags |= palerain_option_rootless;
break; break;
case 'L': case 'L':
palerain_flags |= palerain_option_jbinit_log_to_file; palerain_flags |= palerain_option_jbinit_log_to_file;
break; break;
case 'd': case 'd':
host_flags |= host_option_demote; palerain_flags |= palerain_option_demote;
break; break;
case 'E': case 'E':
host_flags |= host_option_enter_recovery; palerain_flags |= palerain_option_enter_recovery;
break; break;
case 's': case 's':
checkrain_flags |= checkrain_option_safemode; palerain_flags |= palerain_option_safemode;
break; break;
case 'k': case 'k':
if (access(optarg, F_OK) != 0) { if (access(optarg, F_OK) != 0) {
@@ -213,7 +235,7 @@ int optparse(int argc, char* argv[]) {
} else if (!(st.st_mode & S_IXUSR) && !(st.st_mode & S_IXGRP) && !(st.st_mode & S_IXOTH)) { } else if (!(st.st_mode & S_IXUSR) && !(st.st_mode & S_IXGRP) && !(st.st_mode & S_IXOTH)) {
LOG(LOG_FATAL, "%s is not executable", optarg); LOG(LOG_FATAL, "%s is not executable", optarg);
return -1; return -1;
} else if (!(st.st_mode & S_IFREG)) { } else if (!S_ISREG(st.st_mode)) {
LOG(LOG_FATAL, "%s is not a regular file", optarg); LOG(LOG_FATAL, "%s is not a regular file", optarg);
return -1; return -1;
} }
@@ -233,12 +255,12 @@ int optparse(int argc, char* argv[]) {
} }
if (boyermoore_horspool_memmem(addr, st.st_size, (const unsigned char*)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL) if (boyermoore_horspool_memmem(addr, st.st_size, (const unsigned char*)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL)
{ {
host_flags |= palerain_option_checkrain_is_clone; palerain_flags |= palerain_option_checkrain_is_clone;
LOG(LOG_VERBOSE3, "%s is checkra1n clone", optarg); LOG(LOG_VERBOSE3, "%s is checkra1n clone", optarg);
} }
else else
{ {
host_flags &= ~palerain_option_checkrain_is_clone; palerain_flags &= ~palerain_option_checkrain_is_clone;
LOG(LOG_VERBOSE3, "%s is checkra1n", optarg); LOG(LOG_VERBOSE3, "%s is checkra1n", optarg);
} }
munmap(addr, st.st_size); munmap(addr, st.st_size);
@@ -247,21 +269,23 @@ int optparse(int argc, char* argv[]) {
snprintf(ext_checkra1n, strlen(optarg) + 1, "%s", optarg); snprintf(ext_checkra1n, strlen(optarg) + 1, "%s", optarg);
break; break;
case 'R': case 'R':
host_flags |= host_option_reboot_device; palerain_flags |= palerain_option_reboot_device;
break; break;
case 'n': case 'n':
host_flags |= host_option_exit_recovery; palerain_flags |= palerain_option_exit_recovery;
break;
case 'O':
host_flags |= host_option_no_ohio;
break; break;
case 'I': case 'I':
host_flags |= host_option_device_info; palerain_flags |= palerain_option_device_info;
break; break;
#ifdef DEV_BUILD case 'S':
palerain_flags |= palerain_option_no_colors;
break;
#ifdef TUI
case 't': case 't':
host_flags |= host_option_tui; palerain_flags |= palerain_option_tui;
break; break;
#endif
#ifdef DEV_BUILD
case '1': case '1':
palerain_flags |= palerain_option_test1; palerain_flags |= palerain_option_test1;
break; break;
@@ -270,28 +294,40 @@ int optparse(int argc, char* argv[]) {
break; break;
#endif #endif
case palerain_option_case_force_revert: case palerain_option_case_force_revert:
checkrain_flags |= checkrain_option_force_revert; palerain_flags |= palerain_option_force_revert;
break; break;
case palerain_option_case_version: case palerain_option_case_version:
host_flags |= host_option_palerain_version; palerain_flags |= palerain_option_palerain_version;
break; break;
default: default:
usage(1, argv[0]); usage(1, argv[0]);
break; break;
} }
} }
if (checkrain_option_enabled(host_flags, host_option_palerain_version)) { if ((palerain_flags & palerain_option_palerain_version)) {
printf("palera1n version " PALERAIN_VERSION ": " BUILD_DATE "; " BUILD_WHOAMI ":" BUILD_TAG "/" BUILD_STYLE "\n"); printf(
"palera1n " PALERAIN_VERSION "\n"
BUILD_COMMIT " " BUILD_NUMBER " (" BUILD_BRANCH ")\n\n"
"Build date: " BUILD_DATE "\n"
"Build style: " BUILD_STYLE "\n"
"Build tag: " BUILD_TAG "\n"
"Built by: " BUILD_WHOAMI "\n"
#ifdef USE_LIBUSB
"USB backend: libusb\n"
#else
"USB backend: IOKit\n"
#endif
"Build options: " BUILD_OPTIONS "\n"
);
return 0; return 0;
} }
snprintf(checkrain_flags_cmd, 0x20, "checkra1n_flags 0x%x", checkrain_flags); if ((strstr(xargs_cmd, "serial=") != NULL) && !force_use_verbose_boot && (palerain_flags & palerain_option_setup_rootful)) {
snprintf(palerain_flags_cmd, 0x20, "palera1n_flags 0x%x", palerain_flags); palerain_flags &= ~palerain_option_verbose_boot;
snprintf(kpf_flags_cmd, 0x20, "kpf_flags 0x%x", kpf_flags); }
LOG(LOG_VERBOSE3, "checkrain_flags: %s", checkrain_flags_cmd);
snprintf(palerain_flags_cmd, 0x30, "palera1n_flags 0x%" PRIx64, palerain_flags);
LOG(LOG_VERBOSE3, "palerain_flags: %s", palerain_flags_cmd); LOG(LOG_VERBOSE3, "palerain_flags: %s", palerain_flags_cmd);
LOG(LOG_VERBOSE3, "kpf_flags: %s", kpf_flags_cmd);
LOG(LOG_VERBOSE3, "host_flags: 0x%x", host_flags);
if (override_kpf.magic == OVERRIDE_MAGIC) { if (override_kpf.magic == OVERRIDE_MAGIC) {
LOG(LOG_VERBOSE4, "kpf override length %u -> %u", override_kpf.orig_len, checkra1n_kpf_pongo_len); LOG(LOG_VERBOSE4, "kpf override length %u -> %u", override_kpf.orig_len, checkra1n_kpf_pongo_len);
LOG(LOG_VERBOSE4, "kpf override ptr %p -> %p", override_kpf.orig_ptr, **kpf_to_upload); LOG(LOG_VERBOSE4, "kpf override ptr %p -> %p", override_kpf.orig_ptr, **kpf_to_upload);
@@ -305,17 +341,17 @@ int optparse(int argc, char* argv[]) {
LOG(LOG_VERBOSE4, "overlay override ptr %p -> %p", override_overlay.orig_ptr, **overlay_to_upload); LOG(LOG_VERBOSE4, "overlay override ptr %p -> %p", override_overlay.orig_ptr, **overlay_to_upload);
} }
if (!checkrain_option_enabled(palerain_flags, palerain_option_rootful)) { if (!(palerain_flags & palerain_option_rootful)) {
if (checkrain_option_enabled(palerain_flags, palerain_option_setup_rootful) || checkrain_option_enabled(palerain_flags, palerain_option_setup_rootful_forced)) { if ((palerain_flags & palerain_option_setup_rootful)) {
LOG(LOG_FATAL, "Cannot setup rootful when rootless is requested. Use -f to enable rootful mode."); LOG(LOG_FATAL, "Cannot setup rootful when rootless is requested. Use -f to enable rootful mode.");
return -1; return -1;
} }
} }
if (!( if (!(
checkrain_option_enabled(host_flags, host_option_dfuhelper_only) || (palerain_flags & palerain_option_dfuhelper_only) ||
checkrain_option_enabled(host_flags, host_option_enter_recovery) || (palerain_flags & palerain_option_enter_recovery) ||
checkrain_option_enabled(host_flags, host_option_exit_recovery) || (palerain_flags & palerain_option_exit_recovery) ||
checkrain_option_enabled(host_flags, host_option_reboot_device))) (palerain_flags & palerain_option_reboot_device)))
{ {
#ifdef NO_CHECKRAIN #ifdef NO_CHECKRAIN
if (checkra1n_len == 0 && ext_checkra1n == NULL) if (checkra1n_len == 0 && ext_checkra1n == NULL)
@@ -323,7 +359,7 @@ int optparse(int argc, char* argv[]) {
LOG(LOG_FATAL, "checkra1n omitted in build but no override specified"); LOG(LOG_FATAL, "checkra1n omitted in build but no override specified");
return -1; return -1;
} }
if (!(checkrain_option_enabled(host_flags, host_option_pongo_exit) || checkrain_option_enabled(host_flags, host_option_pongo_exit))) if (!((palerain_flags & palerain_option_pongo_exit) || (palerain_flags & palerain_option_pongo_exit)))
{ {
#ifdef NO_KPF #ifdef NO_KPF
if (checkra1n_kpf_pongo_len == 0) if (checkra1n_kpf_pongo_len == 0)
@@ -352,8 +388,10 @@ int optparse(int argc, char* argv[]) {
} }
} }
if (verbose >= 2) setenv("LIBUSB_DEBUG", "1", 1); if (verbose >= 2) setenv("LIBUSB_DEBUG", "1", 1);
if (verbose >= 3) if (verbose >= 3)
{ {
libusbmuxd_set_debug_level(verbose - 2);
irecv_set_debug_level(1); irecv_set_debug_level(1);
setenv("LIBUSB_DEBUG", "2", 1); setenv("LIBUSB_DEBUG", "2", 1);
} }
File renamed without changes.
@@ -29,24 +29,22 @@ void* pongo_helper(void* ptr) {
return NULL; return NULL;
} }
void *pongo_usb_callback(void *arg) { void *pongo_usb_callback(stuff_t *arg) {
if (get_found_pongo()) if (get_found_pongo())
return NULL; return NULL;
set_found_pongo(1); set_found_pongo(1);
if (checkrain_option_enabled(palerain_flags, palerain_option_setup_rootful)) { if ((palerain_flags & palerain_option_setup_rootful)) {
strncat(xargs_cmd, " wdt=-1", 0x270 - strlen(xargs_cmd) - 1); strncat(xargs_cmd, " wdt=-1", 0x270 - strlen(xargs_cmd) - 1);
} }
LOG(LOG_INFO, "Found PongoOS USB Device"); LOG(LOG_INFO, "Found PongoOS USB Device");
usb_device_handle_t handle = (((stuff_t *)arg)->handle); usb_device_handle_t handle = arg->handle;
issue_pongo_command(handle, NULL); issue_pongo_command(handle, NULL);
issue_pongo_command(handle, "fuse lock"); issue_pongo_command(handle, "fuse lock");
issue_pongo_command(handle, "sep auto"); issue_pongo_command(handle, "sep auto");
upload_pongo_file(handle, **kpf_to_upload, checkra1n_kpf_pongo_len); upload_pongo_file(handle, **kpf_to_upload, checkra1n_kpf_pongo_len);
issue_pongo_command(handle, "modload"); issue_pongo_command(handle, "modload");
issue_pongo_command(handle, kpf_flags_cmd);
issue_pongo_command(handle, checkrain_flags_cmd);
issue_pongo_command(handle, palerain_flags_cmd); issue_pongo_command(handle, palerain_flags_cmd);
if (checkrain_option_enabled(palerain_flags, palerain_option_rootful)) if ((palerain_flags & palerain_option_rootful))
{ {
issue_pongo_command(handle, "rootfs"); issue_pongo_command(handle, "rootfs");
} }
@@ -58,7 +56,7 @@ void *pongo_usb_callback(void *arg) {
upload_pongo_file(handle, **ramdisk_to_upload, ramdisk_dmg_len); upload_pongo_file(handle, **ramdisk_to_upload, ramdisk_dmg_len);
issue_pongo_command(handle, "ramdisk"); issue_pongo_command(handle, "ramdisk");
} }
#ifdef NO_BINPACK #ifdef NO_OVERLAY
if (binpack_dmg_len != 0) if (binpack_dmg_len != 0)
#endif #endif
{ {
@@ -66,13 +64,13 @@ void *pongo_usb_callback(void *arg) {
issue_pongo_command(handle, "overlay"); issue_pongo_command(handle, "overlay");
} }
issue_pongo_command(handle, xargs_cmd); issue_pongo_command(handle, xargs_cmd);
if (checkrain_option_enabled(host_flags, host_option_pongo_full)) goto done; if ((palerain_flags & palerain_option_pongo_full)) goto done;
issue_pongo_command(handle, "bootx"); issue_pongo_command(handle, "bootx");
LOG(LOG_INFO, "Booting Kernel..."); LOG(LOG_INFO, "Booting Kernel...");
if (checkrain_option_enabled(palerain_flags, palerain_option_setup_partial_root)) { if ((palerain_flags & palerain_option_setup_partial_root)) {
LOG(LOG_INFO, "Please wait up to 5 minutes for the bindfs to be created."); LOG(LOG_INFO, "Please wait up to 5 minutes for the bindfs to be created.");
LOG(LOG_INFO, "Once the device boots up to iOS, run again without the -B (Create BindFS) option to jailbreak."); LOG(LOG_INFO, "Once the device boots up to iOS, run again without the -B (Create BindFS) option to jailbreak.");
} else if (checkrain_option_enabled(palerain_flags, palerain_option_setup_rootful)) { } else if ((palerain_flags & palerain_option_setup_rootful)) {
LOG(LOG_INFO, "Please wait up to 10 minutes for the fakefs to be created."); LOG(LOG_INFO, "Please wait up to 10 minutes for the fakefs to be created.");
LOG(LOG_INFO, "Once the device boots up to iOS, run again without the -c (Create FakeFS) option to jailbreak."); LOG(LOG_INFO, "Once the device boots up to iOS, run again without the -c (Create FakeFS) option to jailbreak.");
} }
@@ -83,7 +81,7 @@ void *pongo_usb_callback(void *arg) {
done: done:
device_has_booted = true; device_has_booted = true;
#ifdef USE_LIBUSB #ifdef USE_LIBUSB
libusb_unref_device(((stuff_t *)arg)->dev); libusb_unref_device(arg->dev);
#endif #endif
set_spin(0); set_spin(0);
return NULL; return NULL;
@@ -163,7 +161,10 @@ int upload_pongo_file(usb_device_handle_t handle, unsigned char *buf, unsigned i
if (verbose < 3 || verbose > 4) { if (verbose < 3 || verbose > 4) {
LOG(LOG_VERBOSE, "Uploaded %llu bytes to PongoOS", (unsigned long long)buf_len); LOG(LOG_VERBOSE, "Uploaded %llu bytes to PongoOS", (unsigned long long)buf_len);
} else { } else {
printf("/send mem:%p:%p\n" BCYN "[Uploaded %llu bytes]\n" CRESET, (void*)buf, (void*)(buf + buf_len), (unsigned long long)buf_len); if ((palerain_flags & palerain_option_no_colors))
printf("/send mem:%p:%p\nUploaded %llu bytes]\n", (void*)buf, (void*)(buf + buf_len), (unsigned long long)buf_len);
else
printf("/send mem:%p:%p\n" BCYN "[Uploaded %llu bytes]\n" CRESET, (void*)buf, (void*)(buf + buf_len), (unsigned long long)buf_len);
} }
} }
} }
@@ -173,7 +174,7 @@ int upload_pongo_file(usb_device_handle_t handle, unsigned char *buf, unsigned i
void io_start(stuff_t *stuff) void io_start(stuff_t *stuff)
{ {
int r = pthread_create(&stuff->th, NULL, &pongo_usb_callback, stuff); int r = pthread_create(&stuff->th, NULL, (pthread_start_t)pongo_usb_callback, stuff);
if(r != 0) if(r != 0)
{ {
ERR("pthread_create: %s", strerror(r)); ERR("pthread_create: %s", strerror(r));
+4 -4
View File
@@ -12,15 +12,15 @@
#include <palerain.h> #include <palerain.h>
#include <tui.h> #include <tui.h>
int redraw_screen() { int redraw_screen(void) {
return 0; return 0;
} }
int destroy_window() { int destroy_window(void) {
return 0; return 0;
} }
int init_window() { int init_window(void) {
setlocale(LC_ALL, NULL); setlocale(LC_ALL, NULL);
setenv( setenv(
"NEWT_COLORS", "NEWT_COLORS",
@@ -61,7 +61,7 @@ int init_window() {
return 0; return 0;
} }
int tui() { int tui(void) {
int ret = 0; int ret = 0;
if ((ret = init_window())) return ret; if ((ret = init_window())) return ret;
ret = MAIN_SCREEN; ret = MAIN_SCREEN;
@@ -12,4 +12,4 @@
#include <palerain.h> #include <palerain.h>
#include <tui.h> #include <tui.h>
tui_screen_t tui_screen_enter_dfu() { return JAILBREAKING_SCREEN; } tui_screen_t tui_screen_enter_dfu(void) { return JAILBREAKING_SCREEN; }
@@ -12,4 +12,4 @@
#include <palerain.h> #include <palerain.h>
#include <tui.h> #include <tui.h>
tui_screen_t tui_screen_enter_recovery() { return ENTER_DFU_SCREEN; } tui_screen_t tui_screen_enter_recovery(void) { return ENTER_DFU_SCREEN; }
@@ -12,4 +12,4 @@
#include <palerain.h> #include <palerain.h>
#include <tui.h> #include <tui.h>
tui_screen_t tui_screen_jailbreak() { return EXIT_SCREEN; } tui_screen_t tui_screen_jailbreak(void) { return EXIT_SCREEN; }
@@ -12,7 +12,7 @@
#include <palerain.h> #include <palerain.h>
#include <tui.h> #include <tui.h>
tui_screen_t tui_screen_main() { tui_screen_t tui_screen_main(void) {
int ret = MAIN_SCREEN; int ret = MAIN_SCREEN;
bool can_start = false; bool can_start = false;
newtCenteredWindow(WIDTH, HEIGHT, NULL); newtCenteredWindow(WIDTH, HEIGHT, NULL);
@@ -21,16 +21,14 @@ void bitfield_check_cb(newtComponent box, void* data) {
} }
tui_screen_t tui_screen_options() { tui_screen_t tui_screen_options(void) {
tui_bit_info_t verbose_info = { &kpf_flags, checkrain_option_verbose_boot }; tui_bit_info_t verbose_info = { &palerain_flags, palerain_option_verbose_boot };
tui_bit_info_t rootful_info = { &palerain_flags, palerain_option_rootful }; tui_bit_info_t rootful_info = { &palerain_flags, palerain_option_rootful };
tui_bit_info_t setup_rootful_info = { &palerain_flags, palerain_option_setup_rootful }; tui_bit_info_t setup_rootful_info = { &palerain_flags, palerain_option_setup_rootful };
tui_bit_info_t force_revert_info = { &checkrain_flags, checkrain_option_force_revert }; tui_bit_info_t force_revert_info = { &palerain_flags, palerain_option_force_revert };
tui_bit_info_t safemode_info = { &checkrain_flags, checkrain_option_safemode }; tui_bit_info_t safemode_info = { &palerain_flags, palerain_option_safemode };
tui_bit_info_t flower_chain_info = { &palerain_flags, palerain_option_flower_chain };
static checkrain_option_t flower_flags = 0, flower_option_flower_chain = (1 << 0);
tui_bit_info_t flower_chain_info = { &flower_flags, flower_option_flower_chain };
const char* bootargs_entered = NULL; const char* bootargs_entered = NULL;
int ret = MAIN_SCREEN; int ret = MAIN_SCREEN;
@@ -41,11 +39,11 @@ tui_screen_t tui_screen_options() {
newtTextboxSetText(optionsNotice, "You may set the following options. If you don't know what they mean you'll probably have no reason to set them."); newtTextboxSetText(optionsNotice, "You may set the following options. If you don't know what they mean you'll probably have no reason to set them.");
// newtTextboxSetColors(optionsNotice, NEWT_COLORSET_LABEL, NEWT_COLORSET_LABEL); // newtTextboxSetColors(optionsNotice, NEWT_COLORSET_LABEL, NEWT_COLORSET_LABEL);
newtComponent verboseBootBox = newtCheckbox(1, 3, "Verbose boot", CHECKBOX_STATE(kpf_flags, checkrain_option_verbose_boot), NULL, NULL); newtComponent verboseBootBox = newtCheckbox(1, 3, "Verbose boot", CHECKBOX_STATE(palerain_flags, palerain_option_verbose_boot), NULL, NULL);
newtComponent rootfulBox = newtCheckbox(1, 4, "Rootful", CHECKBOX_STATE(palerain_flags, palerain_option_rootful), NULL, NULL); newtComponent rootfulBox = newtCheckbox(1, 4, "Rootful", CHECKBOX_STATE(palerain_flags, palerain_option_rootful), NULL, NULL);
newtComponent rootfulSetupBox = newtCheckbox(1, 5, "Setup fakefs", CHECKBOX_STATE(palerain_flags, palerain_option_setup_rootful), NULL, NULL); newtComponent rootfulSetupBox = newtCheckbox(1, 5, "Setup fakefs", CHECKBOX_STATE(palerain_flags, palerain_option_setup_rootful), NULL, NULL);
newtComponent forceRevertBox = newtCheckbox(1, 6, "Restore system", CHECKBOX_STATE(checkrain_flags, checkrain_option_force_revert), NULL, NULL); newtComponent forceRevertBox = newtCheckbox(1, 6, "Restore system", CHECKBOX_STATE(palerain_flags, palerain_option_force_revert), NULL, NULL);
newtComponent safeModeBox = newtCheckbox(1, 7, "Safe mode", CHECKBOX_STATE(checkrain_flags, checkrain_option_safemode), NULL, NULL); newtComponent safeModeBox = newtCheckbox(1, 7, "Safe mode", CHECKBOX_STATE(palerain_flags, palerain_option_safemode), NULL, NULL);
newtComponentAddCallback(verboseBootBox, bitfield_check_cb, &verbose_info); newtComponentAddCallback(verboseBootBox, bitfield_check_cb, &verbose_info);
newtComponentAddCallback(rootfulBox, bitfield_check_cb, &rootful_info); newtComponentAddCallback(rootfulBox, bitfield_check_cb, &rootful_info);
@@ -56,7 +54,7 @@ tui_screen_t tui_screen_options() {
newtComponent bootCmdlineLabel = newtLabel(1, 8, "Kernel command line:"); newtComponent bootCmdlineLabel = newtLabel(1, 8, "Kernel command line:");
newtComponent bootCmdlineEntry = newtEntry(1, 9, &xargs_cmd[6], WIDTH - 2, &bootargs_entered, NEWT_ENTRY_SCROLL); newtComponent bootCmdlineEntry = newtEntry(1, 9, &xargs_cmd[6], WIDTH - 2, &bootargs_entered, NEWT_ENTRY_SCROLL);
newtComponent flowerChainBox = newtCheckbox(1, 10, "Flower chain", CHECKBOX_STATE(flower_flags, flower_option_flower_chain), NULL, NULL); newtComponent flowerChainBox = newtCheckbox(1, 10, "Flower chain", CHECKBOX_STATE(palerain_flags, palerain_option_flower_chain), NULL, NULL);
newtComponentAddCallback(flowerChainBox, bitfield_check_cb, &flower_chain_info); newtComponentAddCallback(flowerChainBox, bitfield_check_cb, &flower_chain_info);
File renamed without changes.
File renamed without changes.
+51 -52
View File
@@ -114,12 +114,12 @@ usb_ret_t USBBulkUpload(usb_device_handle_t handle, void *data, int len)
static int FoundDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *arg) static int FoundDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *arg)
{ {
LOG(LOG_VERBOSE, "PongoOS USB Device connected");
stuff_t *stuff = arg; stuff_t *stuff = arg;
if(stuff->handle) if(stuff->handle)
{ {
return LIBUSB_SUCCESS; return LIBUSB_SUCCESS;
} }
LOG(LOG_VERBOSE, "PongoOS USB Device connected");
libusb_device_handle *handle; libusb_device_handle *handle;
int r = libusb_open(dev, &handle); int r = libusb_open(dev, &handle);
@@ -162,12 +162,12 @@ static int FoundDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_e
static int LostDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *arg) static int LostDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *arg)
{ {
LOG(LOG_VERBOSE, "PongoOS USB Device disconnected");
stuff_t *stuff = arg; stuff_t *stuff = arg;
if(stuff->dev != dev) if(stuff->dev != dev)
{ {
return LIBUSB_SUCCESS; return LIBUSB_SUCCESS;
} }
LOG(LOG_VERBOSE, "PongoOS USB Device disconnected");
io_stop(stuff); io_stop(stuff);
libusb_close(stuff->handle); libusb_close(stuff->handle);
@@ -181,6 +181,7 @@ static int LostDevice(libusb_context *ctx, libusb_device *dev, libusb_hotplug_ev
int wait_for_pongo(void) int wait_for_pongo(void)
{ {
stuff_t stuff; stuff_t stuff;
stuff.handle = NULL;
libusb_hotplug_callback_handle hp[2]; libusb_hotplug_callback_handle hp[2];
libusb_context* ctx = NULL; libusb_context* ctx = NULL;
@@ -198,14 +199,6 @@ int wait_for_pongo(void)
return -1; return -1;
} }
r = libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, 0, PONGO_USB_VENDOR, PONGO_USB_PRODUCT, LIBUSB_HOTPLUG_MATCH_ANY, FoundDevice, &stuff, &hp[0]);
if(r != LIBUSB_SUCCESS)
{
ERR("libusb_hotplug: %s", libusb_error_name(r));
libusb_exit(ctx);
return -1;
}
r = libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, PONGO_USB_VENDOR, PONGO_USB_PRODUCT, LIBUSB_HOTPLUG_MATCH_ANY, LostDevice, &stuff, &hp[1]); r = libusb_hotplug_register_callback(ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, PONGO_USB_VENDOR, PONGO_USB_PRODUCT, LIBUSB_HOTPLUG_MATCH_ANY, LostDevice, &stuff, &hp[1]);
if(r != LIBUSB_SUCCESS) if(r != LIBUSB_SUCCESS)
{ {
@@ -214,55 +207,61 @@ int wait_for_pongo(void)
return -1; return -1;
} }
libusb_device **list; while (1) {
ssize_t sz = libusb_get_device_list(ctx, &list);
if(sz < 0)
{
ERR("libusb_get_device_list: %s", libusb_error_name((int)sz));
libusb_exit(ctx);
return -1;
}
for(ssize_t i = 0; i < sz; ++i)
{
struct libusb_device_descriptor desc;
r = libusb_get_device_descriptor(list[i], &desc);
if(r != LIBUSB_SUCCESS)
{
ERR("libusb_get_device_descriptor: %s", libusb_error_name(r));
// continue anyway
}
if(desc.idVendor != PONGO_USB_VENDOR || desc.idProduct != PONGO_USB_PRODUCT)
{
libusb_unref_device(list[i]);
continue;
}
r = FoundDevice(ctx, list[i], LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, &stuff);
for(ssize_t j = i + 1; j < sz; ++j)
{
libusb_unref_device(list[j]);
}
if(r != LIBUSB_SUCCESS)
{
libusb_free_device_list(list, 0);
libusb_exit(ctx);
return -1;
}
break;
}
libusb_free_device_list(list, 0);
while(get_spin())
{
r = libusb_handle_events(ctx); r = libusb_handle_events(ctx);
if(r != LIBUSB_SUCCESS) if(r != LIBUSB_SUCCESS)
{ {
ERR("libusb_handle_events: %s", libusb_error_name(r)); ERR("libusb_handle_events: %s", libusb_error_name(r));
break; break;
} }
libusb_device **list;
ssize_t sz = libusb_get_device_list(ctx, &list);
bool done = false;
if(sz < 0)
{
ERR("libusb_get_device_list: %s", libusb_error_name((int)sz));
libusb_exit(ctx);
return -1;
}
for(ssize_t i = 0; i < sz; ++i)
{
struct libusb_device_descriptor desc;
r = libusb_get_device_descriptor(list[i], &desc);
if(r != LIBUSB_SUCCESS)
{
ERR("libusb_get_device_descriptor: %s", libusb_error_name(r));
// continue anyway
}
if(desc.idVendor != PONGO_USB_VENDOR || desc.idProduct != PONGO_USB_PRODUCT)
{
libusb_unref_device(list[i]);
continue;
}
r = FoundDevice(ctx, list[i], LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, &stuff);
for (ssize_t j = i; j < sz; ++j) {
libusb_unref_device(list[j]);
}
if(r != LIBUSB_SUCCESS)
{
libusb_free_device_list(list, 0);
libusb_exit(ctx);
return -1;
} else {
done = true;
}
break;
}
libusb_free_device_list(list, 0);
if (done) goto end;
} }
libusb_exit(ctx); end:
return 0; libusb_exit(ctx);
return 0;
} }
#endif #endif