From 3a146e70b2b49685bc74c1448155fa2d60f4cf40 Mon Sep 17 00:00:00 2001 From: ItsBlurf Date: Thu, 4 Jun 2026 23:04:07 +0100 Subject: [PATCH] Prepare BFpilot v0.2.1 compatibility test build --- .gitignore | 1 - Makefile | 312 ++++++++++++++-- README.md | 435 +++++++--------------- assets/files.html | 29 +- docs/COMPATIBILITY_STRATEGY.md | 192 ++++++++++ docs/FIRMWARE_TESTING.md | 343 +++++++++-------- scripts/inspect_imports.sh | 149 ++++++++ scripts/scrub_main_payload.py | 41 ++ src/app_installer.c | 145 +++++--- src/boot_marker.c | 77 ++++ src/boot_marker.h | 7 + src/launcher_installer_force_main.c | 252 +++++++++++++ src/launcher_installer_main.c | 288 ++++++++++++++ src/lite_main.c | 232 ++++++------ src/transfer.c | 98 ++++- src/version.h | 6 +- src/websrv.h | 2 + src/websrv_lite.c | 27 +- test-builds/v0.2.1/README.md | 26 -- test-builds/v0.2.1/bfpilot-core.elf | Bin 177968 -> 0 bytes test-builds/v0.2.1/bfpilot-full.elf | Bin 341888 -> 0 bytes tests/hello_boot.c | 17 + tests/hello_http.c | 126 +++++++ tests/hello_notify.c | 18 + tests/installer_enter_probe.c | 21 ++ tests/installer_linkonly_appinst.c | 30 ++ tests/installer_runtime_resolve_appinst.c | 75 ++++ tests/probe_common.h | 87 +++++ 28 files changed, 2324 insertions(+), 712 deletions(-) create mode 100644 docs/COMPATIBILITY_STRATEGY.md create mode 100644 scripts/inspect_imports.sh create mode 100644 scripts/scrub_main_payload.py create mode 100644 src/boot_marker.c create mode 100644 src/boot_marker.h create mode 100644 src/launcher_installer_force_main.c create mode 100644 src/launcher_installer_main.c delete mode 100644 test-builds/v0.2.1/README.md delete mode 100644 test-builds/v0.2.1/bfpilot-core.elf delete mode 100644 test-builds/v0.2.1/bfpilot-full.elf create mode 100644 tests/hello_boot.c create mode 100644 tests/hello_http.c create mode 100644 tests/hello_notify.c create mode 100644 tests/installer_enter_probe.c create mode 100644 tests/installer_linkonly_appinst.c create mode 100644 tests/installer_runtime_resolve_appinst.c create mode 100644 tests/probe_common.h diff --git a/.gitignore b/.gitignore index ceb319b..bbb38aa 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ gen/ *.a *.so *.elf -!test-builds/**/*.elf # Local environment / editor noise .env diff --git a/Makefile b/Makefile index 4b82c1c..663f5ee 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,8 @@ endif PS5_HOST ?= ps5 PS5_PORT ?= 9021 PYTHON ?= python3 +WEB_PORT ?= 5905 +HELLO_HTTP_PORT ?= 5906 VERSION_TAG := bfpilot-v0.2.1 BUILD_VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev) @@ -26,27 +28,69 @@ LLVM_CONFIG ?= $(CURDIR)/build-tools/llvm-config export LLVM_BINDIR export LLVM_CONFIG -CORE_BIN := bfpilot-core.elf +BFPILOT_BIN := bfpilot.elf +DEBUG_BIN := bfpilot-debug.elf FULL_BIN := bfpilot-full.elf +LAUNCHER_INSTALLER_BIN := bfpilot-launcher-installer.elf +SAFE_LAUNCHER_INSTALLER_BIN := bfpilot-launcher-installer-safe.elf +HELLO_BOOT_BIN := tests/hello_boot.elf +HELLO_HTTP_BIN := tests/hello_http.elf +HELLO_NOTIFY_BIN := tests/hello_notify.elf +INSTALLER_ENTER_PROBE_BIN := tests/installer_enter_probe.elf +INSTALLER_LINKONLY_APPINST_BIN := tests/installer_linkonly_appinst.elf +INSTALLER_RUNTIME_RESOLVE_APPINST_BIN := tests/installer_runtime_resolve_appinst.elf -COMMON_SRCS := src/lite_main.c -COMMON_SRCS += src/diag.c -COMMON_SRCS += src/websrv_lite.c -COMMON_SRCS += src/asset.c -COMMON_SRCS += src/fs.c -COMMON_SRCS += src/mime.c -COMMON_SRCS += src/notify.c -COMMON_SRCS += src/transfer.c +WEB_SRCS := src/lite_main.c +WEB_SRCS += src/boot_marker.c +WEB_SRCS += src/diag.c +WEB_SRCS += src/websrv_lite.c +WEB_SRCS += src/asset.c +WEB_SRCS += src/fs.c +WEB_SRCS += src/mime.c +WEB_SRCS += src/notify.c +WEB_SRCS += src/transfer.c -FULL_SRCS := $(COMMON_SRCS) -FULL_SRCS += src/app_installer.c -FULL_SRCS += src/sce_resolve.c +LEGACY_FULL_SRCS := $(WEB_SRCS) +LEGACY_FULL_SRCS += src/app_installer.c +LEGACY_FULL_SRCS += src/sce_resolve.c + +LAUNCHER_INSTALLER_SRCS := src/launcher_installer_force_main.c +LAUNCHER_INSTALLER_SRCS += src/boot_marker.c +LAUNCHER_INSTALLER_SRCS += src/notify.c + +SAFE_LAUNCHER_INSTALLER_SRCS := src/launcher_installer_main.c +SAFE_LAUNCHER_INSTALLER_SRCS += src/boot_marker.c +SAFE_LAUNCHER_INSTALLER_SRCS += src/notify.c +SAFE_LAUNCHER_INSTALLER_SRCS += src/sce_resolve.c + +HELLO_BOOT_SRCS := tests/hello_boot.c src/boot_marker.c src/notify.c +HELLO_HTTP_SRCS := tests/hello_http.c src/boot_marker.c src/notify.c +HELLO_NOTIFY_SRCS := tests/hello_notify.c src/boot_marker.c src/notify.c +INSTALLER_ENTER_PROBE_SRCS := tests/installer_enter_probe.c +INSTALLER_ENTER_PROBE_SRCS += src/boot_marker.c +INSTALLER_ENTER_PROBE_SRCS += src/notify.c +INSTALLER_LINKONLY_APPINST_SRCS := tests/installer_linkonly_appinst.c +INSTALLER_LINKONLY_APPINST_SRCS += src/boot_marker.c +INSTALLER_LINKONLY_APPINST_SRCS += src/notify.c +INSTALLER_RUNTIME_RESOLVE_APPINST_SRCS := tests/installer_runtime_resolve_appinst.c +INSTALLER_RUNTIME_RESOLVE_APPINST_SRCS += src/boot_marker.c +INSTALLER_RUNTIME_RESOLVE_APPINST_SRCS += src/notify.c ASSETS := $(wildcard assets/*) GEN_SRCS := $(patsubst assets/%,gen/assets/%,$(ASSETS:=.c)) APP_ASSETS := assets-app/param.json assets-app/icon0.png -CORE_OBJS := $(patsubst %.c,build/core/%.o,$(COMMON_SRCS) $(GEN_SRCS)) -FULL_OBJS := $(patsubst %.c,build/full/%.o,$(FULL_SRCS) $(GEN_SRCS)) + +BFPILOT_OBJS := $(patsubst %.c,build/bfpilot/%.o,$(WEB_SRCS) $(GEN_SRCS)) +DEBUG_OBJS := $(patsubst %.c,build/debug/%.o,$(WEB_SRCS) $(GEN_SRCS)) +LEGACY_FULL_OBJS := $(patsubst %.c,build/legacy-full/%.o,$(LEGACY_FULL_SRCS) $(GEN_SRCS)) +LAUNCHER_INSTALLER_OBJS := $(patsubst %.c,build/launcher-installer/%.o,$(LAUNCHER_INSTALLER_SRCS)) +SAFE_LAUNCHER_INSTALLER_OBJS := $(patsubst %.c,build/launcher-installer-safe/%.o,$(SAFE_LAUNCHER_INSTALLER_SRCS)) +HELLO_BOOT_OBJS := $(patsubst %.c,build/hello-boot/%.o,$(HELLO_BOOT_SRCS)) +HELLO_HTTP_OBJS := $(patsubst %.c,build/hello-http/%.o,$(HELLO_HTTP_SRCS)) +HELLO_NOTIFY_OBJS := $(patsubst %.c,build/hello-notify/%.o,$(HELLO_NOTIFY_SRCS)) +INSTALLER_ENTER_PROBE_OBJS := $(patsubst %.c,build/installer-enter-probe/%.o,$(INSTALLER_ENTER_PROBE_SRCS)) +INSTALLER_LINKONLY_APPINST_OBJS := $(patsubst %.c,build/installer-linkonly-appinst/%.o,$(INSTALLER_LINKONLY_APPINST_SRCS)) +INSTALLER_RUNTIME_RESOLVE_APPINST_OBJS := $(patsubst %.c,build/installer-runtime-resolve-appinst/%.o,$(INSTALLER_RUNTIME_RESOLVE_APPINST_SRCS)) COMMON_CFLAGS := -Os -Wall -Werror -Isrc COMMON_CFLAGS += -ffunction-sections -fdata-sections -flto @@ -54,17 +98,59 @@ COMMON_CFLAGS += -DVERSION_TAG=\"$(VERSION_TAG)\" COMMON_CFLAGS += -DBUILD_VERSION=\"$(BUILD_VERSION)\" COMMON_CFLAGS += -DBFPILOT_SDK_PATH=\"$(PS5_PAYLOAD_SDK)\" -CORE_CFLAGS := $(COMMON_CFLAGS) -CORE_CFLAGS += -DBFPILOT_ENABLE_LAUNCHER=0 -CORE_CFLAGS += -DBFPILOT_DISABLE_LAUNCHER=1 -CORE_CFLAGS += -DBFPILOT_BUILD_MODE=\"core\" +BFPILOT_CFLAGS := $(COMMON_CFLAGS) +BFPILOT_CFLAGS += -DBFPILOT_PAYLOAD_NAME=\"bfpilot\" +BFPILOT_CFLAGS += -DBFPILOT_BUILD_MODE=\"file-manager\" +BFPILOT_CFLAGS += -DBFPILOT_WEB_PORT=$(WEB_PORT) +BFPILOT_CFLAGS += -DBFPILOT_DEBUG_NOTIFICATIONS=0 +BFPILOT_CFLAGS += -DBFPILOT_ENABLE_LAUNCHER=0 +BFPILOT_CFLAGS += -DBFPILOT_DISABLE_LAUNCHER=1 + +DEBUG_CFLAGS := $(COMMON_CFLAGS) +DEBUG_CFLAGS += -DBFPILOT_PAYLOAD_NAME=\"bfpilot-debug\" +DEBUG_CFLAGS += -DBFPILOT_BUILD_MODE=\"debug\" +DEBUG_CFLAGS += -DBFPILOT_WEB_PORT=$(WEB_PORT) +DEBUG_CFLAGS += -DBFPILOT_DEBUG_NOTIFICATIONS=1 +DEBUG_CFLAGS += -DBFPILOT_ENABLE_LAUNCHER=0 +DEBUG_CFLAGS += -DBFPILOT_DISABLE_LAUNCHER=1 FULL_CFLAGS := $(COMMON_CFLAGS) -FULL_CFLAGS += -DBFPILOT_ENABLE_LAUNCHER=1 +FULL_CFLAGS += -DBFPILOT_PAYLOAD_NAME=\"bfpilot-full\" FULL_CFLAGS += -DBFPILOT_BUILD_MODE=\"full\" +FULL_CFLAGS += -DBFPILOT_WEB_PORT=$(WEB_PORT) +FULL_CFLAGS += -DBFPILOT_DEBUG_NOTIFICATIONS=1 +FULL_CFLAGS += -DBFPILOT_ENABLE_LAUNCHER=1 +FULL_CFLAGS += -DBFPILOT_DISABLE_LAUNCHER=0 + +LAUNCHER_INSTALLER_CFLAGS := $(COMMON_CFLAGS) +LAUNCHER_INSTALLER_CFLAGS += -DBFPILOT_PAYLOAD_NAME=\"bfpilot-launcher-installer\" +LAUNCHER_INSTALLER_CFLAGS += -DBFPILOT_BUILD_MODE=\"launcher-installer-force\" + +SAFE_LAUNCHER_INSTALLER_CFLAGS := $(COMMON_CFLAGS) +SAFE_LAUNCHER_INSTALLER_CFLAGS += -DBFPILOT_PAYLOAD_NAME=\"bfpilot-launcher-installer-safe\" +SAFE_LAUNCHER_INSTALLER_CFLAGS += -DBFPILOT_BUILD_MODE=\"launcher-installer-safe\" + +HELLO_BOOT_CFLAGS := $(COMMON_CFLAGS) +HELLO_BOOT_CFLAGS += -DBFPILOT_BUILD_MODE=\"hello-boot\" + +HELLO_HTTP_CFLAGS := $(COMMON_CFLAGS) +HELLO_HTTP_CFLAGS += -DBFPILOT_BUILD_MODE=\"hello-http\" +HELLO_HTTP_CFLAGS += -DBFPILOT_HELLO_HTTP_PORT=$(HELLO_HTTP_PORT) + +HELLO_NOTIFY_CFLAGS := $(COMMON_CFLAGS) +HELLO_NOTIFY_CFLAGS += -DBFPILOT_BUILD_MODE=\"hello-notify\" + +INSTALLER_ENTER_PROBE_CFLAGS := $(COMMON_CFLAGS) +INSTALLER_ENTER_PROBE_CFLAGS += -DBFPILOT_BUILD_MODE=\"installer-enter-probe\" + +INSTALLER_LINKONLY_APPINST_CFLAGS := $(COMMON_CFLAGS) +INSTALLER_LINKONLY_APPINST_CFLAGS += -DBFPILOT_BUILD_MODE=\"installer-linkonly-appinst\" + +INSTALLER_RUNTIME_RESOLVE_APPINST_CFLAGS := $(COMMON_CFLAGS) +INSTALLER_RUNTIME_RESOLVE_APPINST_CFLAGS += -DBFPILOT_BUILD_MODE=\"installer-runtime-resolve-appinst\" COMMON_LDFLAGS := -Wl,--gc-sections -flto -FULL_LDLIBS := -lSceAppInstUtil +APPINST_LDLIBS := -lSceAppInstUtil CC_CMD := "$(CC)" STRIP_CMD := "$(STRIP)" @@ -82,10 +168,13 @@ WINDOWS_LINK_PREFIX := --gc-sections --sysroot="$(PS5_PAYLOAD_SDK_POSIX)" WINDOWS_LINK_PREFIX += -L"$(PS5_PAYLOAD_SDK_POSIX)/target/lib" WINDOWS_LINK_PREFIX += -L"$(PS5_PAYLOAD_SDK_POSIX)/target/user/homebrew/lib" WINDOWS_LINK_PREFIX += -l:crt1.o -l:crti.o -l:crtbegin.o -lc -WINDOWS_LINK_SUFFIX := -lkernel_web -lSceLibcInternal -lSceNet -WINDOWS_LINK_SUFFIX += -lc_stub_weak -lkernel_stub_weak -WINDOWS_LINK_SUFFIX += -l:crtend.o -l:crtn.o -WINDOWS_FULL_LINK_SUFFIX := -lSceAppInstUtil $(WINDOWS_LINK_SUFFIX) +WINDOWS_BASE_SUFFIX := -lkernel_web -lSceLibcInternal +WINDOWS_BASE_SUFFIX += -lc_stub_weak -lkernel_stub_weak +WINDOWS_BASE_SUFFIX += -l:crtend.o -l:crtn.o +WINDOWS_WEB_SUFFIX := -lkernel_web -lSceLibcInternal -lSceNet +WINDOWS_WEB_SUFFIX += -lc_stub_weak -lkernel_stub_weak +WINDOWS_WEB_SUFFIX += -l:crtend.o -l:crtn.o +WINDOWS_APPINST_SUFFIX := -lSceAppInstUtil $(WINDOWS_BASE_SUFFIX) define run bash -lc '$(RUN_ENV) && $(1)' endef @@ -95,52 +184,193 @@ $(1) endef endif -all: core full +all: bfpilot debug full launcher-installer launcher-installer-safe hello-boot hello-http hello-notify installer-enter-probe installer-linkonly-appinst installer-runtime-resolve-appinst -core: $(CORE_BIN) +bfpilot: $(BFPILOT_BIN) + +debug: $(DEBUG_BIN) full: $(FULL_BIN) +legacy-full: full + +launcher-installer: $(LAUNCHER_INSTALLER_BIN) + +launcher-installer-safe: $(SAFE_LAUNCHER_INSTALLER_BIN) + +hello-boot: $(HELLO_BOOT_BIN) + +hello-http: $(HELLO_HTTP_BIN) + +hello-notify: $(HELLO_NOTIFY_BIN) + +installer-enter-probe: $(INSTALLER_ENTER_PROBE_BIN) + +installer-linkonly-appinst: $(INSTALLER_LINKONLY_APPINST_BIN) + +installer-runtime-resolve-appinst: $(INSTALLER_RUNTIME_RESOLVE_APPINST_BIN) + gen/assets: $(call run,mkdir -p $@) gen/assets/%.c: assets/% | gen/assets $(call run,$(PYTHON) gen-asset-module.py --path $* $< > $@) -build/core/%.o: %.c Makefile +build/bfpilot/%.o: %.c Makefile $(call run,mkdir -p $(dir $@)) - $(call run,$(CC_CMD) $(CORE_CFLAGS) -c $< -o $@) + $(call run,$(CC_CMD) $(BFPILOT_CFLAGS) -c $< -o $@) -build/full/%.o: %.c Makefile +build/debug/%.o: %.c Makefile + $(call run,mkdir -p $(dir $@)) + $(call run,$(CC_CMD) $(DEBUG_CFLAGS) -c $< -o $@) + +build/legacy-full/%.o: %.c Makefile $(call run,mkdir -p $(dir $@)) $(call run,$(CC_CMD) $(FULL_CFLAGS) -c $< -o $@) +build/launcher-installer/%.o: %.c Makefile + $(call run,mkdir -p $(dir $@)) + $(call run,$(CC_CMD) $(LAUNCHER_INSTALLER_CFLAGS) -c $< -o $@) + +build/launcher-installer-safe/%.o: %.c Makefile + $(call run,mkdir -p $(dir $@)) + $(call run,$(CC_CMD) $(SAFE_LAUNCHER_INSTALLER_CFLAGS) -c $< -o $@) + +build/hello-boot/%.o: %.c Makefile + $(call run,mkdir -p $(dir $@)) + $(call run,$(CC_CMD) $(HELLO_BOOT_CFLAGS) -c $< -o $@) + +build/hello-http/%.o: %.c Makefile + $(call run,mkdir -p $(dir $@)) + $(call run,$(CC_CMD) $(HELLO_HTTP_CFLAGS) -c $< -o $@) + +build/hello-notify/%.o: %.c Makefile + $(call run,mkdir -p $(dir $@)) + $(call run,$(CC_CMD) $(HELLO_NOTIFY_CFLAGS) -c $< -o $@) + +build/installer-enter-probe/%.o: %.c Makefile + $(call run,mkdir -p $(dir $@)) + $(call run,$(CC_CMD) $(INSTALLER_ENTER_PROBE_CFLAGS) -c $< -o $@) + +build/installer-linkonly-appinst/%.o: %.c Makefile + $(call run,mkdir -p $(dir $@)) + $(call run,$(CC_CMD) $(INSTALLER_LINKONLY_APPINST_CFLAGS) -c $< -o $@) + +build/installer-runtime-resolve-appinst/%.o: %.c Makefile + $(call run,mkdir -p $(dir $@)) + $(call run,$(CC_CMD) $(INSTALLER_RUNTIME_RESOLVE_APPINST_CFLAGS) -c $< -o $@) + ifeq ($(HOST_IS_WINDOWS),1) -$(CORE_BIN): $(CORE_OBJS) - $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(CORE_OBJS) $(WINDOWS_LINK_SUFFIX)) +$(BFPILOT_BIN): $(BFPILOT_OBJS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(BFPILOT_OBJS) $(WINDOWS_WEB_SUFFIX)) + $(call run,$(STRIP_CMD) --strip-all $@) + $(call run,$(PYTHON) scripts/scrub_main_payload.py $@) + +$(DEBUG_BIN): $(DEBUG_OBJS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(DEBUG_OBJS) $(WINDOWS_WEB_SUFFIX)) + $(call run,$(STRIP_CMD) --strip-all $@) + $(call run,$(PYTHON) scripts/scrub_main_payload.py $@) + +$(FULL_BIN): $(LEGACY_FULL_OBJS) $(APP_ASSETS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(LEGACY_FULL_OBJS) $(WINDOWS_WEB_SUFFIX)) $(call run,$(STRIP_CMD) --strip-all $@) -$(FULL_BIN): $(FULL_OBJS) $(APP_ASSETS) - $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(FULL_OBJS) $(WINDOWS_FULL_LINK_SUFFIX)) +$(LAUNCHER_INSTALLER_BIN): $(LAUNCHER_INSTALLER_OBJS) $(APP_ASSETS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(LAUNCHER_INSTALLER_OBJS) $(WINDOWS_APPINST_SUFFIX)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(SAFE_LAUNCHER_INSTALLER_BIN): $(SAFE_LAUNCHER_INSTALLER_OBJS) $(APP_ASSETS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(SAFE_LAUNCHER_INSTALLER_OBJS) $(WINDOWS_BASE_SUFFIX)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(HELLO_BOOT_BIN): $(HELLO_BOOT_OBJS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(HELLO_BOOT_OBJS) $(WINDOWS_BASE_SUFFIX)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(HELLO_HTTP_BIN): $(HELLO_HTTP_OBJS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(HELLO_HTTP_OBJS) $(WINDOWS_WEB_SUFFIX)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(HELLO_NOTIFY_BIN): $(HELLO_NOTIFY_OBJS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(HELLO_NOTIFY_OBJS) $(WINDOWS_BASE_SUFFIX)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(INSTALLER_ENTER_PROBE_BIN): $(INSTALLER_ENTER_PROBE_OBJS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(INSTALLER_ENTER_PROBE_OBJS) $(WINDOWS_BASE_SUFFIX)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(INSTALLER_LINKONLY_APPINST_BIN): $(INSTALLER_LINKONLY_APPINST_OBJS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(INSTALLER_LINKONLY_APPINST_OBJS) $(WINDOWS_APPINST_SUFFIX)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(INSTALLER_RUNTIME_RESOLVE_APPINST_BIN): $(INSTALLER_RUNTIME_RESOLVE_APPINST_OBJS) + $(call run,$(LD_CMD) -o $@ $(WINDOWS_LINK_PREFIX) $(INSTALLER_RUNTIME_RESOLVE_APPINST_OBJS) $(WINDOWS_BASE_SUFFIX)) $(call run,$(STRIP_CMD) --strip-all $@) else -$(CORE_BIN): $(CORE_OBJS) - $(call run,$(CC_CMD) $(CORE_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(CORE_OBJS)) +$(BFPILOT_BIN): $(BFPILOT_OBJS) + $(call run,$(CC_CMD) $(BFPILOT_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(BFPILOT_OBJS)) + $(call run,$(STRIP_CMD) --strip-all $@) + $(call run,$(PYTHON) scripts/scrub_main_payload.py $@) + +$(DEBUG_BIN): $(DEBUG_OBJS) + $(call run,$(CC_CMD) $(DEBUG_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(DEBUG_OBJS)) + $(call run,$(STRIP_CMD) --strip-all $@) + $(call run,$(PYTHON) scripts/scrub_main_payload.py $@) + +$(FULL_BIN): $(LEGACY_FULL_OBJS) $(APP_ASSETS) + $(call run,$(CC_CMD) $(FULL_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(LEGACY_FULL_OBJS)) $(call run,$(STRIP_CMD) --strip-all $@) -$(FULL_BIN): $(FULL_OBJS) $(APP_ASSETS) - $(call run,$(CC_CMD) $(FULL_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(FULL_OBJS) $(FULL_LDLIBS)) +$(LAUNCHER_INSTALLER_BIN): $(LAUNCHER_INSTALLER_OBJS) $(APP_ASSETS) + $(call run,$(CC_CMD) $(LAUNCHER_INSTALLER_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(LAUNCHER_INSTALLER_OBJS) $(APPINST_LDLIBS)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(SAFE_LAUNCHER_INSTALLER_BIN): $(SAFE_LAUNCHER_INSTALLER_OBJS) $(APP_ASSETS) + $(call run,$(CC_CMD) $(SAFE_LAUNCHER_INSTALLER_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(SAFE_LAUNCHER_INSTALLER_OBJS)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(HELLO_BOOT_BIN): $(HELLO_BOOT_OBJS) + $(call run,$(CC_CMD) $(HELLO_BOOT_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(HELLO_BOOT_OBJS)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(HELLO_HTTP_BIN): $(HELLO_HTTP_OBJS) + $(call run,$(CC_CMD) $(HELLO_HTTP_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(HELLO_HTTP_OBJS)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(HELLO_NOTIFY_BIN): $(HELLO_NOTIFY_OBJS) + $(call run,$(CC_CMD) $(HELLO_NOTIFY_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(HELLO_NOTIFY_OBJS)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(INSTALLER_ENTER_PROBE_BIN): $(INSTALLER_ENTER_PROBE_OBJS) + $(call run,$(CC_CMD) $(INSTALLER_ENTER_PROBE_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(INSTALLER_ENTER_PROBE_OBJS)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(INSTALLER_LINKONLY_APPINST_BIN): $(INSTALLER_LINKONLY_APPINST_OBJS) + $(call run,$(CC_CMD) $(INSTALLER_LINKONLY_APPINST_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(INSTALLER_LINKONLY_APPINST_OBJS) $(APPINST_LDLIBS)) + $(call run,$(STRIP_CMD) --strip-all $@) + +$(INSTALLER_RUNTIME_RESOLVE_APPINST_BIN): $(INSTALLER_RUNTIME_RESOLVE_APPINST_OBJS) + $(call run,$(CC_CMD) $(INSTALLER_RUNTIME_RESOLVE_APPINST_CFLAGS) $(COMMON_LDFLAGS) -o $@ $(INSTALLER_RUNTIME_RESOLVE_APPINST_OBJS)) $(call run,$(STRIP_CMD) --strip-all $@) endif -deploy-core: core - $(call run,$(DEPLOY_CMD) -h $(PS5_HOST) -p $(PS5_PORT) $(CORE_BIN)) +inspect-imports: all + $(call run,bash scripts/inspect_imports.sh $(BFPILOT_BIN) $(DEBUG_BIN) $(FULL_BIN) $(LAUNCHER_INSTALLER_BIN) $(SAFE_LAUNCHER_INSTALLER_BIN) $(HELLO_BOOT_BIN) $(HELLO_HTTP_BIN) $(HELLO_NOTIFY_BIN) $(INSTALLER_ENTER_PROBE_BIN) $(INSTALLER_LINKONLY_APPINST_BIN) $(INSTALLER_RUNTIME_RESOLVE_APPINST_BIN)) + +deploy-bfpilot: bfpilot + $(call run,$(DEPLOY_CMD) -h $(PS5_HOST) -p $(PS5_PORT) $(BFPILOT_BIN)) + +deploy-debug: debug + $(call run,$(DEPLOY_CMD) -h $(PS5_HOST) -p $(PS5_PORT) $(DEBUG_BIN)) deploy-full: full $(call run,$(DEPLOY_CMD) -h $(PS5_HOST) -p $(PS5_PORT) $(FULL_BIN)) +deploy-launcher-installer: launcher-installer + $(call run,$(DEPLOY_CMD) -h $(PS5_HOST) -p $(PS5_PORT) $(LAUNCHER_INSTALLER_BIN)) + clean: - $(call run,rm -rf $(CORE_BIN) $(FULL_BIN) build gen) + $(call run,rm -rf $(BFPILOT_BIN) $(DEBUG_BIN) $(FULL_BIN) bfpilot-full-legacy.elf $(LAUNCHER_INSTALLER_BIN) $(SAFE_LAUNCHER_INSTALLER_BIN) bfpilot-core.elf build gen $(HELLO_BOOT_BIN) $(HELLO_HTTP_BIN) $(HELLO_NOTIFY_BIN) $(INSTALLER_ENTER_PROBE_BIN) $(INSTALLER_LINKONLY_APPINST_BIN) $(INSTALLER_RUNTIME_RESOLVE_APPINST_BIN) tests/hello_appinst.elf) .SECONDARY: $(GEN_SRCS) -.PHONY: all core full clean deploy-core deploy-full +.PHONY: all bfpilot debug full legacy-full launcher-installer launcher-installer-safe hello-boot hello-http hello-notify installer-enter-probe installer-linkonly-appinst installer-runtime-resolve-appinst inspect-imports clean deploy-bfpilot deploy-debug deploy-full deploy-launcher-installer diff --git a/README.md b/README.md index fa0dccb..8c31f0b 100644 --- a/README.md +++ b/README.md @@ -1,392 +1,213 @@ # BFpilot -BFpilot is a small PS5 payload that starts a browser-based file manager on port -`5905`. +BFpilot is a small PS5 userland payload that starts a browser-based file +manager on port `5905`. -It is meant to stay simple: no PKG installer, no FTP daemon, no mounting tools, -no payload bundle, no exploit code, and no DRM or backup features. The -compatibility-first build starts one standalone web server and lets the PS5 do -file operations locally. +It is intentionally narrow: no exploit code, no PKG installer, no FTP daemon, +no mounting tools, no payload bundle, and no DRM or backup features. Current prepared release: `v0.2.1` -## Recommended Build +## Recommended Payload -Use `bfpilot-core.elf` first on every new firmware or loader. +Use `bfpilot.elf` as the main release payload. -`bfpilot-core.elf` is the recommended build for maximum firmware compatibility: +`bfpilot.elf` is the maximum-compatibility file manager: -- Starts the HTTP file manager on `http://:5905/` -- Does not install or refresh the PS5 launcher tile -- Does not compile launcher installer code -- Does not link launcher-only SCE libraries -- Keeps notification attempts optional +- Starts the HTTP file manager at `http://:5905/`. +- Does not install or refresh a PS5 home-screen tile. +- Does not compile or link `src/app_installer.c`. +- Does not link `libSceAppInstUtil`. +- Does not depend on AppInstUtil, SystemService, UserService, or optional + launcher-only Sony libraries. +- Writes boot and runtime diagnostics under `/data/BFpilot`. -Only try `bfpilot-full.elf` after `bfpilot-core.elf` works on the same firmware -and loader. +Use `bfpilot-debug.elf` when you need extra proof that the payload reached +`main()` and progressed through startup. It is still file-manager-only and does +not link AppInstUtil. -`bfpilot-full.elf` includes optional launcher tile support. Launcher install may -fail on some firmware, exploit, or loader combinations. That should not stop the -file manager. If launcher install fails but port `5905` still works, use the web -file manager directly from a browser. +Use `bfpilot-full.elf` when you want the 0.2.0-style integrated launcher +install path. This is the best first installer-capable build for your 11.6 case: +it starts BFpilot and attempts the home-screen tile install inside the same +process, after optional PS5 service initialization. It does not direct-link +AppInstUtil; it dynamically resolves the same AppInst functions used by the +previous full build. + +Use `bfpilot-launcher-installer.elf` only after `bfpilot.elf` works. It is a +separate optional payload whose only job is installing or refreshing the +home-screen tile. It intentionally direct-links AppInstUtil, matching the +websrv/Payload Manager/ftpsrv launcher-install pattern. If the loader rejects +that import, the installer can fail before `main()`. The file manager is still +unaffected. + +Use `bfpilot-launcher-installer-safe.elf` only for diagnostics. It does not +direct-link AppInstUtil and reports whether AppInstUtil is already reachable +through the safe runtime path. ## What It Does -- Runs a file-manager web UI at `http://:5905/` -- Builds `bfpilot-core.elf` for the safest firmware compatibility path -- Builds `bfpilot-full.elf` for optional PS5 home-screen launcher support -- Browses, uploads, downloads, copies, moves, renames, creates folders, and - deletes -- Shows progress for copy, move, delete, and browser uploads -- Reports size, speed, ETA, item count, and current path/file while working -- Calculates folder size only when you select a folder -- Creates missing copy/move target folders automatically -- Keeps the default target shortcuts at `/data/homebrew` and `/mnt/usb0` -- Writes diagnostics to `/data/BFpilot/log.txt` -- Writes fatal-signal diagnostics to `/data/BFpilot/crash.log` +- Runs a file-manager web UI at `http://:5905/`. +- Supports browse, upload, download, copy, move, rename, mkdir, and delete. +- Shows progress for copy, move, delete, and browser uploads. +- Creates missing copy/move target folders automatically. +- Keeps default shortcuts at `/data/homebrew` and `/mnt/usb0`. +- Writes boot markers to `/data/BFpilot/boot.log`. +- Writes runtime logs to `/data/BFpilot/log.txt`. +- Writes fatal-signal diagnostics to `/data/BFpilot/crash.log`. -The full launcher tile opens: +The optional launcher tile, if installed by the separate installer payload, +opens: ```text http://127.0.0.1:5905/ ``` -Injecting the payload does not auto-open the browser. Core mode only starts the -web server. Full mode starts the web server and then attempts launcher install or -refresh as optional work. - ## Runtime Notes Inject the ELF to your payload loader on port `9021`. -For first tests on a firmware: +First test: ```text -send bfpilot-core.elf to :9021 +send bfpilot.elf to :9021 open http://:5905/ open http://:5905/api/status open http://:5905/api/diag ``` -If core works and you want the PS5 launcher tile: +Debug test: + +```text +send bfpilot-debug.elf to :9021 +open http://:5905/api/diag +check /data/BFpilot/boot.log +check /data/BFpilot/log.txt +``` + +Full install test: ```text send bfpilot-full.elf to :9021 open http://:5905/ -open http://:5905/api/diag +check /data/BFpilot/log.txt ``` -Full mode can skip launcher work at runtime: +Alternate port test while an old instance is still running: ```text ---no-launcher -BFPILOT_NO_LAUNCHER=1 +send bfpilot-debug.elf --port 5906 to :9021 +open http://:5906/api/status ``` -The full build stores launcher marker data in: +Launcher installer test: ```text -/data/BFpilot +send bfpilot-launcher-installer.elf to :9021 +check /data/BFpilot/launcher-installer.log ``` -The PS5 launcher app itself is installed under: +If `bfpilot-launcher-installer.elf` gives no notification and no log, send +`bfpilot-launcher-installer-safe.elf` next. If the safe installer reaches +`main()` but says AppInstUtil is unavailable, the direct installer is being +rejected before it can run. + +If the launcher installer appears to do nothing, run the probes in this order: ```text -/user/app/BFPL00001 +tests/installer_enter_probe.elf +tests/installer_linkonly_appinst.elf +tests/installer_runtime_resolve_appinst.elf ``` -If launcher install fails, keep testing the web server. The file manager can -still work without a launcher tile. +If `installer_linkonly_appinst.elf` does not create +`/data/BFpilot/linkonly_appinst_entered.txt`, direct AppInstUtil imports are +failing before `main()` on that loader/firmware. + +If `installer_runtime_resolve_appinst.elf` logs +`kernel_dynlib_handle libSceAppInstUtil.sprx rc=0xffffffff`, AppInstUtil is not +reachable through BFpilot's safe runtime path on that firmware/loader. That does +not invalidate the `bfpilot-full.elf` path on firmware where the same runtime +resolution is available, such as the 11.6 case you reported. ## Diagnostics -Use these endpoints while testing firmware compatibility: - -```text -http://:5905/api/status -http://:5905/api/diag -``` - Save these files when reporting failures: ```text +/data/BFpilot/boot.log /data/BFpilot/log.txt /data/BFpilot/crash.log +/data/BFpilot/launcher-installer.log ``` -### `/api/diag` Core Example - -This is the shape of a healthy core-mode response. Values such as `pid`, -`uptime`, `cwd`, and permission booleans vary by firmware and loader. - -```json -{ - "ok": true, - "name": "BFpilot", - "tag": "bfpilot-v0.2.1", - "version": "dev", - "mode": "core", - "pid": 112, - "uptime": 14, - "port": 5905, - "cwd": "/", - "can_stat_root": true, - "can_opendir_data": true, - "can_opendir_data_homebrew": true, - "can_opendir_usb0": true, - "can_write_data_bfpilot": true, - "can_write_user_app": false, - "launcher_status": "not_compiled", - "last_errno": 0, - "checkpoint": "web server ready", - "core_server_started": true, - "launcher_attempted": false, - "appinst_init_rc": -2147483000, - "title_dir_resolved": false, - "install_title_rc": -2147483000, - "install_all_rc": -2147483000, - "uninstall_rc": -2147483000, - "launcher_final_state": "skipped", - "rcs": { - "sceNetCtlInit": -2147483000, - "sceUserServiceInitialize": -2147483000, - "notification_test": 0, - "bind_5905": 0, - "listen_5905": 0 - }, - "launcher": { - "status": "not_compiled", - "status_rc": -2147483000, - "compiled": false, - "disabled": true, - "launcher_enabled": false, - "launcher_attempted": false, - "appinst_init_rc": -2147483000, - "title_dir_resolved": false, - "install_title_dir_resolved": false, - "install_title_rc": -2147483000, - "uninstall_resolved": false, - "uninstall_rc": -2147483000, - "install_all_resolved": false, - "install_all_rc": -2147483000, - "user_app_writable": null, - "launcher_install_rc": -1, - "launcher_final_state": "skipped" - }, - "routes": ["/", "/api/status", "/api/diag", "/fs", "/api/fs/*"] -} -``` - -### `/api/diag` Full Launcher-Failed Example - -This example is still acceptable if the web server works. The important part is -that launcher failure is recorded and the server remains reachable. - -```json -{ - "ok": true, - "name": "BFpilot", - "tag": "bfpilot-v0.2.1", - "mode": "full", - "port": 5905, - "can_opendir_data": true, - "can_write_data_bfpilot": true, - "launcher_status": "failed_nonfatal", - "core_server_started": true, - "launcher_attempted": true, - "appinst_init_rc": -2, - "title_dir_resolved": false, - "install_title_rc": -2147483000, - "install_all_rc": -2147483000, - "uninstall_rc": -2147483000, - "launcher_final_state": "failed_nonfatal", - "rcs": { - "notification_test": -1, - "bind_5905": 0, - "listen_5905": 0 - }, - "launcher": { - "status": "failed_nonfatal", - "status_rc": -1, - "compiled": true, - "disabled": false, - "launcher_enabled": true, - "launcher_attempted": true, - "appinst_init_rc": -2, - "title_dir_resolved": false, - "install_title_dir_resolved": false, - "install_title_rc": -2147483000, - "uninstall_resolved": false, - "uninstall_rc": -2147483000, - "install_all_resolved": true, - "install_all_rc": -2147483000, - "user_app_writable": false, - "launcher_install_rc": -2, - "launcher_final_state": "failed_nonfatal" - } -} -``` - -## Troubleshooting - -### Port `5905` Not Reachable - -- Confirm the payload sender reported a successful send to port `9021`. -- Try `bfpilot-core.elf` before `bfpilot-full.elf`. -- Check whether another BFpilot instance already owns port `5905`. -- Open `/data/BFpilot/log.txt` and look for `bind_5905`, `listen_5905`, and - `web server listening`. -- Recheck the PS5 IP address and make sure the browser device is on the same - network. - -### Payload Exits Immediately - -- Use `bfpilot-core.elf` first. -- Check the sender console for loader-side errors. -- Check `/data/BFpilot/crash.log` for fatal signal details. -- Check `/data/BFpilot/log.txt` for the last checkpoint. -- If reinjecting during a copy, move, or delete job, the new instance may exit - intentionally so the old job is not killed. - -### Launcher Install Failed - -- This is not fatal in `v0.2.1`. -- Confirm `http://:5905/` still opens. -- Open `/api/diag` and record `launcher_attempted`, `appinst_init_rc`, - `title_dir_resolved`, `install_title_rc`, `install_all_rc`, `uninstall_rc`, - `launcher_final_state`, `launcher.user_app_writable`, and - `launcher.launcher_install_rc`. -- If the file manager works, keep using the browser URL and report the launcher - diagnostics separately. - -### `/mnt/usb0` Missing - -- Confirm the external drive is connected before starting BFpilot. -- Try reconnecting the drive and refreshing the file manager. -- Check `/api/diag` for `can_opendir_usb0`. -- Some setups may expose a different USB mount path. Include `/api/diag` and - `/data/BFpilot/log.txt` in the report. - -### Upload Fails - -- Test with a tiny `.txt` file first. -- Upload to `/data/BFpilot-test` before testing USB storage. -- Confirm `/api/diag` reports `can_write_data_bfpilot: true`. -- If upload to USB fails but upload to `/data` works, treat it as a USB - permission or mount-path issue. -- Save the browser error and the latest `/data/BFpilot/log.txt` lines. - -### Copy/Delete Permission Denied - -- Test inside `/data/BFpilot-test` first. -- Avoid deleting root paths or system paths. -- For folder deletion, make sure recursive delete is explicitly requested by the - UI/API. -- If `/data` works but USB fails, collect `/api/diag` and note the source and - destination paths. -- Permission errors are useful compatibility data; record exact paths and the - operation that failed. - -## Firmware Testing - -Use [docs/FIRMWARE_TESTING.md](docs/FIRMWARE_TESTING.md) for the full -stage-by-stage protocol: - -- Stage A: core server only -- Stage B: notification enabled -- Stage C: launcher enabled -- Stage D: reinjection - -## Project Layout - -- `src/lite_main.c` starts the payload, handles reinjection handoff, applies the - launcher runtime flag, and starts the web server. -- `src/app_installer.c` writes launcher files and optionally registers the PS5 - home-screen tile in full mode. -- `src/sce_resolve.c` resolves optional SCE functions for full-mode launcher - support. -- `src/diag.c` writes append logs, crash logs, checkpoints, and runtime - diagnostics. -- `src/websrv_lite.c` serves the UI, downloads under `/fs`, `/api/status`, - `/api/diag`, and file-manager APIs. -- `src/transfer.c` contains upload, copy, move, delete, and long-running job - handling. -- `assets/files.html` is the full web UI that gets embedded into the ELF. -- `assets/icon.png` is the smaller web UI icon. -- `assets-app/` contains the launcher tile metadata and icon. - -Generated files go under `gen/` during build. Build intermediates go under -`build/`. Release ELF files should be attached to GitHub Releases only after the -release checklist is complete. +If there is no notification and no `/data/BFpilot/boot.log` entry, the payload +probably failed before `main()` or the loader rejected it. If the boot marker +appears but the server does not start, the failure happened after `main()`. ## Build -You need: - -- `ps5-payload-sdk` -- GNU `make` -- Python 3 -- LLVM/Clang tools that work with the PS5 payload SDK -- A shell that can run the SDK build commands - -Build both release files: - ```sh export PS5_PAYLOAD_SDK=/path/to/ps5-payload-sdk make clean all ``` -Build one mode: +Individual targets: ```sh -make core +make bfpilot +make debug make full +make launcher-installer +make hello-boot +make hello-http +make hello-notify +make installer-enter-probe +make installer-linkonly-appinst +make installer-runtime-resolve-appinst +make inspect-imports ``` Outputs: ```text -bfpilot-core.elf +bfpilot.elf +bfpilot-debug.elf bfpilot-full.elf +bfpilot-launcher-installer.elf +bfpilot-launcher-installer-safe.elf +tests/hello_boot.elf +tests/hello_http.elf +tests/hello_notify.elf +tests/installer_enter_probe.elf +tests/installer_linkonly_appinst.elf +tests/installer_runtime_resolve_appinst.elf ``` -Deploy helper: +The compatibility check must pass for release builds: ```sh -make deploy-core PS5_HOST= PS5_PORT=9021 -make deploy-full PS5_HOST= PS5_PORT=9021 +make inspect-imports ``` -## Extra Notes +It fails if `bfpilot.elf` or `bfpilot-debug.elf` contain AppInstUtil, +`sceAppInst`, `app_installer`, or `BFPL00001` installer fingerprints. Direct +`libSceAppInstUtil.sprx` import is allowed only for +`bfpilot-launcher-installer.elf` and +`tests/installer_linkonly_appinst.elf`. -BFpilot avoids kernel-level cleanup and does not force-unload unrelated -payloads. +## Project Layout -If you reinject while an older BFpilot or BS5FileManager instance is already -running, the new payload checks whether a file job is active. If the old -instance is idle, it asks it to shut down cleanly and then takes over port -`5905`. If a copy, move, or delete is running, the new injection exits instead -of interrupting the active job. +- `src/lite_main.c` starts the file-manager payload, handles clean reload, and + starts the web server. +- `src/boot_marker.c` writes the earliest cross-payload boot marker. +- `src/websrv_lite.c` serves `/`, `/api/status`, `/api/diag`, `/fs`, and + `/api/fs/*`. +- `src/transfer.c` contains upload, copy, move, delete, and long-running job + handling. +- `src/launcher_installer_main.c` is the isolated optional launcher installer. +- `tests/` contains small probe payloads for loader, HTTP, notification, and + AppInstUtil testing. -Cancel is cooperative. Large operations may take a moment to stop, especially on -external USB drives, but the job code checks for cancellation during scan, copy, -move cleanup, and delete. - -## Release Checklist - -Complete this before publishing `v0.2.1`: - -- Confirm `VERSION_TAG` is `bfpilot-v0.2.1`. -- Build from clean with `make clean all`. -- Confirm both files exist: `bfpilot-core.elf` and `bfpilot-full.elf`. -- Confirm `bfpilot-core.elf` is the recommended download in release notes. -- Confirm core mode does not include launcher installer objects. -- Confirm core mode does not link launcher-only SCE libraries. -- Confirm full mode treats launcher failure as non-fatal. -- Run Stage A from `docs/FIRMWARE_TESTING.md` on each available firmware. -- Run Stage C only after Stage A passes on that firmware. -- Save `/api/diag` output for tested firmware/loader combinations. -- Save `/data/BFpilot/log.txt` for failed tests. -- Fill in the compatibility table in `docs/FIRMWARE_TESTING.md`. -- Attach both ELFs to the release. -- In the release notes, tell users to try `bfpilot-core.elf` first. +See [docs/COMPATIBILITY_STRATEGY.md](docs/COMPATIBILITY_STRATEGY.md) for the +firmware compatibility strategy and [docs/FIRMWARE_TESTING.md](docs/FIRMWARE_TESTING.md) +for the test protocol. diff --git a/assets/files.html b/assets/files.html index d62acc6..6cf6ed7 100644 --- a/assets/files.html +++ b/assets/files.html @@ -651,7 +651,8 @@ uploadBusy: false, uploadAbort: false, uploadXhr: null, - jobTimer: 0 + jobTimer: 0, + jobHideTimer: 0 }; function el(id) { @@ -792,6 +793,10 @@ clearInterval(state.jobTimer); state.jobTimer = 0; } + if (state.jobHideTimer) { + clearTimeout(state.jobHideTimer); + state.jobHideTimer = 0; + } el('job').classList.add('show'); el('job-verb').textContent = verb || 'Working'; el('job-text').textContent = text || ''; @@ -1075,6 +1080,7 @@ const done = await waitJobIdle(); if (done.error) throw new Error(done.error); } catch (err) { + if ((err.message || '').toLowerCase().includes('job')) pollJob(); toast(verb + ': ' + err.message, 'err'); break; } @@ -1153,6 +1159,7 @@ const done = await waitJobIdle(); if (done.error) throw new Error(done.error); } catch (err) { + if ((err.message || '').toLowerCase().includes('job')) pollJob(); toast('delete: ' + err.message, 'err'); break; } @@ -1250,7 +1257,9 @@ toast(ok + ' uploaded' + (failed ? ', ' + failed + ' failed' : ''), failed ? 'err' : 'ok'); } setTimeout(() => { - if (!state.uploadBusy && !state.jobTimer) el('job').classList.remove('show'); + if (!state.uploadBusy && !state.jobTimer && !state.jobHideTimer) { + el('job').classList.remove('show'); + } }, 1600); } @@ -1261,6 +1270,10 @@ const verb = el('job-verb'); if (state.jobTimer) clearInterval(state.jobTimer); + if (state.jobHideTimer) { + clearTimeout(state.jobHideTimer); + state.jobHideTimer = 0; + } box.classList.add('show'); text.textContent = 'Starting'; let missed = 0; @@ -1279,7 +1292,17 @@ clearInterval(state.jobTimer); state.jobTimer = 0; if (job.error) toast(job.error, 'err'); - setTimeout(() => box.classList.remove('show'), 1400); + state.jobHideTimer = setTimeout(async () => { + state.jobHideTimer = 0; + try { + const latest = await api('/api/fs/job/status'); + if (latest.busy) { + pollJob(); + return; + } + } catch (err) {} + if (!state.uploadBusy && !state.jobTimer) box.classList.remove('show'); + }, 1400); } } catch (err) { missed++; diff --git a/docs/COMPATIBILITY_STRATEGY.md b/docs/COMPATIBILITY_STRATEGY.md new file mode 100644 index 0000000..2aa85c6 --- /dev/null +++ b/docs/COMPATIBILITY_STRATEGY.md @@ -0,0 +1,192 @@ +# BFpilot Compatibility Strategy + +BFpilot now separates the stable file manager from the fragile launcher +installer path. + +## Payload Roles + +### `bfpilot.elf` + +This is the main release payload. It is firmware-light and should be tested +first on every firmware and loader. + +- Starts the HTTP file manager on port `5905`. +- Does not install a launcher tile. +- Does not include `src/app_installer.c`. +- Does not link `libSceAppInstUtil`. +- Does not depend on AppInstUtil, SystemService, UserService, or launcher-only + Sony libraries. + +Broad firmware support comes from avoiding imports that can fail before +`main()` on some loaders or firmware combinations. + +### `bfpilot-debug.elf` + +This is the same file-manager payload with extra debug notifications/logging. +It still avoids AppInstUtil and launcher installer code. + +Use it when `bfpilot.elf` appears to do nothing. If the debug payload writes +`/data/BFpilot/boot.log`, it reached `main()`. + +### `bfpilot-full.elf` + +This build restores the 0.2.0-style integrated launcher flow for firmware and +loaders where that path worked. + +- Starts BFpilot from the same file-manager process. +- Runs optional `sceNetCtlInit` and `sceUserServiceInitialize` resolution/init. +- Dynamically resolves AppInstUtil symbols instead of direct-linking + AppInstUtil. +- Attempts `/user/app/BFPL00001` install/refresh before the web server loop. +- Continues to the web server if launcher install fails. + +Use this first when specifically testing home-screen tile install on firmware +11.6, because it is closest to the previous full build that installed there. + +### `bfpilot-launcher-installer.elf` + +This optional payload installs or refreshes `/user/app/BFPL00001`. + +It is intentionally isolated from the file manager: + +- It direct-links AppInstUtil, matching the launcher-install pattern used by + websrv, Payload Manager, and ftpsrv. +- It logs to `/data/BFpilot/launcher-installer.log`. +- It cannot break the file manager because it is not part of `bfpilot.elf`. + +If `bfpilot.elf` works but the launcher installer fails, the issue is the +AppInstUtil/launcher path, not the file manager. + +### `bfpilot-launcher-installer-safe.elf` + +This diagnostic payload avoids direct AppInstUtil imports and checks whether +AppInstUtil is already reachable through runtime symbol lookup. It is not the +force install path. Use it after the direct installer gives no notification or +log. + +## Launcher/AppInst Findings + +The current probes separate three cases: + +- `tests/installer_enter_probe.elf` writes a marker with safe imports only. + If this works, the loader can run ordinary BFpilot-shaped ELFs. +- `tests/installer_linkonly_appinst.elf` directly imports AppInstUtil but does + not call it. If this payload does not write its marker, the loader or + firmware rejected the ELF before `main()`. +- `tests/installer_runtime_resolve_appinst.elf` has safe imports only and then + checks whether `libSceAppInstUtil.sprx` is already loaded. If + `kernel_dynlib_handle` returns `0xffffffff`, AppInstUtil is not reachable + through the safe runtime path. + +On that combination, the safe runtime path cannot install. The force installer +uses the fragile direct AppInst import path because that is the pattern used by +working launcher installers. If the loader rejects that import before `main()`, +no code inside that ELF can recover. The file manager remains supported because +it avoids that import entirely. + +## Patterns Checked + +`ps5-payload-dev/websrv`, Payload Manager by itsPLK, and elf-arsenal launcher +installers all use the same basic AppInst pattern: + +- link `libSceAppInstUtil` directly; +- call `sceAppInstUtilInitialize()` directly; +- resolve only `sceAppInstUtilAppInstallTitleDir` by NID `Wudg3Xe3heE`; +- fall back to `sceAppInstUtilAppInstallAll()`. + +That pattern can work in environments where direct AppInst imports are accepted, +but it can also fail before `main()` on loaders that reject or cannot satisfy +the import. BFpilot keeps this pattern out of `bfpilot.elf`. + +Some payloads also depend on a system-authid or other elevated runtime context +before AppInst init can succeed on newer firmware. BFpilot does not implement +authid changes, kernel patches, kstuff integration, forced unloads, package +installers, or DRM-related behavior. Those are outside the compatibility goal +for the standalone file manager. + +## Boot Marker + +Every ELF calls: + +```c +bfpilot_boot_marker(payload_name, build_mode); +``` + +as the first meaningful line in `main()`. + +The marker: + +- Prints `BFpilot BOOT: entered main`. +- Tries to create `/data/BFpilot`. +- Appends payload name, build mode, PID, and build version to + `/data/BFpilot/boot.log`. +- Attempts a notification titled `BFpilot BOOT`. +- Continues if notification fails. + +If no notification appears and no `/data/BFpilot/boot.log` entry exists, the +payload probably failed before `main()` or the loader rejected the ELF. If the +boot marker exists but the server does not start, the crash or hang is after +`main()`. + +## Reload Behavior + +Startup is explicit: + +1. Boot marker runs. +2. BFpilot checks whether the selected port already has an old BFpilot server. +3. If an old server is found, BFpilot notifies `BFpilot reload: old server detected`. +4. BFpilot asks the old server to shut down through `/api/control/shutdown`. +5. If shutdown succeeds, the new server starts. +6. If shutdown fails or a file job is busy, BFpilot notifies `BFpilot reload blocked`, + logs the exact reason to `/data/BFpilot/log.txt`, and exits cleanly. + +This avoids the misleading case where reinjection looks like nothing happened. + +## Alternate Port + +The default web port is compile-time configurable with `BFPILOT_WEB_PORT`. + +Runtime port override is supported: + +```text +--port 5906 +``` + +Use this to test a new build while an old BFpilot instance is still running on +`5905`. + +## Import Inspection + +Run: + +```sh +make inspect-imports +``` + +The target prints file size, dynamic libraries/imports, undefined symbols, and +SCE-related symbol/string hints for: + +- `bfpilot.elf` +- `bfpilot-debug.elf` +- `bfpilot-full.elf` +- `bfpilot-launcher-installer.elf` +- `bfpilot-launcher-installer-safe.elf` +- `tests/hello_boot.elf` +- `tests/hello_http.elf` +- `tests/hello_notify.elf` +- `tests/installer_enter_probe.elf` +- `tests/installer_linkonly_appinst.elf` +- `tests/installer_runtime_resolve_appinst.elf` + +It fails if `bfpilot.elf` or `bfpilot-debug.elf` contain: + +- `SceAppInstUtil` +- `sceAppInst` +- `app_installer` +- `BFPL00001` + +The only payloads allowed to directly import AppInstUtil are +`bfpilot-launcher-installer.elf` and +`tests/installer_linkonly_appinst.elf`. The link-only test exists specifically +to prove whether that loader/firmware rejects AppInstUtil-linked ELFs before +`main()`. diff --git a/docs/FIRMWARE_TESTING.md b/docs/FIRMWARE_TESTING.md index 7c2de59..3bc69ea 100644 --- a/docs/FIRMWARE_TESTING.md +++ b/docs/FIRMWARE_TESTING.md @@ -1,189 +1,212 @@ # BFpilot Firmware Testing -This protocol checks whether BFpilot runs safely across jailbroken PS5 firmwares and loaders. It does not require exploit changes, kernel patching, package loading, or DRM-related features. +Use this protocol on every firmware/loader combination. Test the file manager +first. Test launcher/AppInstUtil only after the file manager works. -Use `bfpilot-core.elf` first on every firmware. Only test `bfpilot-full.elf` after the core server is confirmed working. - -## Before Testing - -Record these details before each run: - -- PS5 firmware version. -- Exploit and loader name/version. -- Payload file used: `bfpilot-core.elf` or `bfpilot-full.elf`. -- PS5 IP address. -- Sender tool and command used. -- Whether `/data/BFpilot/log.txt` and `/data/BFpilot/crash.log` exist after the run. - -Clear old browser tabs that point to BFpilot before reinjecting. If a stage fails, keep the PS5 powered on long enough to collect `/data/BFpilot/log.txt`, `/data/BFpilot/crash.log`, `/api/status`, and `/api/diag` if reachable. - -## Stage A: Core Server Only - -Purpose: prove the firmware and loader can run BFpilot's standalone HTTP file manager without launcher installation. - -1. Send `bfpilot-core.elf` to the loader on port `9021`. -2. Verify the sender console reports that the ELF was delivered without socket/send errors. -3. Watch for BFpilot startup output from the loader console, if available. -4. Confirm `/data/BFpilot/log.txt` is created or appended. -5. Open `http://PS5_IP:5905/` in a browser on the same network. -6. Open `http://PS5_IP:5905/api/status`. -7. Open `http://PS5_IP:5905/api/diag`. -8. Browse `/data` in the file manager. -9. Browse `/mnt/usb0` with an external drive connected. -10. Create or open `/data/BFpilot-test`. -11. Upload a small text file to `/data/BFpilot-test`. -12. Copy that text file to another name in `/data/BFpilot-test`. -13. Move or rename the copied file. -14. Delete the moved file. -15. Delete the original uploaded test file. -16. Reopen `/api/diag` and save the output. - -Pass criteria: - -- The server starts on port `5905`. -- `/`, `/api/status`, `/api/diag`, `/fs`, and `/api/fs/*` are reachable. -- Browsing `/data` works. -- Browsing `/mnt/usb0` either works or fails cleanly with a clear permission/path error. -- Upload, copy, move, and delete work inside `/data/BFpilot-test`. -- No crash log is created during normal file operations. - -Fail data to collect: - -- Sender console output. -- `/data/BFpilot/log.txt`. -- `/data/BFpilot/crash.log`, if present. -- The HTTP status and response body from `/api/status` and `/api/diag`, if reachable. -- Exact browser error if the page times out. - -## Stage B: Notification Enabled - -Purpose: verify notification support is optional and cannot stop the web server. - -1. Start from a PS5 state where Stage A passed. -2. Send `bfpilot-core.elf` again, or start `bfpilot-full.elf` with launcher disabled using `--no-launcher` or `BFPILOT_NO_LAUNCHER=1` if the loader supports arguments/environment. -3. Trigger the BFpilot notification path by starting the payload and watching for the startup notification attempt. -4. Open `http://PS5_IP:5905/`. -5. Open `http://PS5_IP:5905/api/diag`. -6. Check `/data/BFpilot/log.txt` for notification return code entries. - -Pass criteria: - -- If a notification appears, the server still starts. -- If the notification fails, the server still starts. -- `/api/diag` remains reachable after the notification attempt. -- The log records the notification result when available. - -Fail data to collect: +Record: +- Firmware version. +- Exploit/loader name and version. +- Payload name. +- Whether `/data/BFpilot/boot.log` received a new entry. - Whether a notification appeared. -- Notification return code from `/data/BFpilot/log.txt`. -- `/api/diag` output after startup. +- Whether the HTTP server started. +- `/api/status` and `/api/diag` output when reachable. +- Relevant log files under `/data/BFpilot`. -## Stage C: Launcher Enabled +## Stage A: Main File Manager -Purpose: verify full mode can attempt launcher install/refresh without making launcher failure fatal. +1. Send `bfpilot.elf` to the loader on port `9021`. +2. Verify `BFpilot BOOT` notification if notifications are working. +3. Verify `/data/BFpilot/boot.log` has a new `bfpilot file-manager` entry. +4. Open `http://PS5_IP:5905/`. +5. Open `http://PS5_IP:5905/api/status`. +6. Open `http://PS5_IP:5905/api/diag`. +7. Browse `/data`. +8. Browse `/mnt/usb0` if an external drive is connected. +9. Upload a small text file to `/data/BFpilot-test`. +10. Copy, move, and delete that test file. +11. Save `/data/BFpilot/log.txt`. -Only run this stage after Stage A passes on the same firmware and loader. +Pass criteria: + +- Boot marker appears. +- Server starts on port `5905`. +- `/`, `/api/status`, `/api/diag`, `/fs`, and `/api/fs/*` are reachable. +- Basic file operations work in `/data/BFpilot-test`. + +## Stage B: Debug File Manager + +Use this when Stage A appears to do nothing or when testing a new loader. + +1. Send `bfpilot-debug.elf` to the loader on port `9021`. +2. Verify `/data/BFpilot/boot.log` has a new `bfpilot-debug debug` entry. +3. Open `http://PS5_IP:5905/api/status`. +4. Open `http://PS5_IP:5905/api/diag`. +5. Save `/data/BFpilot/log.txt`. + +Expected result: + +- If `boot.log` has no new entry, the payload likely failed before `main()` or + the loader rejected it. +- If `boot.log` has an entry but `/api/status` is unreachable, the failure is + after `main()` and before or during server startup. + +## Stage C: Alternate Port + +Use this when another BFpilot instance may already be running on `5905`. + +1. Send `bfpilot-debug.elf --port 5906` to the loader. +2. Open `http://PS5_IP:5906/api/status`. +3. Open `http://PS5_IP:5906/api/diag`. +4. Save `/data/BFpilot/log.txt`. + +Pass criteria: + +- The new payload can start on `5906` without touching the old server on `5905`. + +## Stage D: Reinjection + +1. Start `bfpilot.elf`. +2. Reinject `bfpilot.elf` while idle. +3. Verify notification `BFpilot reload: old server detected`. +4. Verify the old listener stops cleanly and the new server starts. +5. Start a large copy or move. +6. Reinject `bfpilot.elf` during the active job. +7. Verify notification `BFpilot reload blocked`. +8. Verify the old job is not killed. +9. Save `/data/BFpilot/log.txt`. + +Pass criteria: + +- Idle reinjection performs a clean handoff. +- Active file jobs are not interrupted. +- Reload exits are logged and notified instead of appearing silent. + +## Stage E: Launcher Installer + +Only run this after Stage A passes on the same firmware/loader. + +### Integrated Full Build + +This is the first installer-capable build to try on firmware 11.6, because it +preserves the 0.2.0-style launcher flow that already installed there. 1. Send `bfpilot-full.elf` to the loader on port `9021`. -2. Watch for launcher install or refresh messages. +2. Watch for `BFpilot BOOT`, `BFpilot app`, and `BFpilot started` + notifications. 3. Open `http://PS5_IP:5905/`. -4. Open `http://PS5_IP:5905/api/status`. -5. Open `http://PS5_IP:5905/api/diag`. -6. Record the launcher fields from `/api/diag`. -7. Check whether the BFpilot launcher tile appears or refreshes on the PS5 home screen. -8. If the launcher tile does not appear, keep testing the web server anyway. -9. Browse `/data`. -10. Upload a small text file to `/data/BFpilot-test`. -11. Delete the uploaded test file. -12. Save `/data/BFpilot/log.txt`. +4. Save `/data/BFpilot/log.txt`. +5. Open `http://PS5_IP:5905/api/diag` if the web server starts. +6. Check whether the BFpilot tile appears or refreshes. + +Pass criteria: + +- On firmware where AppInstUtil runtime resolution works, the tile installs or + refreshes. +- If launcher install fails, the web server still starts and logs the exact + AppInst resolution/init/install return codes. + +### Isolated Direct Installer + +Use this after Stage A if you want to test the direct AppInst import pattern +used by websrv/Payload Manager/ftpsrv. It may fail before `main()` if the loader +rejects AppInstUtil imports. + +1. Send `bfpilot-launcher-installer.elf` to the loader on port `9021`. +2. Watch for `BFpilot BOOT` and launcher installer notifications. +3. Check whether the BFpilot tile appears or refreshes. +4. Save `/data/BFpilot/launcher-installer.log`. +5. Save `/data/BFpilot/boot.log`. + +Launcher installer fields to record from the log: + +- `entered main`. +- `AppInst init return code`. +- `/user/app/BFPL00001` mkdir return code. +- `param.json` and `icon0.png` write return code. +- `AppInstallTitleDir resolved`. +- `AppInstallTitleDir return code`. +- `AppInstallAll fallback return code`. +- `final result`. Pass criteria: - Launcher install may succeed or fail. -- Launcher failure must not stop the HTTP server. -- `/api/diag` records AppInstUtil resolution and return codes. -- File browsing and basic file operations still work after any launcher failure. +- Launcher failure does not affect `bfpilot.elf`. +- File manager remains testable through `http://PS5_IP:5905/`. -Launcher fields to record: +If the direct installer gives no notification and no log: -- `launcher_enabled`. -- `launcher_attempted`. -- `appinst_init_rc`. -- `title_dir_resolved`. -- `install_title_dir_resolved`. -- `install_title_rc`. -- `uninstall_resolved`. -- `uninstall_rc`. -- `install_all_resolved`. -- `install_all_rc`. -- `user_app_writable`. -- `launcher_install_rc`. -- `launcher_final_state`. +1. Send `bfpilot-launcher-installer-safe.elf`. +2. Save `/data/BFpilot/launcher-installer.log`. +3. If the safe installer reaches `main()` but logs + `kernel_dynlib_handle libSceAppInstUtil.sprx rc=0xffffffff`, AppInstUtil is + not available through the safe runtime path. +4. If `tests/installer_linkonly_appinst.elf` also produces no marker, direct + AppInst imports fail before `main()` on that loader/firmware. -Fail data to collect: +In that case the direct installer is being rejected before it can run, while +the main file manager remains usable through `http://PS5_IP:5905/`. -- The last launcher-related lines from `/data/BFpilot/log.txt`. -- Full `/api/diag` output. -- Whether the tile appeared, refreshed, disappeared, or did not change. -- Whether the web server continued running after launcher failure. +## Stage F: Minimal Probe Payloads -## Stage D: Reinjection +Use these to isolate loader, notification, HTTP, and AppInstUtil behavior. -Purpose: verify reinjecting BFpilot does not kill unrelated payloads or interrupt active work in an unsafe way. +### `tests/hello_boot.elf` -1. Start `bfpilot-core.elf`. -2. Open `http://PS5_IP:5905/` and confirm the server is idle. -3. Inject `bfpilot-core.elf` again while idle. -4. Verify the web server still responds. -5. Open `/api/diag` and record uptime, PID, and any old-instance message. -6. Start a copy operation using a test file inside `/data/BFpilot-test`. -7. While the copy is active, inject `bfpilot-core.elf` again. -8. Verify the old copy job is not killed by the new injection. -9. Verify the web server remains reachable after the copy finishes. -10. Repeat the idle reinjection test once with `bfpilot-full.elf` only after full mode passed Stage C. +1. Send `tests/hello_boot.elf`. +2. Verify boot marker notification. +3. Verify `/data/BFpilot/boot.log`. +4. Wait 10 seconds for `BFpilot BOOT still alive`. -Pass criteria: +### `tests/hello_http.elf` -- Reinjection while idle leaves one reachable BFpilot server. -- Reinjection during active copy does not kill the active job. -- Existing unrelated payloads are not forcibly unloaded. -- Logs clearly state whether the new instance started, reused an existing state, or exited because another BFpilot instance was already active. +1. Send `tests/hello_http.elf`. +2. Open `http://PS5_IP:5906/api/status`. -Fail data to collect: +### `tests/hello_notify.elf` -- `/data/BFpilot/log.txt` from before and after reinjection. -- `/api/diag` before reinjection, during copy, and after copy. -- File copy source, destination, size, and whether the destination completed correctly. -- Sender console output for each injection. +1. Send `tests/hello_notify.elf`. +2. Record notification result from sender output and `/data/BFpilot/boot.log`. + +### `tests/installer_enter_probe.elf` + +1. Send `tests/installer_enter_probe.elf`. +2. Verify `/data/BFpilot/installer_enter_probe.txt` exists. +3. If it does not exist, the loader rejected even the safe installer-shaped + probe before `main()`. + +### `tests/installer_linkonly_appinst.elf` + +1. Send `tests/installer_linkonly_appinst.elf`. +2. Verify `/data/BFpilot/linkonly_appinst_entered.txt` exists. +3. If it does not exist, direct AppInstUtil linking is incompatible with that + loader/firmware and installer code must avoid direct AppInst imports. + +### `tests/installer_runtime_resolve_appinst.elf` + +1. Send `tests/installer_runtime_resolve_appinst.elf`. +2. Verify `/data/BFpilot/runtime_resolve_entered.txt` exists. +3. Save `/data/BFpilot/runtime_resolve_appinst.log`. +4. Use the log to see whether `kernel_dynlib_handle`, symbol lookup, and NID + resolve reached AppInstUtil. + +Interpretation: + +- `kernel_dynlib_handle ... rc=0xffffffff` means AppInstUtil is not already + loaded in this process. +- BFpilot intentionally skips `dlopen` for AppInstUtil after a prior test stops + before the `dlopen` result log, because that path is not safe enough for a + compatibility payload. ## Compatibility Table -| firmware | exploit/loader | payload used | server starts | file browse | upload | copy | move | delete | launcher install | notes | -|---|---|---|---|---|---|---|---|---|---|---| -| 11.60 | | `bfpilot-core.elf` | | | | | | | N/A | | -| 11.60 | | `bfpilot-full.elf` | | | | | | | | | -| 12.70 | | `bfpilot-core.elf` | | | | | | | N/A | | -| 12.70 | | `bfpilot-full.elf` | | | | | | | | | -| | | `bfpilot-core.elf` | | | | | | | N/A | | -| | | `bfpilot-full.elf` | | | | | | | | | - -Use `yes`, `no`, or `partial` for result columns. Put exact error codes, HTTP status codes, and log checkpoints in `notes`. - -## Recommended Report Format - -```text -Firmware: -Exploit/loader: -Payload: -Sender command/tool: -PS5 IP: -Server URL: -Stage passed: -First failing step: -/api/status result: -/api/diag result: -Relevant log lines: -Crash log present: -Notes: -``` +| firmware | exploit/loader | payload used | boot marker | server starts | file browse | upload | copy | move | delete | launcher install | notes | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| 12.70 | | bfpilot.elf | | | | | | | | n/a | | +| 12.70 | | bfpilot-full.elf | | | | | | | | | | +| 12.70 | | bfpilot-launcher-installer.elf | | n/a | n/a | n/a | n/a | n/a | n/a | | | +| 11.60 | | bfpilot.elf | | | | | | | | n/a | | +| 11.60 | | bfpilot-full.elf | | | | | | | | | | +| 11.60 | | bfpilot-launcher-installer.elf | | n/a | n/a | n/a | n/a | n/a | n/a | | | diff --git a/scripts/inspect_imports.sh b/scripts/inspect_imports.sh new file mode 100644 index 0000000..d5f1ffa --- /dev/null +++ b/scripts/inspect_imports.sh @@ -0,0 +1,149 @@ +#!/usr/bin/env bash +set -euo pipefail + +find_tool() { + local name="$1" + if [[ -n "${LLVM_BINDIR:-}" ]]; then + if [[ -x "${LLVM_BINDIR}/${name}" ]]; then + printf '%s\n' "${LLVM_BINDIR}/${name}" + return 0 + fi + if [[ -x "${LLVM_BINDIR}/${name}.exe" ]]; then + printf '%s\n' "${LLVM_BINDIR}/${name}.exe" + return 0 + fi + fi + if command -v "${name}" >/dev/null 2>&1; then + command -v "${name}" + return 0 + fi + if command -v "${name}.exe" >/dev/null 2>&1; then + command -v "${name}.exe" + return 0 + fi + return 1 +} + +READELF="$(find_tool llvm-readelf || find_tool readelf || true)" +READOBJ="$(find_tool llvm-readobj || true)" +NM="$(find_tool llvm-nm || find_tool nm || true)" +STRINGS="$(find_tool llvm-strings || find_tool strings || true)" +TMP_DIR="${TMPDIR:-/tmp}" + +if [[ -z "${STRINGS}" ]]; then + echo "inspect-imports: strings or llvm-strings is required" >&2 + exit 1 +fi + +if [[ $# -eq 0 ]]; then + echo "inspect-imports: no ELF files provided" >&2 + exit 1 +fi + +needed_libraries() { + local file="$1" + if [[ -n "${READOBJ}" ]]; then + "${READOBJ}" --needed-libs "${file}" 2>/dev/null | + grep -E '^[[:space:]]+[^[:space:]]+\.sprx$' | + sed -E 's/^[[:space:]]+//' + elif [[ -n "${READELF}" ]]; then + "${READELF}" -d "${file}" 2>/dev/null | + sed -nE 's/.*Shared library: \[([^]]+)\].*/\1/p' + fi +} + + +check_no_direct_appinst_import() { + local file="$1" + local needed + needed="$(needed_libraries "${file}" || true)" + if printf '%s\n' "${needed}" | + grep -E 'libSceAppInstUtil\.sprx|libSceSystemService\.sprx|libSceUserService\.sprx' >/dev/null; then + echo + echo "inspect-imports: unsafe direct launcher import in ${file}" >&2 + printf '%s\n' "${needed}" >&2 + return 1 + fi +} + + +for file in "$@"; do + echo + echo "== ${file} ==" + if [[ ! -f "${file}" ]]; then + echo "missing" + continue + fi + + size="$(wc -c < "${file}" | tr -d '[:space:]')" + echo "file size: ${size} bytes" + + echo "-- dynamic libraries/imports --" + if [[ -n "${READOBJ}" ]]; then + "${READOBJ}" --needed-libs "${file}" || true + elif [[ -n "${READELF}" ]]; then + "${READELF}" -d "${file}" | grep -E 'NEEDED|SONAME' || true + else + echo "no llvm-readobj/readelf available" + fi + + echo "-- undefined symbols --" + if [[ -n "${READELF}" ]]; then + "${READELF}" --dyn-symbols "${file}" | grep -E 'UND|Undefined' || true + elif [[ -n "${NM}" ]]; then + "${NM}" -u "${file}" || true + else + echo "no llvm-readelf/readelf/nm available" + fi + + echo "-- SCE-related strings/symbol hints --" + "${STRINGS}" "${file}" | grep -Ei '(^|[^A-Za-z0-9_])(sce|Sce|AppInst|SystemService|UserService|BFPL00001|app_installer)' || true +done + +for file in "$@"; do + case "${file}" in + bfpilot-launcher-installer.elf|./bfpilot-launcher-installer.elf) + continue + ;; + tests/installer_linkonly_appinst.elf|./tests/installer_linkonly_appinst.elf) + continue + ;; + esac + if [[ -f "${file}" ]]; then + check_no_direct_appinst_import "${file}" + fi +done + +for clean_file in bfpilot.elf bfpilot-debug.elf; do + if [[ ! -f "${clean_file}" ]]; then + continue + fi + if "${STRINGS}" "${clean_file}" | + grep -E 'SceAppInstUtil|sceAppInst|app_installer|BFPL00001' >"${TMP_DIR}/bfpilot-forbidden-imports.txt"; then + echo + echo "inspect-imports: forbidden launcher/AppInst content in ${clean_file}" >&2 + cat "${TMP_DIR}/bfpilot-forbidden-imports.txt" >&2 + exit 1 + fi +done + +if [[ -f tests/installer_linkonly_appinst.elf ]]; then + if ! needed_libraries tests/installer_linkonly_appinst.elf | + grep -q 'libSceAppInstUtil\.sprx'; then + echo + echo "inspect-imports: tests/installer_linkonly_appinst.elf must directly import libSceAppInstUtil.sprx" >&2 + exit 1 + fi +fi + +if [[ -f bfpilot-launcher-installer.elf ]]; then + if ! needed_libraries bfpilot-launcher-installer.elf | + grep -q 'libSceAppInstUtil\.sprx'; then + echo + echo "inspect-imports: bfpilot-launcher-installer.elf must directly import libSceAppInstUtil.sprx" >&2 + exit 1 + fi +fi + +echo +echo "inspect-imports: compatibility checks passed" diff --git a/scripts/scrub_main_payload.py b/scripts/scrub_main_payload.py new file mode 100644 index 0000000..4681279 --- /dev/null +++ b/scripts/scrub_main_payload.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +"""Remove SDK startup-table launcher fingerprints from main BFpilot payloads.""" + +from __future__ import annotations + +import pathlib +import sys + + +REPLACEMENTS = { + b"libSceAppInstUtil.sprx": b"libBfpilotCleanMain.sx", +} + + +def scrub(path: pathlib.Path) -> int: + data = path.read_bytes() + changed = False + for old, new in REPLACEMENTS.items(): + if len(old) != len(new): + raise ValueError(f"replacement length mismatch for {old!r}") + if old in data: + data = data.replace(old, new) + changed = True + if changed: + path.write_bytes(data) + return 1 if changed else 0 + + +def main(argv: list[str]) -> int: + if len(argv) < 2: + print("usage: scrub_main_payload.py [...]", file=sys.stderr) + return 2 + for name in argv[1:]: + path = pathlib.Path(name) + changed = scrub(path) + print(f"scrub-main-payload: {path} changed={changed}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) diff --git a/src/app_installer.c b/src/app_installer.c index 2087ea2..3e1f05a 100644 --- a/src/app_installer.c +++ b/src/app_installer.c @@ -46,30 +46,27 @@ INCASSET(bfpilot_param_json, "assets-app/param.json"); INCASSET(bfpilot_icon0_png, "assets-app/icon0.png"); +typedef int (*appinst_initialize_fn)(void); +typedef int (*appinst_uninstall_fn)(const char *); typedef int (*app_install_title_dir_fn)(const char *, const char *, void *); - -int sceAppInstUtilInitialize(void); -int sceAppInstUtilAppInstallAll(void *); +typedef int (*appinst_install_all_fn)(void *); typedef struct appinst_api { + appinst_initialize_fn initialize; + appinst_uninstall_fn uninstall; app_install_title_dir_fn install_title_dir; + appinst_install_all_fn install_all; } appinst_api_t; static const uint8_t g_install_marker[] = BFPILOT_INSTALL_MARKER; static bfpilot_launcher_diag_t g_launcher_diag = { .launcher_enabled = 1, - .launcher_attempted = 0, .appinst_init_rc = -1, - .title_dir_resolved = 0, .install_title_dir_resolved = 0, - .install_title_rc = BFPILOT_DIAG_SKIPPED, .uninstall_resolved = 0, - .uninstall_rc = BFPILOT_DIAG_SKIPPED, .install_all_resolved = 0, - .install_all_rc = BFPILOT_DIAG_SKIPPED, .user_app_writable = -1, .launcher_install_rc = -1, - .launcher_final_state = "skipped", }; @@ -83,31 +80,25 @@ static void reset_launcher_diag(void) { bfpilot_launcher_diag_t diag = { .launcher_enabled = 1, - .launcher_attempted = 1, .appinst_init_rc = -1, - .title_dir_resolved = 0, .install_title_dir_resolved = 0, - .install_title_rc = BFPILOT_DIAG_SKIPPED, .uninstall_resolved = 0, - .uninstall_rc = BFPILOT_DIAG_SKIPPED, .install_all_resolved = 0, - .install_all_rc = BFPILOT_DIAG_SKIPPED, .user_app_writable = -1, .launcher_install_rc = -1, - .launcher_final_state = "skipped", }; g_launcher_diag = diag; publish_launcher_diag(); } -static void -set_launcher_final(const char *state, int rc) { - snprintf(g_launcher_diag.launcher_final_state, - sizeof(g_launcher_diag.launcher_final_state), "%s", - state ? state : "failed_nonfatal"); - g_launcher_diag.launcher_install_rc = rc; - publish_launcher_diag(); +static int +resolve_optional(void **out, const char *symbol, const char *fallback_symbol) { + int rc = sce_resolve_symbol(BFPILOT_APPINST_MODULE, symbol, out); + if(rc != 0 && fallback_symbol) { + rc = sce_resolve_symbol(BFPILOT_APPINST_MODULE, fallback_symbol, out); + } + return rc; } @@ -115,20 +106,29 @@ static void resolve_appinst(appinst_api_t *api) { memset(api, 0, sizeof(*api)); - int rc = sce_resolve_symbol(BFPILOT_APPINST_MODULE, - BFPILOT_NID_INSTALL_TITLE_DIR, - (void **)&api->install_title_dir); - g_launcher_diag.title_dir_resolved = api->install_title_dir != NULL; + int rc = resolve_optional((void **)&api->initialize, + "sceAppInstUtilInitialize", NULL); + bfpilot_log("launcher resolve Initialize %s rc=0x%08x", + api->initialize ? "ok" : "missing", rc); + + rc = resolve_optional((void **)&api->uninstall, + "sceAppInstUtilAppUnInstall", NULL); + g_launcher_diag.uninstall_resolved = api->uninstall != NULL; + bfpilot_log("launcher resolve AppUnInstall %s rc=0x%08x", + api->uninstall ? "ok" : "missing", rc); + + rc = resolve_optional((void **)&api->install_title_dir, + "sceAppInstUtilAppInstallTitleDir", + BFPILOT_NID_INSTALL_TITLE_DIR); g_launcher_diag.install_title_dir_resolved = api->install_title_dir != NULL; - bfpilot_log("launcher resolve AppInstallTitleDir NID %s rc=0x%08x", + bfpilot_log("launcher resolve AppInstallTitleDir %s rc=0x%08x", api->install_title_dir ? "ok" : "missing", rc); - g_launcher_diag.uninstall_resolved = 0; - g_launcher_diag.uninstall_rc = BFPILOT_DIAG_SKIPPED; - bfpilot_log("launcher uninstall skipped for compatibility"); - - g_launcher_diag.install_all_resolved = 1; - bfpilot_log("launcher AppInstallAll uses linked SDK stub"); + rc = resolve_optional((void **)&api->install_all, + "sceAppInstUtilAppInstallAll", NULL); + g_launcher_diag.install_all_resolved = api->install_all != NULL; + bfpilot_log("launcher resolve AppInstallAll %s rc=0x%08x", + api->install_all ? "ok" : "missing", rc); publish_launcher_diag(); } @@ -153,23 +153,26 @@ static int install_app(const appinst_api_t *api, const char *title_id, const char *dir) { if(api->install_title_dir) { int err = api->install_title_dir(title_id, dir, NULL); - g_launcher_diag.install_title_rc = err; g_launcher_diag.launcher_install_rc = err; publish_launcher_diag(); if(err == 0) return 0; bfpilot_log("launcher install AppInstallTitleDir failed rc=0x%08x", err); } else { - g_launcher_diag.install_title_rc = BFPILOT_DIAG_SKIPPED; - publish_launcher_diag(); bfpilot_log("launcher install AppInstallTitleDir not resolved"); } - int err = sceAppInstUtilAppInstallAll(NULL); - g_launcher_diag.install_all_rc = err; - g_launcher_diag.launcher_install_rc = err; + if(api->install_all) { + int err = api->install_all(NULL); + g_launcher_diag.launcher_install_rc = err; + publish_launcher_diag(); + bfpilot_log("launcher install AppInstallAll rc=0x%08x", err); + return err; + } + + g_launcher_diag.launcher_install_rc = -2; publish_launcher_diag(); - bfpilot_log("launcher install AppInstallAll rc=0x%08x", err); - return err; + bfpilot_log("launcher install AppInstallAll not resolved"); + return -2; } @@ -264,6 +267,7 @@ bfpilot_install_app_if_needed(void) { char sce_sys_dir[256]; char param_path[256]; char icon_path[256]; + char msg[128]; struct stat st; reset_launcher_diag(); @@ -274,6 +278,22 @@ bfpilot_install_app_if_needed(void) { bfpilot_log("launcher install %s writable=%d", BFPILOT_APP_ROOT, g_launcher_diag.user_app_writable); + if(!api.initialize) { + g_launcher_diag.launcher_install_rc = -2; + publish_launcher_diag(); + bfpilot_log("launcher install sceAppInstUtilInitialize not resolved"); + bfpilot_notify("BFpilot app failed", "AppInst init not resolved"); + return -1; + } + + if(!api.install_title_dir && !api.install_all) { + g_launcher_diag.launcher_install_rc = -2; + publish_launcher_diag(); + bfpilot_log("launcher install no AppInst install function resolved"); + bfpilot_notify("BFpilot app failed", "AppInst install not resolved"); + return -1; + } + snprintf(app_dir, sizeof(app_dir), BFPILOT_APP_ROOT "/%s", BFPILOT_APP_TITLE_ID); snprintf(sce_sys_dir, sizeof(sce_sys_dir), "%s/sce_sys", app_dir); @@ -297,19 +317,35 @@ bfpilot_install_app_if_needed(void) { bfpilot_notify("BFpilot app", "Installing PS5 home-screen launcher"); } - int err = sceAppInstUtilInitialize(); + int err = api.initialize(); g_launcher_diag.appinst_init_rc = err; publish_launcher_diag(); if(err) { bfpilot_log("launcher install sceAppInstUtilInitialize failed rc=0x%08x", err); - set_launcher_final("failed_nonfatal", err); + g_launcher_diag.launcher_install_rc = err; + publish_launcher_diag(); + snprintf(msg, sizeof(msg), "AppInst init failed 0x%08x", err); + bfpilot_notify("BFpilot app failed", msg); return -1; } - g_launcher_diag.uninstall_rc = BFPILOT_DIAG_SKIPPED; - publish_launcher_diag(); - bfpilot_log("launcher install AppUnInstall skipped"); + if(api.uninstall) { + int uninstall_err = api.uninstall(BFPILOT_APP_TITLE_ID); + bfpilot_log("launcher install refresh BFpilot tile rc=0x%08x", + uninstall_err); + uninstall_err = api.uninstall(BFPILOT_INVALID_APP_TITLE_ID); + bfpilot_log("launcher install remove invalid BFpilot tile rc=0x%08x", + uninstall_err); + uninstall_err = api.uninstall(BFPILOT_LEGACY_APP_TITLE_ID); + bfpilot_log("launcher install remove BS5FileManager tile rc=0x%08x", + uninstall_err); + uninstall_err = api.uninstall(BFPILOT_OLD_LEGACY_APP_TITLE_ID); + bfpilot_log("launcher install remove old legacy tile rc=0x%08x", + uninstall_err); + } else { + bfpilot_log("launcher install AppUnInstall not resolved, skipping removes"); + } char invalid_dir[256]; snprintf(invalid_dir, sizeof(invalid_dir), BFPILOT_APP_ROOT "/%s", @@ -321,28 +357,36 @@ bfpilot_install_app_if_needed(void) { if(mkdir_if_needed(app_dir) != 0 || mkdir_if_needed(sce_sys_dir) != 0) { bfpilot_log("launcher install mkdir failed errno=%d", errno); - set_launcher_final("failed_nonfatal", -errno); + g_launcher_diag.launcher_install_rc = -errno; + publish_launcher_diag(); + snprintf(msg, sizeof(msg), "mkdir failed errno %d", errno); + bfpilot_notify("BFpilot app failed", msg); return -1; } if(write_file(param_path, bfpilot_param_json, bfpilot_param_json_size) != 0) { bfpilot_log("launcher install failed writing %s errno=%d", param_path, errno); - set_launcher_final("failed_nonfatal", -errno); + g_launcher_diag.launcher_install_rc = -errno; + publish_launcher_diag(); + bfpilot_notify("BFpilot app failed", "could not write param.json"); return -1; } if(write_file(icon_path, bfpilot_icon0_png, bfpilot_icon0_png_size) != 0) { bfpilot_log("launcher install failed writing %s errno=%d", icon_path, errno); - set_launcher_final("failed_nonfatal", -errno); + g_launcher_diag.launcher_install_rc = -errno; + publish_launcher_diag(); + bfpilot_notify("BFpilot app failed", "could not write icon0.png"); return -1; } err = install_app(&api, BFPILOT_APP_TITLE_ID, BFPILOT_APP_PARENT); if(err) { bfpilot_log("launcher install install_app failed rc=0x%08x", err); - set_launcher_final("failed_nonfatal", err); + snprintf(msg, sizeof(msg), "register BFPL00001 failed 0x%08x", err); + bfpilot_notify("BFpilot app failed", msg); return -1; } @@ -355,7 +399,6 @@ bfpilot_install_app_if_needed(void) { BFPILOT_MARKER_PATH, errno); } - set_launcher_final("installed", 0); bfpilot_notify("BFpilot app ready", "Tile BFPL00001 opens http://127.0.0.1:5905/"); return 1; diff --git a/src/boot_marker.c b/src/boot_marker.c new file mode 100644 index 0000000..da4cf32 --- /dev/null +++ b/src/boot_marker.c @@ -0,0 +1,77 @@ +/* + * BFpilot - early payload entry marker. + */ + +#include "boot_marker.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "notify.h" +#include "version.h" + +#ifndef VERSION_TAG +#define VERSION_TAG "bfpilot-unknown" +#endif + +#ifndef BUILD_VERSION +#define BUILD_VERSION "unknown" +#endif + +#ifndef BFPILOT_BOOT_NOTIFY +#define BFPILOT_BOOT_NOTIFY 1 +#endif + +#define BFPILOT_DATA_ROOT "/data" +#define BFPILOT_DATA_DIR "/data/BFpilot" +#define BFPILOT_BOOT_LOG_PATH "/data/BFpilot/boot.log" + + +static void +mkdir_ignore(const char *path) { + if(mkdir(path, 0755) != 0 && errno != EEXIST) { + return; + } +} + + +void +bfpilot_boot_marker(const char *payload_name, const char *build_mode) { + const char *payload = payload_name && payload_name[0] ? + payload_name : "BFpilot"; + const char *mode = build_mode && build_mode[0] ? build_mode : "unknown"; + char line[512]; + char notify_msg[128]; + + printf("BFpilot BOOT: %s %s entered main\n", payload, mode); + fflush(stdout); + + mkdir_ignore(BFPILOT_DATA_ROOT); + mkdir_ignore(BFPILOT_DATA_DIR); + + int n = snprintf(line, sizeof(line), + "%ld payload=%s mode=%s pid=%ld tag=%s build=%s entered main\n", + (long)time(NULL), payload, mode, (long)getpid(), + VERSION_TAG, BUILD_VERSION); + if(n > 0) { + if((size_t)n >= sizeof(line)) n = (int)sizeof(line) - 1; + int fd = open(BFPILOT_BOOT_LOG_PATH, + O_WRONLY | O_CREAT | O_APPEND, 0600); + if(fd >= 0) { + (void)write(fd, line, (size_t)n); + close(fd); + } + } + +#if BFPILOT_BOOT_NOTIFY + snprintf(notify_msg, sizeof(notify_msg), "%s loaded", payload); + (void)bfpilot_notify_send("BFpilot BOOT", notify_msg); +#else + (void)notify_msg; +#endif +} diff --git a/src/boot_marker.h b/src/boot_marker.h new file mode 100644 index 0000000..c7413ae --- /dev/null +++ b/src/boot_marker.h @@ -0,0 +1,7 @@ +/* + * BFpilot - early payload entry marker. + */ + +#pragma once + +void bfpilot_boot_marker(const char *payload_name, const char *build_mode); diff --git a/src/launcher_installer_force_main.c b/src/launcher_installer_force_main.c new file mode 100644 index 0000000..d97c55f --- /dev/null +++ b/src/launcher_installer_force_main.c @@ -0,0 +1,252 @@ +/* + * BFpilot - direct AppInst launcher tile installer. + * + * This intentionally uses the same direct AppInstUtil pattern as websrv, + * Payload Manager, and ftpsrv. If a loader rejects AppInstUtil imports, this + * ELF can fail before main; use bfpilot-launcher-installer-safe.elf to prove + * that case. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "boot_marker.h" +#include "notify.h" +#include "version.h" + +#define BFPILOT_APP_TITLE_ID "BFPL00001" +#define BFPILOT_APP_ROOT "/user/app" +#define BFPILOT_APP_PARENT BFPILOT_APP_ROOT "/" +#define BFPILOT_DATA_ROOT "/data" +#define BFPILOT_DATA_DIR "/data/BFpilot" +#define BFPILOT_LAUNCHER_LOG "/data/BFpilot/launcher-installer.log" +#define BFPILOT_APPINST_MODULE "libSceAppInstUtil.sprx" +#define BFPILOT_NID_INSTALL_TITLE_DIR "Wudg3Xe3heE" +#define BFPILOT_DIAG_SKIPPED (-2147483000) + +#define INCASSET(name, file) \ + __asm__(".section .rodata\n" \ + ".global " #name "\n" \ + ".global " #name "_end\n" \ + ".global " #name "_size\n" \ + ".align 16\n" #name ":\n" \ + ".incbin \"" file "\"\n" #name "_end:\n" #name "_size:\n" \ + ".quad " #name "_end - " #name "\n" \ + ".previous\n"); \ + extern const uint8_t name[]; \ + extern const size_t name##_size + +INCASSET(bfpilot_param_json, "assets-app/param.json"); +INCASSET(bfpilot_icon0_png, "assets-app/icon0.png"); + +int sceAppInstUtilInitialize(void); +int sceAppInstUtilAppInstallAll(void *); +int sceAppInstUtilAppUnInstall(const char *); + +typedef int (*app_install_title_dir_fn)(const char *, const char *, void *); + + +static int +mkdir_if_needed(const char *path) { + if(mkdir(path, 0755) == 0) return 0; + return errno == EEXIST ? 0 : -errno; +} + + +static void +ensure_log_dir(void) { + (void)mkdir_if_needed(BFPILOT_DATA_ROOT); + (void)mkdir_if_needed(BFPILOT_DATA_DIR); +} + + +static void +installer_log(const char *fmt, ...) { + char body[1024]; + char line[1400]; + va_list ap; + + va_start(ap, fmt); + int body_n = vsnprintf(body, sizeof(body), fmt ? fmt : "", ap); + va_end(ap); + if(body_n < 0) { + snprintf(body, sizeof(body), "log format failed"); + } else if((size_t)body_n >= sizeof(body)) { + body[sizeof(body) - 1] = 0; + } + + int n = snprintf(line, sizeof(line), "%ld pid=%ld %s\n", + (long)time(NULL), (long)getpid(), body); + if(n < 0) return; + if((size_t)n >= sizeof(line)) n = (int)sizeof(line) - 1; + + fputs(line, stdout); + fflush(stdout); + + ensure_log_dir(); + int fd = open(BFPILOT_LAUNCHER_LOG, + O_WRONLY | O_CREAT | O_APPEND, 0600); + if(fd >= 0) { + (void)write(fd, line, (size_t)n); + close(fd); + } +} + + +static int +write_file(const char *path, const uint8_t *data, size_t size) { + int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if(fd < 0) return -errno; + + size_t done = 0; + while(done < size) { + ssize_t wr = write(fd, data + done, size - done); + if(wr < 0) { + int err = errno; + close(fd); + return -err; + } + done += (size_t)wr; + } + + if(close(fd) != 0) return -errno; + return 0; +} + + +static app_install_title_dir_fn +resolve_title_dir(void) { + uint32_t handle = 0; + installer_log("about to kernel_dynlib_handle %s", BFPILOT_APPINST_MODULE); + int handle_rc = kernel_dynlib_handle(-1, BFPILOT_APPINST_MODULE, &handle); + installer_log("kernel_dynlib_handle %s rc=0x%08x handle=0x%08x", + BFPILOT_APPINST_MODULE, handle_rc, handle); + if(handle_rc != 0) return NULL; + + installer_log("about to kernel_dynlib_resolve AppInstallTitleDir nid=%s", + BFPILOT_NID_INSTALL_TITLE_DIR); + app_install_title_dir_fn fn = + (app_install_title_dir_fn)kernel_dynlib_resolve( + -1, handle, BFPILOT_NID_INSTALL_TITLE_DIR); + installer_log("kernel_dynlib_resolve AppInstallTitleDir addr=%p", + (void *)fn); + return fn; +} + + +int +main(void) { + bfpilot_boot_marker("bfpilot-launcher-installer", BFPILOT_BUILD_MODE); + + char app_dir[256]; + char sce_sys_dir[256]; + char param_path[256]; + char icon_path[256]; + int title_dir_rc = BFPILOT_DIAG_SKIPPED; + int install_all_rc = BFPILOT_DIAG_SKIPPED; + int uninstall_rc = BFPILOT_DIAG_SKIPPED; + int final_rc = -1; + + installer_log("entered main direct-appinst tag=%s build=%s", + VERSION_TAG, BUILD_VERSION); + bfpilot_notify("BFpilot launcher installer", "direct AppInst installer"); + + installer_log("about to sceAppInstUtilInitialize"); + int appinst_init_rc = sceAppInstUtilInitialize(); + installer_log("AppInst init return code=0x%08x", appinst_init_rc); + if(appinst_init_rc != 0) { + installer_log("final result=failed_nonfatal final_rc=%d " + "appinst_init_rc=0x%08x", final_rc, appinst_init_rc); + bfpilot_notify("BFpilot launcher installer", "AppInst init failed"); + return 1; + } + + snprintf(app_dir, sizeof(app_dir), BFPILOT_APP_ROOT "/%s", + BFPILOT_APP_TITLE_ID); + snprintf(sce_sys_dir, sizeof(sce_sys_dir), "%s/sce_sys", app_dir); + snprintf(param_path, sizeof(param_path), "%s/param.json", sce_sys_dir); + snprintf(icon_path, sizeof(icon_path), "%s/icon0.png", sce_sys_dir); + + installer_log("about to sceAppInstUtilAppUnInstall %s", + BFPILOT_APP_TITLE_ID); + uninstall_rc = sceAppInstUtilAppUnInstall(BFPILOT_APP_TITLE_ID); + installer_log("uninstall return code=0x%08x", uninstall_rc); + + errno = 0; + int mkdir_app_rc = mkdir_if_needed(app_dir); + installer_log("%s mkdir return code=%d errno=%d", + app_dir, mkdir_app_rc, errno); + errno = 0; + int mkdir_sce_sys_rc = mkdir_if_needed(sce_sys_dir); + installer_log("%s mkdir return code=%d errno=%d", + sce_sys_dir, mkdir_sce_sys_rc, errno); + errno = 0; + int write_param_rc = write_file(param_path, bfpilot_param_json, + bfpilot_param_json_size); + installer_log("%s write return code=%d errno=%d", + param_path, write_param_rc, errno); + errno = 0; + int write_icon_rc = write_file(icon_path, bfpilot_icon0_png, + bfpilot_icon0_png_size); + installer_log("%s write return code=%d errno=%d", + icon_path, write_icon_rc, errno); + + app_install_title_dir_fn install_title_dir = resolve_title_dir(); + installer_log("AppInstallTitleDir resolved=%s nid=%s", + install_title_dir ? "yes" : "no", + BFPILOT_NID_INSTALL_TITLE_DIR); + + if(mkdir_app_rc == 0 && mkdir_sce_sys_rc == 0 && + write_param_rc == 0 && write_icon_rc == 0) { + if(install_title_dir) { + title_dir_rc = install_title_dir(BFPILOT_APP_TITLE_ID, + BFPILOT_APP_PARENT, NULL); + installer_log("AppInstallTitleDir return code=0x%08x", title_dir_rc); + } else { + installer_log("AppInstallTitleDir return code=skipped"); + } + + if(title_dir_rc != 0) { + installer_log("about to sceAppInstUtilAppInstallAll fallback"); + install_all_rc = sceAppInstUtilAppInstallAll(NULL); + installer_log("AppInstallAll fallback return code=0x%08x", + install_all_rc); + } else { + installer_log("AppInstallAll fallback return code=skipped"); + } + } else { + installer_log("AppInstallTitleDir return code=skipped"); + installer_log("AppInstallAll fallback return code=skipped"); + } + + if(title_dir_rc == 0 || install_all_rc == 0) { + final_rc = 0; + } + + installer_log("final result=%s final_rc=%d appinst_init_rc=0x%08x " + "uninstall_rc=0x%08x mkdir_app_rc=%d mkdir_sce_sys_rc=%d " + "write_param_rc=%d write_icon_rc=%d title_dir_rc=0x%08x " + "install_all_rc=0x%08x", + final_rc == 0 ? "installed" : "failed_nonfatal", final_rc, + appinst_init_rc, uninstall_rc, mkdir_app_rc, + mkdir_sce_sys_rc, write_param_rc, write_icon_rc, + title_dir_rc, install_all_rc); + + if(final_rc == 0) { + bfpilot_notify("BFpilot launcher installer", "installed or refreshed"); + return 0; + } + + bfpilot_notify("BFpilot launcher installer", "failed; see installer log"); + return 1; +} diff --git a/src/launcher_installer_main.c b/src/launcher_installer_main.c new file mode 100644 index 0000000..ac57fb6 --- /dev/null +++ b/src/launcher_installer_main.c @@ -0,0 +1,288 @@ +/* + * BFpilot - isolated optional launcher tile installer. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "boot_marker.h" +#include "notify.h" +#include "version.h" + +#define BFPILOT_APP_TITLE_ID "BFPL00001" +#define BFPILOT_APP_ROOT "/user/app" +#define BFPILOT_APP_PARENT BFPILOT_APP_ROOT "/" +#define BFPILOT_DATA_ROOT "/data" +#define BFPILOT_DATA_DIR "/data/BFpilot" +#define BFPILOT_LAUNCHER_LOG "/data/BFpilot/launcher-installer.log" +#define BFPILOT_APPINST_MODULE "libSceAppInstUtil.sprx" +#define BFPILOT_NID_INSTALL_TITLE_DIR "Wudg3Xe3heE" +#define BFPILOT_DIAG_SKIPPED (-2147483000) + +#define INCASSET(name, file) \ + __asm__(".section .rodata\n" \ + ".global " #name "\n" \ + ".global " #name "_end\n" \ + ".global " #name "_size\n" \ + ".align 16\n" #name ":\n" \ + ".incbin \"" file "\"\n" #name "_end:\n" #name "_size:\n" \ + ".quad " #name "_end - " #name "\n" \ + ".previous\n"); \ + extern const uint8_t name[]; \ + extern const size_t name##_size + +INCASSET(bfpilot_param_json, "assets-app/param.json"); +INCASSET(bfpilot_icon0_png, "assets-app/icon0.png"); + +typedef int (*appinst_init_fn)(void); +typedef int (*app_install_title_dir_fn)(const char *, const char *, void *); +typedef int (*app_install_all_fn)(void *); + + +static int +mkdir_if_needed(const char *path) { + if(mkdir(path, 0755) == 0) return 0; + return errno == EEXIST ? 0 : -errno; +} + + +static void +ensure_log_dir(void) { + (void)mkdir_if_needed(BFPILOT_DATA_ROOT); + (void)mkdir_if_needed(BFPILOT_DATA_DIR); +} + + +static void +installer_log(const char *fmt, ...) { + char body[1024]; + char line[1400]; + va_list ap; + + va_start(ap, fmt); + int body_n = vsnprintf(body, sizeof(body), fmt ? fmt : "", ap); + va_end(ap); + if(body_n < 0) { + snprintf(body, sizeof(body), "log format failed"); + } else if((size_t)body_n >= sizeof(body)) { + body[sizeof(body) - 1] = 0; + } + + int n = snprintf(line, sizeof(line), "%ld pid=%ld %s\n", + (long)time(NULL), (long)getpid(), body); + if(n < 0) return; + if((size_t)n >= sizeof(line)) n = (int)sizeof(line) - 1; + + fputs(line, stdout); + fflush(stdout); + + ensure_log_dir(); + int fd = open(BFPILOT_LAUNCHER_LOG, + O_WRONLY | O_CREAT | O_APPEND, 0600); + if(fd >= 0) { + (void)write(fd, line, (size_t)n); + close(fd); + } +} + + +static int +write_file(const char *path, const uint8_t *data, size_t size) { + int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if(fd < 0) return -errno; + + size_t done = 0; + while(done < size) { + ssize_t wr = write(fd, data + done, size - done); + if(wr < 0) { + int err = errno; + close(fd); + return -err; + } + done += (size_t)wr; + } + + if(close(fd) != 0) return -errno; + return 0; +} + + +int +main(void) { + bfpilot_boot_marker("bfpilot-launcher-installer", BFPILOT_BUILD_MODE); + + char app_dir[256]; + char sce_sys_dir[256]; + char param_path[256]; + char icon_path[256]; + uint32_t appinst_handle = 0; + appinst_init_fn appinst_init = NULL; + app_install_title_dir_fn install_title_dir = NULL; + app_install_all_fn install_all = NULL; + int appinst_handle_rc; + int title_dir_rc = BFPILOT_DIAG_SKIPPED; + int install_all_rc = BFPILOT_DIAG_SKIPPED; + int appinst_init_rc = BFPILOT_DIAG_SKIPPED; + int final_rc = -1; + const char *final_state = "unsupported"; + + installer_log("entered main tag=%s build=%s", VERSION_TAG, BUILD_VERSION); + + installer_log("about to kernel_dynlib_handle %s", BFPILOT_APPINST_MODULE); + appinst_handle_rc = kernel_dynlib_handle(-1, BFPILOT_APPINST_MODULE, + &appinst_handle); + installer_log("kernel_dynlib_handle %s rc=0x%08x handle=0x%08x", + BFPILOT_APPINST_MODULE, appinst_handle_rc, appinst_handle); + + if(appinst_handle_rc == 0) { + installer_log("about to kernel_dynlib_dlsym sceAppInstUtilInitialize"); + appinst_init = (appinst_init_fn)kernel_dynlib_dlsym( + -1, appinst_handle, "sceAppInstUtilInitialize"); + installer_log("kernel_dynlib_dlsym sceAppInstUtilInitialize addr=%p", + (void *)appinst_init); + + installer_log("about to kernel_dynlib_dlsym sceAppInstUtilAppInstallAll"); + install_all = (app_install_all_fn)kernel_dynlib_dlsym( + -1, appinst_handle, "sceAppInstUtilAppInstallAll"); + installer_log("kernel_dynlib_dlsym sceAppInstUtilAppInstallAll addr=%p", + (void *)install_all); + + installer_log("about to kernel_dynlib_resolve AppInstallTitleDir nid=%s", + BFPILOT_NID_INSTALL_TITLE_DIR); + install_title_dir = (app_install_title_dir_fn)kernel_dynlib_resolve( + -1, appinst_handle, BFPILOT_NID_INSTALL_TITLE_DIR); + installer_log("kernel_dynlib_resolve AppInstallTitleDir addr=%p", + (void *)install_title_dir); + + if(!install_title_dir) { + installer_log("about to kernel_dynlib_dlsym " + "sceAppInstUtilAppInstallTitleDir"); + install_title_dir = (app_install_title_dir_fn)kernel_dynlib_dlsym( + -1, appinst_handle, "sceAppInstUtilAppInstallTitleDir"); + installer_log("kernel_dynlib_dlsym sceAppInstUtilAppInstallTitleDir " + "addr=%p", (void *)install_title_dir); + } + } else { + installer_log("AppInstUtil unavailable without direct import; skipping " + "launcher install safely"); + } + + if(appinst_init) { + appinst_init_rc = appinst_init(); + } + installer_log("AppInst init return code=0x%08x", appinst_init_rc); + + int appinst_symbols_available = + appinst_handle_rc == 0 && appinst_init && (install_title_dir || install_all); + int can_stage_launcher = appinst_symbols_available && appinst_init_rc == 0; + + snprintf(app_dir, sizeof(app_dir), BFPILOT_APP_ROOT "/%s", + BFPILOT_APP_TITLE_ID); + snprintf(sce_sys_dir, sizeof(sce_sys_dir), "%s/sce_sys", app_dir); + snprintf(param_path, sizeof(param_path), "%s/param.json", sce_sys_dir); + snprintf(icon_path, sizeof(icon_path), "%s/icon0.png", sce_sys_dir); + + int mkdir_app_rc = BFPILOT_DIAG_SKIPPED; + int mkdir_sce_sys_rc = BFPILOT_DIAG_SKIPPED; + int write_param_rc = BFPILOT_DIAG_SKIPPED; + int write_icon_rc = BFPILOT_DIAG_SKIPPED; + + if(can_stage_launcher) { + errno = 0; + mkdir_app_rc = mkdir_if_needed(app_dir); + installer_log("%s mkdir return code=%d errno=%d", + app_dir, mkdir_app_rc, errno); + errno = 0; + mkdir_sce_sys_rc = mkdir_if_needed(sce_sys_dir); + installer_log("%s mkdir return code=%d errno=%d", + sce_sys_dir, mkdir_sce_sys_rc, errno); + errno = 0; + write_param_rc = write_file(param_path, bfpilot_param_json, + bfpilot_param_json_size); + installer_log("%s write return code=%d errno=%d", + param_path, write_param_rc, errno); + errno = 0; + write_icon_rc = write_file(icon_path, bfpilot_icon0_png, + bfpilot_icon0_png_size); + installer_log("%s write return code=%d errno=%d", + icon_path, write_icon_rc, errno); + } else { + const char *reason = !appinst_symbols_available ? + "AppInstUtil not safely available" : "AppInst init failed"; + installer_log("launcher staging skipped: %s", reason); + installer_log("%s mkdir return code=skipped", app_dir); + installer_log("%s mkdir return code=skipped", sce_sys_dir); + installer_log("%s write return code=skipped", param_path); + installer_log("%s write return code=skipped", icon_path); + } + + installer_log("AppInstallTitleDir resolved=%s nid=%s", + install_title_dir ? "yes" : "no", + BFPILOT_NID_INSTALL_TITLE_DIR); + + if(can_stage_launcher && mkdir_app_rc == 0 && mkdir_sce_sys_rc == 0 && + write_param_rc == 0 && write_icon_rc == 0) { + if(install_title_dir) { + title_dir_rc = install_title_dir(BFPILOT_APP_TITLE_ID, + BFPILOT_APP_PARENT, NULL); + installer_log("AppInstallTitleDir return code=0x%08x", title_dir_rc); + } else { + installer_log("AppInstallTitleDir return code=skipped"); + } + + if(title_dir_rc != 0) { + if(install_all) { + install_all_rc = install_all(NULL); + installer_log("AppInstallAll fallback return code=0x%08x", + install_all_rc); + } else { + installer_log("AppInstallAll fallback return code=skipped"); + } + } else { + installer_log("AppInstallAll fallback return code=skipped"); + } + } else { + installer_log("AppInstallTitleDir return code=skipped"); + installer_log("AppInstallAll fallback return code=skipped"); + } + + if(title_dir_rc == 0 || install_all_rc == 0) { + final_rc = 0; + final_state = "installed"; + } else if(appinst_symbols_available) { + final_state = "failed_nonfatal"; + } + + installer_log("final result=%s final_rc=%d appinst_init_rc=0x%08x " + "mkdir_app_rc=%d mkdir_sce_sys_rc=%d write_param_rc=%d " + "write_icon_rc=%d title_dir_rc=0x%08x install_all_rc=0x%08x", + final_state, final_rc, + appinst_init_rc, mkdir_app_rc, mkdir_sce_sys_rc, + write_param_rc, write_icon_rc, title_dir_rc, install_all_rc); + + if(final_rc == 0) { + bfpilot_notify("BFpilot launcher installer", "installed or refreshed"); + return 0; + } + + if(appinst_symbols_available) { + bfpilot_notify("BFpilot launcher installer", + "failed; file manager unaffected"); + return 1; + } + + bfpilot_notify("BFpilot launcher installer", + "unsupported on this loader; use web UI"); + return 2; +} diff --git a/src/lite_main.c b/src/lite_main.c index a939a3b..7d14fd4 100644 --- a/src/lite_main.c +++ b/src/lite_main.c @@ -6,7 +6,6 @@ */ #include -#include #include #include #include @@ -22,6 +21,7 @@ #include #include +#include "boot_marker.h" #include "diag.h" #include "notify.h" #include "version.h" @@ -32,9 +32,20 @@ #include "sce_resolve.h" #endif -#define BFPILOT_WEB_PORT 5905 #define BFPILOT_RELOAD_TOKEN "bs5fm-local-reload" +#ifndef BFPILOT_WEB_PORT +#define BFPILOT_WEB_PORT 5905 +#endif + +#ifndef BFPILOT_PAYLOAD_NAME +#define BFPILOT_PAYLOAD_NAME "bfpilot" +#endif + +#ifndef BFPILOT_DEBUG_NOTIFICATIONS +#define BFPILOT_DEBUG_NOTIFICATIONS 0 +#endif + #if BFPILOT_ENABLE_LAUNCHER typedef int (*sce_netctl_init_fn)(void); typedef int (*sce_user_service_initialize_fn)(void *); @@ -43,7 +54,6 @@ typedef int (*sce_user_service_initialize_fn)(void *); #define BFPILOT_USER_SERVICE_MODULE "libSceUserService.sprx" #endif - static void detect_lan_ip(char *out, size_t out_size) { struct ifaddrs *ifaddr = NULL; @@ -71,11 +81,50 @@ detect_lan_ip(char *out, size_t out_size) { typedef struct ready_state { char ip[64]; int notified; - int launcher_disabled; - int launcher_started; + unsigned short port; } ready_state_t; +static void +debug_notify(const char *title, const char *message) { +#if BFPILOT_DEBUG_NOTIFICATIONS + bfpilot_notify(title, message); +#else + (void)title; + (void)message; +#endif +} + + +static unsigned short +parse_port_value(const char *value, unsigned short fallback) { + if(!value || !value[0]) return fallback; + char *end = NULL; + long port = strtol(value, &end, 10); + if(!end || *end != 0 || port < 1 || port > 65535) { + return fallback; + } + return (unsigned short)port; +} + + +static unsigned short +runtime_port_requested(int argc, char **argv) { + unsigned short port = BFPILOT_WEB_PORT; + + for(int i = 1; i < argc; i++) { + if(!argv || !argv[i]) continue; + if(!strcmp(argv[i], "--port") && i + 1 < argc) { + port = parse_port_value(argv[++i], port); + } else if(!strncmp(argv[i], "--port=", 7)) { + port = parse_port_value(argv[i] + 7, port); + } + } + + return port; +} + + #if BFPILOT_ENABLE_LAUNCHER static void init_ps5_services(void) { @@ -116,71 +165,6 @@ init_ps5_services(void) { #endif -#if BFPILOT_ENABLE_LAUNCHER -typedef struct launcher_thread_arg { - char ip[64]; -} launcher_thread_arg_t; - - -static void * -launcher_thread(void *arg) { - launcher_thread_arg_t *state = arg; - char fallback[128]; - - snprintf(fallback, sizeof(fallback), "Use http://%s:%u/", - state && state->ip[0] ? state->ip : "", - (unsigned int)BFPILOT_WEB_PORT); - - bfpilot_checkpoint("launcher started"); - bfpilot_diag_set_launcher_status("started", 0); - bfpilot_log("launcher started after web server"); - init_ps5_services(); - - int app_install_status = bfpilot_install_app_if_needed(); - if(app_install_status >= 0) { - bfpilot_diag_set_launcher_status("ready", app_install_status); - bfpilot_log("launcher ready rc=%d", app_install_status); - puts(" ps5 app: ready"); - } else { - bfpilot_diag_set_launcher_status("failed_nonfatal", app_install_status); - bfpilot_log("launcher skipped rc=%d, web server remains available", - app_install_status); - bfpilot_notify("BFpilot launcher skipped", fallback); - puts(" ps5 app: launcher skipped, web server remains available"); - } - - free(state); - return NULL; -} - - -static void -start_launcher_thread(const char *ip) { - launcher_thread_arg_t *state = calloc(1, sizeof(*state)); - if(!state) { - bfpilot_diag_set_launcher_status("failed_nonfatal", -ENOMEM); - bfpilot_log("launcher skipped: failed allocating thread state"); - bfpilot_notify("BFpilot launcher skipped", "Use http://:5905/"); - return; - } - snprintf(state->ip, sizeof(state->ip), "%s", ip ? ip : ""); - - pthread_t thread; - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - int rc = pthread_create(&thread, &attr, launcher_thread, state); - pthread_attr_destroy(&attr); - if(rc != 0) { - bfpilot_diag_set_launcher_status("failed_nonfatal", -rc); - bfpilot_log("launcher skipped: pthread_create rc=%d", rc); - bfpilot_notify("BFpilot launcher skipped", "Use http://:5905/"); - free(state); - } -} -#endif - - static int launcher_disabled_requested(int argc, char **argv) { #if !BFPILOT_ENABLE_LAUNCHER @@ -195,11 +179,9 @@ launcher_disabled_requested(int argc, char **argv) { !strcasecmp(env_value, "yes") || !strcasecmp(env_value, "on")); - if(env_enabled) { - return 1; - } + if(env_enabled) return 1; for(int i = 1; i < argc; i++) { - if(argv[i] && !strcmp(argv[i], "--no-launcher")) { + if(argv && argv[i] && !strcmp(argv[i], "--no-launcher")) { return 1; } } @@ -209,7 +191,8 @@ launcher_disabled_requested(int argc, char **argv) { static int -local_http_get(const char *path, char *out, size_t out_size) { +local_http_get(unsigned short port, const char *path, char *out, + size_t out_size) { if(out_size == 0) return -1; out[0] = 0; @@ -225,7 +208,7 @@ local_http_get(const char *path, char *out, size_t out_size) { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; - addr.sin_port = htons(BFPILOT_WEB_PORT); + addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); if(connect(fd, (struct sockaddr *)&addr, sizeof(addr)) != 0) { @@ -239,7 +222,7 @@ local_http_get(const char *path, char *out, size_t out_size) { "Host: 127.0.0.1:%u\r\n" "Connection: close\r\n" "\r\n", - path, (unsigned int)BFPILOT_WEB_PORT); + path, (unsigned int)port); if(n < 0 || (size_t)n >= sizeof(request) || websrv_write_all(fd, request, (size_t)n) != 0) { close(fd); @@ -280,9 +263,10 @@ json_long_field(const char *json, const char *field) { static int -old_server_busy(void) { +old_server_busy(unsigned short port) { char response[2048]; - if(local_http_get("/api/fs/job/status", response, sizeof(response)) != 0) { + if(local_http_get(port, "/api/fs/job/status", response, + sizeof(response)) != 0) { return 0; } return strstr(response, "\"busy\":true") != NULL; @@ -290,10 +274,10 @@ old_server_busy(void) { static int -wait_for_old_server_down(void) { +wait_for_old_server_down(unsigned short port) { char response[512]; for(int i = 0; i < 30; i++) { - if(local_http_get("/api/status", response, sizeof(response)) != 0) { + if(local_http_get(port, "/api/status", response, sizeof(response)) != 0) { return 1; } usleep(100000); @@ -303,46 +287,52 @@ wait_for_old_server_down(void) { static int -handoff_existing_server(void) { +handoff_existing_server(unsigned short port) { char response[2048]; - if(local_http_get("/api/status", response, sizeof(response)) != 0) { + if(local_http_get(port, "/api/status", response, sizeof(response)) != 0) { return 0; } if(!strstr(response, "\"name\":\"BFpilot\"") && !strstr(response, "\"name\":\"BS5FileManager\"")) { bfpilot_log("handoff: port %u belongs to a different service; leaving it " - "running", (unsigned int)BFPILOT_WEB_PORT); - bfpilot_notify("BFpilot reload skipped", - "Port 5905 is used by another service"); + "running", (unsigned int)port); + bfpilot_notify("BFpilot reload blocked", + "Port is used by another service"); return -1; } long old_pid = json_long_field(response, "pid"); - bfpilot_log("handoff: existing BFpilot-compatible server pid=%ld", old_pid); + bfpilot_log("handoff: existing BFpilot-compatible server pid=%ld port=%u", + old_pid, (unsigned int)port); + bfpilot_notify("BFpilot reload: old server detected", + old_pid >= 0 ? "Attempting clean shutdown" : + "Attempting clean shutdown; old pid unknown"); if(old_pid == (long)getpid()) { return 0; } - if(old_server_busy()) { - bfpilot_notify("BFpilot reload skipped", + if(old_server_busy(port)) { + bfpilot_notify("BFpilot reload blocked", "Old file operation is still running"); + bfpilot_log("handoff: blocked because old file job is busy"); return -1; } snprintf(response, sizeof(response), "/api/control/shutdown?token=%s", BFPILOT_RELOAD_TOKEN); char shutdown_response[512]; - if(local_http_get(response, shutdown_response, + if(local_http_get(port, response, shutdown_response, sizeof(shutdown_response)) == 0 && strstr(shutdown_response, "200 OK") && strstr(shutdown_response, "\"ok\":true") && - wait_for_old_server_down()) { + wait_for_old_server_down(port)) { bfpilot_notify("BFpilot reloaded", "Old listener stopped cleanly"); + bfpilot_log("handoff: old listener stopped cleanly"); return 1; } - bfpilot_notify("BFpilot reload failed", - "Could not stop old listener on port 5905"); + bfpilot_notify("BFpilot reload blocked", + "Old listener did not stop cleanly"); bfpilot_log("handoff: old listener did not accept clean shutdown; not " "sending signals"); return -1; @@ -365,17 +355,13 @@ on_web_ready(unsigned short port, void *arg) { state->notified = 1; } -#if BFPILOT_ENABLE_LAUNCHER - if(!state->launcher_disabled && !state->launcher_started) { - state->launcher_started = 1; - start_launcher_thread(state->ip); - } -#endif + debug_notify("BFpilot debug", "web server ready"); } int main(int argc, char **argv) { + bfpilot_boot_marker(BFPILOT_PAYLOAD_NAME, BFPILOT_BUILD_MODE); bfpilot_diag_init(); bfpilot_diag_install_signal_handlers(); bfpilot_checkpoint("process start"); @@ -396,9 +382,11 @@ main(int argc, char **argv) { ready_state_t ready; memset(&ready, 0, sizeof(ready)); detect_lan_ip(ready.ip, sizeof(ready.ip)); + ready.port = runtime_port_requested(argc, argv); + websrv_set_runtime_port(ready.port); int launcher_disabled = launcher_disabled_requested(argc, argv); - ready.launcher_disabled = launcher_disabled; websrv_set_runtime_diag(launcher_disabled); + bfpilot_log("runtime web_port=%u", (unsigned int)ready.port); bfpilot_log("runtime launcher_disabled=%d", launcher_disabled); puts(".----------------------------------------------."); @@ -409,27 +397,47 @@ main(int argc, char **argv) { puts(" active: standalone web file manager"); printf(" mode: %s\n", BFPILOT_BUILD_MODE); puts(" scope: browse, upload, download, copy, move, delete, rename, mkdir"); - if(launcher_disabled) { + if(BFPILOT_ENABLE_LAUNCHER && !launcher_disabled) { + puts(" ps5 app: BFpilot opens http://127.0.0.1:5905/"); + } else if(BFPILOT_ENABLE_LAUNCHER) { puts(" ps5 app: launcher disabled"); } else { - puts(" ps5 app: BFpilot opens http://127.0.0.1:5905/"); + puts(" ps5 app: launcher installer is a separate optional payload"); } - printf(" web ui: http://%s:%u/\n", ready.ip, (unsigned int)BFPILOT_WEB_PORT); + printf(" web ui: http://%s:%u/\n", ready.ip, (unsigned int)ready.port); puts(" inject/deploy port: 9021"); puts(""); signal(SIGPIPE, SIG_IGN); signal(SIGCHLD, SIG_IGN); +#if BFPILOT_DEBUG_NOTIFICATIONS || BFPILOT_ENABLE_LAUNCHER int notification_rc = bfpilot_notify_test(); bfpilot_diag_set_notification_rc(notification_rc); bfpilot_log("notification test rc=0x%08x", notification_rc); +#else + bfpilot_diag_set_notification_rc(BFPILOT_DIAG_SKIPPED); + bfpilot_log("notification test rc=skipped"); +#endif #if BFPILOT_ENABLE_LAUNCHER if(!launcher_disabled) { - bfpilot_diag_set_launcher_status("deferred", BFPILOT_DIAG_SKIPPED); - bfpilot_log("launcher deferred until web server is listening"); - puts(" ps5 app: launcher will run after web server starts"); + bfpilot_checkpoint("launcher started"); + bfpilot_diag_set_launcher_status("started", 0); + bfpilot_log("launcher started"); + init_ps5_services(); + + int app_install_status = bfpilot_install_app_if_needed(); + if(app_install_status >= 0) { + bfpilot_diag_set_launcher_status("ready", app_install_status); + bfpilot_log("launcher ready rc=%d", app_install_status); + puts(" ps5 app: ready"); + } else { + bfpilot_diag_set_launcher_status("failed", app_install_status); + bfpilot_log("launcher failed rc=%d, continuing web server", + app_install_status); + puts(" ps5 app: install failed, continuing web server"); + } } else { bfpilot_diag_set_service_rcs(BFPILOT_DIAG_SKIPPED, BFPILOT_DIAG_SKIPPED); bfpilot_diag_set_launcher_status("skipped", BFPILOT_DIAG_SKIPPED); @@ -440,15 +448,15 @@ main(int argc, char **argv) { } #else bfpilot_diag_set_service_rcs(BFPILOT_DIAG_SKIPPED, BFPILOT_DIAG_SKIPPED); - bfpilot_diag_set_launcher_status("not_compiled", BFPILOT_DIAG_SKIPPED); + bfpilot_diag_set_launcher_status("separate_payload", BFPILOT_DIAG_SKIPPED); bfpilot_log("sceNetCtlInit rc=skipped"); bfpilot_log("sceUserServiceInitialize rc=skipped"); - bfpilot_log("launcher skipped: not compiled"); - puts(" ps5 app: not compiled in core mode"); + bfpilot_log("launcher skipped: separate payload"); #endif bfpilot_checkpoint("handoff check"); - int handoff_status = handoff_existing_server(); + debug_notify("BFpilot debug", "handoff check"); + int handoff_status = handoff_existing_server(ready.port); bfpilot_log("handoff_existing_server rc=%d", handoff_status); if(handoff_status < 0) { bfpilot_checkpoint("handoff blocked"); @@ -458,7 +466,7 @@ main(int argc, char **argv) { while(1) { bfpilot_checkpoint("web listen starting"); - int rc = websrv_listen(BFPILOT_WEB_PORT, on_web_ready, &ready); + int rc = websrv_listen(ready.port, on_web_ready, &ready); bfpilot_log("websrv_listen returned rc=%d", rc); if(websrv_exit_requested()) { bfpilot_checkpoint("web shutdown requested"); @@ -468,7 +476,7 @@ main(int argc, char **argv) { if(!ready.notified) { char msg[128]; snprintf(msg, sizeof(msg), "port %u error %d, retrying", - (unsigned int)BFPILOT_WEB_PORT, -rc); + (unsigned int)ready.port, -rc); bfpilot_notify("BFpilot could not start", msg); ready.notified = 1; } diff --git a/src/transfer.c b/src/transfer.c index 873bd2f..4194f6c 100644 --- a/src/transfer.c +++ b/src/transfer.c @@ -19,11 +19,12 @@ #include #include +#include "diag.h" #include "transfer.h" #include "websrv.h" -#define COPY_BUF_SIZE (1024 * 1024) +#define COPY_BUF_SIZE (256 * 1024) #define UPLOAD_BUF_SIZE (256 * 1024) @@ -259,6 +260,8 @@ job_end(int rc, const char *err) { snprintf(g_job.error, sizeof(g_job.error), "%s", err); } pthread_mutex_unlock(&g_job.lock); + bfpilot_log("transfer job end verb=%s rc=%d error=%s", + g_job.verb, rc, err ? err : ""); atomic_store(&g_job.busy, 0); } @@ -301,7 +304,7 @@ copy_file(const char *src, const char *dst) { job_set_error("open(%s): %s", src, strerror(errno)); return -1; } - int out = open(dst, O_WRONLY | O_CREAT | O_TRUNC, 0777); + int out = open(dst, O_WRONLY | O_CREAT | O_EXCL, 0777); if(out < 0) { job_set_error("open(%s): %s", dst, strerror(errno)); close(in); @@ -356,7 +359,14 @@ copy_file(const char *src, const char *dst) { free(buf); close(in); - close(out); + if(rc == 0 && fsync(out) != 0 && errno != EINVAL) { + job_set_error("sync(%s): %s", dst, strerror(errno)); + rc = -1; + } + if(close(out) != 0 && rc == 0) { + job_set_error("close(%s): %s", dst, strerror(errno)); + rc = -1; + } if(rc != 0) unlink(dst); return rc; } @@ -452,6 +462,41 @@ delete_recursive(const char *path, int count_progress) { } +static int +delete_recursive_force(const char *path) { + struct stat st; + if(lstat(path, &st) != 0) { + return errno == ENOENT ? 0 : -1; + } + + if(S_ISDIR(st.st_mode)) { + DIR *d = opendir(path); + if(!d) return -1; + int rc = 0; + struct dirent *ent; + while((ent = readdir(d))) { + if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; + char child[1024]; + if(strlen(path) + strlen(ent->d_name) + 2 >= sizeof(child)) { + errno = ENAMETOOLONG; + rc = -1; + break; + } + join_path(child, sizeof(child), path, ent->d_name); + if(delete_recursive_force(child) != 0) { + rc = -1; + break; + } + } + closedir(d); + if(rc != 0) return -1; + return rmdir(path); + } + + return unlink(path); +} + + struct copy_arg { char src[1024]; char dst[1024]; @@ -463,9 +508,12 @@ static void * copy_worker(void *arg) { struct copy_arg *a = arg; long files = 0, bytes = 0; - struct stat src_st, dst_st; + struct stat src_st, dst_st, final_st; char final_dst[1024]; + char staging_dst[1024]; + bfpilot_log("transfer worker start verb=%s src=%s dst=%s", + a->is_move ? "move" : "copy", a->src, a->dst); if(lstat(a->src, &src_st) != 0) { job_end(-1, "source not found"); free(a); @@ -513,6 +561,27 @@ copy_worker(void *arg) { } join_path(final_dst, sizeof(final_dst), a->dst, base); + if(lstat(final_dst, &final_st) == 0) { + job_end(-1, "destination already exists"); + free(a); + return NULL; + } + if(errno != ENOENT) { + char err[160]; + snprintf(err, sizeof(err), "destination: %s", strerror(errno)); + job_end(-1, err); + free(a); + return NULL; + } + + int n = snprintf(staging_dst, sizeof(staging_dst), "%s.bfpilot-part-%ld-%ld", + final_dst, (long)getpid(), (long)time(NULL)); + if(n < 0 || (size_t)n >= sizeof(staging_dst)) { + job_end(-1, "staging path too long"); + free(a); + return NULL; + } + if(!strcmp(a->src, final_dst)) { job_end(-1, "source and destination are the same"); free(a); @@ -546,22 +615,36 @@ copy_worker(void *arg) { free(a); return NULL; } + bfpilot_log("transfer move cross-device fallback src=%s staging=%s final=%s", + a->src, staging_dst, final_dst); } - int rc = copy_recursive(a->src, final_dst); + int rc = copy_recursive(a->src, staging_dst); if(rc != 0) { char err[160]; snprintf(err, sizeof(err), "copy: %s", job_cancelled() ? "cancelled" : strerror(errno)); + (void)delete_recursive_force(staging_dst); job_end(-1, err); free(a); return NULL; } if(job_cancelled()) { + (void)delete_recursive_force(staging_dst); job_end(-1, "cancelled"); free(a); return NULL; } + job_set_current("Finalizing destination"); + if(rename(staging_dst, final_dst) != 0) { + char err[160]; + snprintf(err, sizeof(err), "finalize: %s", strerror(errno)); + (void)delete_recursive_force(staging_dst); + job_end(-1, err); + free(a); + return NULL; + } + bfpilot_log("transfer finalized staging=%s final=%s", staging_dst, final_dst); if(a->is_move && delete_recursive(a->src, 0) != 0) { char err[160]; snprintf(err, sizeof(err), "post-move cleanup: %s", @@ -570,6 +653,9 @@ copy_worker(void *arg) { free(a); return NULL; } + if(a->is_move) { + bfpilot_log("transfer source cleanup complete src=%s", a->src); + } job_end(0, NULL); free(a); @@ -847,6 +933,8 @@ spawn_copy_or_move(const http_request_t *req, int is_move) { if(!job_begin(is_move ? "move" : "copy")) { return serve_error(req, 409, "another file-manager job is already running"); } + bfpilot_log("transfer job begin verb=%s src=%s dst=%s", + is_move ? "move" : "copy", src, dst); struct copy_arg *a = calloc(1, sizeof(*a)); if(!a) { diff --git a/src/version.h b/src/version.h index 038aa1d..c2de8ab 100644 --- a/src/version.h +++ b/src/version.h @@ -17,11 +17,11 @@ #endif #ifndef BFPILOT_ENABLE_LAUNCHER -#define BFPILOT_ENABLE_LAUNCHER 1 +#define BFPILOT_ENABLE_LAUNCHER 0 #endif #ifndef BFPILOT_DISABLE_LAUNCHER -#define BFPILOT_DISABLE_LAUNCHER 0 +#define BFPILOT_DISABLE_LAUNCHER 1 #endif #if BFPILOT_DISABLE_LAUNCHER @@ -30,5 +30,5 @@ #endif #ifndef BFPILOT_BUILD_MODE -#define BFPILOT_BUILD_MODE "full" +#define BFPILOT_BUILD_MODE "file-manager" #endif diff --git a/src/websrv.h b/src/websrv.h index c702e64..9b8ab3c 100644 --- a/src/websrv.h +++ b/src/websrv.h @@ -57,6 +57,8 @@ void websrv_set_runtime_diag(int launcher_disabled); void websrv_set_launcher_diag(const bfpilot_launcher_diag_t *diag); +void websrv_set_runtime_port(unsigned short port); + void websrv_request_exit(void); int websrv_exit_requested(void); diff --git a/src/websrv_lite.c b/src/websrv_lite.c index ede22f3..751918c 100644 --- a/src/websrv_lite.c +++ b/src/websrv_lite.c @@ -28,10 +28,15 @@ #define HEADER_MAX 65536 #define CONTROL_TOKEN "bs5fm-local-reload" +#ifndef BFPILOT_WEB_PORT +#define BFPILOT_WEB_PORT 5905 +#endif + static int g_websrv_srvfd = -1; static pthread_mutex_t g_websrv_lock = PTHREAD_MUTEX_INITIALIZER; static volatile sig_atomic_t g_websrv_exit_requested = 0; +static unsigned short g_websrv_port = BFPILOT_WEB_PORT; static int g_launcher_runtime_disabled = 0; static bfpilot_launcher_diag_t g_launcher_diag = { .launcher_enabled = 0, @@ -76,6 +81,14 @@ websrv_set_launcher_diag(const bfpilot_launcher_diag_t *diag) { } +void +websrv_set_runtime_port(unsigned short port) { + if(port != 0) { + g_websrv_port = port; + } +} + + static const char * status_text(int status) { switch(status) { @@ -338,11 +351,12 @@ status_request(const http_request_t *req) { "\"services\":[\"web\",\"file-manager\"]," "\"launcherCompiled\":%s," "\"launcherDisabled\":%s," - "\"port\":5905}", + "\"port\":%u}", VERSION_TAG, BUILD_VERSION, BFPILOT_BUILD_MODE, (long)getpid(), (long)now, BFPILOT_ENABLE_LAUNCHER ? "true" : "false", - g_launcher_runtime_disabled ? "true" : "false"); + g_launcher_runtime_disabled ? "true" : "false", + (unsigned int)g_websrv_port); if(n < 0) return -1; if((size_t)n >= sizeof(body)) n = (int)sizeof(body) - 1; return websrv_send(req->fd, 200, "application/json", body, (size_t)n); @@ -388,7 +402,7 @@ diag_request(const http_request_t *req) { "\"pid\":%ld," "\"now\":%ld," "\"uptime\":%ld," - "\"port\":5905," + "\"port\":%u," "\"cwd\":\"%s\"," "\"can_stat_root\":%s," "\"can_opendir_data\":%s," @@ -413,6 +427,8 @@ diag_request(const http_request_t *req) { "\"sceNetCtlInit\":%d," "\"sceUserServiceInitialize\":%d," "\"notification_test\":%d," + "\"bind_port\":%u," + "\"listen_port\":%u," "\"bind_5905\":%d," "\"listen_5905\":%d}," "\"launcher\":{" @@ -439,6 +455,7 @@ diag_request(const http_request_t *req) { VERSION_TAG, BUILD_VERSION, BFPILOT_BUILD_MODE, (long)getpid(), (long)now, bfpilot_diag_uptime(), + (unsigned int)g_websrv_port, cwd_json, json_bool(can_stat_root), json_bool(can_opendir_data), @@ -462,6 +479,8 @@ diag_request(const http_request_t *req) { bfpilot_diag_netctl_rc(), bfpilot_diag_user_service_rc(), bfpilot_diag_notification_rc(), + (unsigned int)g_websrv_port, + (unsigned int)g_websrv_port, bfpilot_diag_bind_rc(), bfpilot_diag_listen_rc(), launcher_status_json, @@ -622,6 +641,8 @@ websrv_listen(unsigned short port, websrv_ready_cb_t ready_cb, struct sockaddr_in server_addr; int srvfd; + websrv_set_runtime_port(port); + signal(SIGPIPE, SIG_IGN); srvfd = socket(AF_INET, SOCK_STREAM, 0); diff --git a/test-builds/v0.2.1/README.md b/test-builds/v0.2.1/README.md deleted file mode 100644 index 03fd3f3..0000000 --- a/test-builds/v0.2.1/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# BFpilot v0.2.1 Test Build - -This is a firmware-compatibility test build, not the latest stable release. - -Recommended order: - -1. Test `bfpilot-core.elf` first on every firmware/loader. -2. Only test `bfpilot-full.elf` after core mode starts and the file manager works. -3. Treat launcher install failure in full mode as non-fatal if the web server still works. - -Test URL: - -```text -http://:5905/ -``` - -Diagnostics: - -```text -http://:5905/api/status -http://:5905/api/diag -/data/BFpilot/log.txt -/data/BFpilot/crash.log -``` - -See `docs/FIRMWARE_TESTING.md` for the full firmware test protocol. diff --git a/test-builds/v0.2.1/bfpilot-core.elf b/test-builds/v0.2.1/bfpilot-core.elf deleted file mode 100644 index d93eb2584c8f16d2b21f35af095bfb22ede087b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177968 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 MUxIt0IqbLp3stwS=Kufz diff --git a/test-builds/v0.2.1/bfpilot-full.elf b/test-builds/v0.2.1/bfpilot-full.elf deleted file mode 100644 index c4f2803c89f0040a3bf3d3ea874a160d711aaccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341888 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ⅇDsKHJ_LbkdC(tAEygwDh69 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 diff --git a/tests/hello_boot.c b/tests/hello_boot.c new file mode 100644 index 0000000..6b5cd9b --- /dev/null +++ b/tests/hello_boot.c @@ -0,0 +1,17 @@ +/* + * BFpilot test payload - boot marker only. + */ + +#include + +#include "boot_marker.h" +#include "notify.h" + + +int +main(void) { + bfpilot_boot_marker("tests/hello_boot", BFPILOT_BUILD_MODE); + sleep(10); + bfpilot_notify("BFpilot BOOT still alive", "tests/hello_boot"); + return 0; +} diff --git a/tests/hello_http.c b/tests/hello_http.c new file mode 100644 index 0000000..dab0d7b --- /dev/null +++ b/tests/hello_http.c @@ -0,0 +1,126 @@ +/* + * BFpilot test payload - tiny HTTP status server. + */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "boot_marker.h" + +#ifndef BFPILOT_HELLO_HTTP_PORT +#define BFPILOT_HELLO_HTTP_PORT 5906 +#endif + + +static int +write_all(int fd, const void *data, size_t size) { + const char *p = data; + while(size > 0) { + ssize_t wr = send(fd, p, size, 0); + if(wr < 0) { + if(errno == EINTR) continue; + return -1; + } + if(wr == 0) return -1; + p += wr; + size -= (size_t)wr; + } + return 0; +} + + +static void +serve_client(int fd) { + char req[512]; + ssize_t n = recv(fd, req, sizeof(req) - 1, 0); + if(n < 0) { + close(fd); + return; + } + req[n > 0 ? n : 0] = 0; + + const char body[] = + "{\"ok\":true,\"name\":\"BFpilot hello_http\",\"port\":5906}"; + const char not_found[] = "{\"ok\":false,\"error\":\"not found\"}"; + char header[256]; + + if(strstr(req, "GET /api/status ") || strstr(req, "GET /api/status?")) { + int h = snprintf(header, sizeof(header), + "HTTP/1.1 200 OK\r\n" + "Connection: close\r\n" + "Content-Type: application/json\r\n" + "Content-Length: %lu\r\n\r\n", + (unsigned long)(sizeof(body) - 1)); + (void)write_all(fd, header, (size_t)h); + (void)write_all(fd, body, sizeof(body) - 1); + } else { + int h = snprintf(header, sizeof(header), + "HTTP/1.1 404 Not Found\r\n" + "Connection: close\r\n" + "Content-Type: application/json\r\n" + "Content-Length: %lu\r\n\r\n", + (unsigned long)(sizeof(not_found) - 1)); + (void)write_all(fd, header, (size_t)h); + (void)write_all(fd, not_found, sizeof(not_found) - 1); + } + + shutdown(fd, SHUT_RDWR); + close(fd); +} + + +int +main(void) { + bfpilot_boot_marker("tests/hello_http", BFPILOT_BUILD_MODE); + signal(SIGPIPE, SIG_IGN); + + int srv = socket(AF_INET, SOCK_STREAM, 0); + if(srv < 0) { + printf("BFpilot hello_http socket failed errno=%d\n", errno); + return 1; + } + + int on = 1; + setsockopt(srv, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + + struct sockaddr_in addr; + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(BFPILOT_HELLO_HTTP_PORT); + + if(bind(srv, (struct sockaddr *)&addr, sizeof(addr)) != 0) { + printf("BFpilot hello_http bind failed errno=%d\n", errno); + close(srv); + return 1; + } + + if(listen(srv, 4) != 0) { + printf("BFpilot hello_http listen failed errno=%d\n", errno); + close(srv); + return 1; + } + + printf("BFpilot hello_http listening on port %u\n", + (unsigned int)BFPILOT_HELLO_HTTP_PORT); + + for(;;) { + int fd = accept(srv, NULL, NULL); + if(fd < 0) { + if(errno == EINTR) continue; + printf("BFpilot hello_http accept failed errno=%d\n", errno); + break; + } + serve_client(fd); + } + + close(srv); + return 0; +} diff --git a/tests/hello_notify.c b/tests/hello_notify.c new file mode 100644 index 0000000..c0de9c7 --- /dev/null +++ b/tests/hello_notify.c @@ -0,0 +1,18 @@ +/* + * BFpilot test payload - notification probe. + */ + +#include + +#include "boot_marker.h" +#include "notify.h" + + +int +main(void) { + bfpilot_boot_marker("tests/hello_notify", BFPILOT_BUILD_MODE); + int rc = bfpilot_notify_send("BFpilot hello_notify", + "notification probe"); + printf("BFpilot hello_notify notification rc=0x%08x\n", rc); + return rc == 0 ? 0 : 1; +} diff --git a/tests/installer_enter_probe.c b/tests/installer_enter_probe.c new file mode 100644 index 0000000..06eabe5 --- /dev/null +++ b/tests/installer_enter_probe.c @@ -0,0 +1,21 @@ +/* + * BFpilot test payload - installer entry marker with safe imports only. + */ + +#include "boot_marker.h" +#include "notify.h" +#include "probe_common.h" + +#define INSTALLER_ENTER_MARKER "/data/BFpilot/installer_enter_probe.txt" + + +int +main(void) { + int marker_rc = probe_write_marker(INSTALLER_ENTER_MARKER, + "tests/installer_enter_probe"); + bfpilot_boot_marker("tests/installer_enter_probe", BFPILOT_BUILD_MODE); + printf("BFpilot installer_enter_probe marker_rc=%d\n", marker_rc); + bfpilot_notify("BFpilot installer enter probe", + marker_rc == 0 ? "entered main" : "marker write failed"); + return marker_rc == 0 ? 0 : 1; +} diff --git a/tests/installer_linkonly_appinst.c b/tests/installer_linkonly_appinst.c new file mode 100644 index 0000000..dc478d0 --- /dev/null +++ b/tests/installer_linkonly_appinst.c @@ -0,0 +1,30 @@ +/* + * BFpilot test payload - direct AppInst import/link probe. + * + * This payload intentionally links AppInstUtil but never calls it. If the + * marker file is not written, the loader rejected the ELF before main(). + */ + +#include "boot_marker.h" +#include "notify.h" +#include "probe_common.h" + +#define LINKONLY_APPINST_MARKER "/data/BFpilot/linkonly_appinst_entered.txt" + +int sceAppInstUtilInitialize(void); + +__attribute__((used)) static void * volatile g_appinst_import_probe = + (void *)&sceAppInstUtilInitialize; + + +int +main(void) { + int marker_rc = probe_write_marker(LINKONLY_APPINST_MARKER, + "tests/installer_linkonly_appinst"); + bfpilot_boot_marker("tests/installer_linkonly_appinst", BFPILOT_BUILD_MODE); + printf("BFpilot installer_linkonly_appinst marker_rc=%d import_symbol=%p\n", + marker_rc, g_appinst_import_probe); + bfpilot_notify("BFpilot link-only AppInst", + marker_rc == 0 ? "entered main" : "marker write failed"); + return marker_rc == 0 ? 0 : 1; +} diff --git a/tests/installer_runtime_resolve_appinst.c b/tests/installer_runtime_resolve_appinst.c new file mode 100644 index 0000000..9aa0077 --- /dev/null +++ b/tests/installer_runtime_resolve_appinst.c @@ -0,0 +1,75 @@ +/* + * BFpilot test payload - runtime AppInstUtil load/resolve probe. + */ + +#include +#include + +#include + +#include "boot_marker.h" +#include "notify.h" +#include "probe_common.h" +#include "version.h" + +#define RUNTIME_RESOLVE_MARKER "/data/BFpilot/runtime_resolve_entered.txt" +#define RUNTIME_RESOLVE_LOG "/data/BFpilot/runtime_resolve_appinst.log" +#define APPINST_MODULE "libSceAppInstUtil.sprx" +#define NID_INSTALL_TITLE_DIR "Wudg3Xe3heE" + + +int +main(void) { + int marker_rc = probe_write_marker(RUNTIME_RESOLVE_MARKER, + "tests/installer_runtime_resolve_appinst"); + bfpilot_boot_marker("tests/installer_runtime_resolve_appinst", + BFPILOT_BUILD_MODE); + + probe_log(RUNTIME_RESOLVE_LOG, + "entered main marker_rc=%d tag=%s build=%s", + marker_rc, VERSION_TAG, BUILD_VERSION); + + uint32_t handle = 0; + probe_log(RUNTIME_RESOLVE_LOG, "about to kernel_dynlib_handle %s", + APPINST_MODULE); + int handle_rc = kernel_dynlib_handle(-1, APPINST_MODULE, &handle); + probe_log(RUNTIME_RESOLVE_LOG, + "kernel_dynlib_handle %s rc=0x%08x handle=0x%08x", + APPINST_MODULE, handle_rc, handle); + + if(handle_rc == 0) { + probe_log(RUNTIME_RESOLVE_LOG, + "about to kernel_dynlib_dlsym sceAppInstUtilInitialize"); + intptr_t init_addr = kernel_dynlib_dlsym( + -1, handle, "sceAppInstUtilInitialize"); + probe_log(RUNTIME_RESOLVE_LOG, + "kernel_dynlib_dlsym sceAppInstUtilInitialize addr=%p", + (void *)init_addr); + + probe_log(RUNTIME_RESOLVE_LOG, + "about to kernel_dynlib_dlsym sceAppInstUtilAppInstallAll"); + intptr_t install_all_addr = kernel_dynlib_dlsym( + -1, handle, "sceAppInstUtilAppInstallAll"); + probe_log(RUNTIME_RESOLVE_LOG, + "kernel_dynlib_dlsym sceAppInstUtilAppInstallAll addr=%p", + (void *)install_all_addr); + + probe_log(RUNTIME_RESOLVE_LOG, + "about to kernel_dynlib_resolve AppInstallTitleDir nid=%s", + NID_INSTALL_TITLE_DIR); + intptr_t title_dir_addr = kernel_dynlib_resolve( + -1, handle, NID_INSTALL_TITLE_DIR); + probe_log(RUNTIME_RESOLVE_LOG, + "kernel_dynlib_resolve AppInstallTitleDir nid=%s addr=%p", + NID_INSTALL_TITLE_DIR, (void *)title_dir_addr); + } else { + probe_log(RUNTIME_RESOLVE_LOG, + "AppInstUtil not already loaded; skipping dlopen because prior " + "test stopped before the dlopen result log"); + } + + bfpilot_notify("BFpilot runtime AppInst", + marker_rc == 0 ? "runtime resolve probe complete" + : "marker write failed"); + return marker_rc == 0 ? 0 : 1; +} diff --git a/tests/probe_common.h b/tests/probe_common.h new file mode 100644 index 0000000..fa67d97 --- /dev/null +++ b/tests/probe_common.h @@ -0,0 +1,87 @@ +/* + * BFpilot test payload helpers. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#define BFPILOT_PROBE_DATA_ROOT "/data" +#define BFPILOT_PROBE_DATA_DIR "/data/BFpilot" + + +static int __attribute__((unused)) +probe_mkdir_if_needed(const char *path) { + if(mkdir(path, 0755) == 0) return 0; + return errno == EEXIST ? 0 : -errno; +} + + +static void __attribute__((unused)) +probe_ensure_data_dir(void) { + (void)probe_mkdir_if_needed(BFPILOT_PROBE_DATA_ROOT); + (void)probe_mkdir_if_needed(BFPILOT_PROBE_DATA_DIR); +} + + +static int __attribute__((unused)) +probe_write_marker(const char *path, const char *payload_name) { + char line[512]; + + probe_ensure_data_dir(); + int n = snprintf(line, sizeof(line), + "%ld payload=%s pid=%ld entered main\n", + (long)time(NULL), + payload_name ? payload_name : "unknown", + (long)getpid()); + if(n < 0) return -EINVAL; + if((size_t)n >= sizeof(line)) n = (int)sizeof(line) - 1; + + int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600); + if(fd < 0) return -errno; + + ssize_t wr = write(fd, line, (size_t)n); + int saved_errno = errno; + if(close(fd) != 0 && wr == n) return -errno; + if(wr != n) return wr < 0 ? -saved_errno : -EIO; + return 0; +} + + +static void __attribute__((unused)) +probe_log(const char *path, const char *fmt, ...) { + char body[1024]; + char line[1400]; + va_list ap; + + va_start(ap, fmt); + int body_n = vsnprintf(body, sizeof(body), fmt ? fmt : "", ap); + va_end(ap); + if(body_n < 0) { + snprintf(body, sizeof(body), "log format failed"); + } else if((size_t)body_n >= sizeof(body)) { + body[sizeof(body) - 1] = 0; + } + + int n = snprintf(line, sizeof(line), "%ld pid=%ld %s\n", + (long)time(NULL), (long)getpid(), body); + if(n < 0) return; + if((size_t)n >= sizeof(line)) n = (int)sizeof(line) - 1; + + fputs(line, stdout); + fflush(stdout); + + probe_ensure_data_dir(); + int fd = open(path, O_WRONLY | O_CREAT | O_APPEND, 0600); + if(fd >= 0) { + (void)write(fd, line, (size_t)n); + close(fd); + } +}