Expose catalog download on the Game Tools page and put the
mirror picker in Preferences. Probe gstatic/miui generate_204
before clone so auto can pick GitHub or cnb.cool by reachability.
Also fix the CNB slug, rename the util CMake target so it no
longer clashes with libgit2, and keep last-error text off the
download button.
Add a key-complete th-TH catalog and wire it through settings, Toolbox, and notifications. Follow PS5 system language 27 when toolbox.language is system.
Co-authored-by: Modmycon <monmycod@gmail.com>
Add key-complete catalogs and wire them through settings, Toolbox,
and notifications. Follow PS5 system languages 5, 8, and 16 when
toolbox.language is system. Existing locale ids stay unchanged.
Add key-complete catalogs and wire them through settings, Toolbox,
and notifications. Follow PS5 system languages 9, 3/20, and 7/17
when toolbox.language is system. Existing locale ids stay unchanged.
Add key-complete catalogs and wire them through settings, Toolbox,
and notifications. Follow PS5 system languages 10, 0, 2/22, and 4
when toolbox.language is system. Existing zh-Hans, en, and ar ids
stay unchanged.
Ed25519 signing no longer adds useful friction. Drop
libonion_integrity, tools/elf_sign, and the XOR integrity toasts
so builds no longer sign daemon.elf.
Scan every locale JSON into N-column catalogs and wire ar through
settings, Toolbox, and PS5 system language 21. The Settings page
stays LTR; XOR trial banners stay bilingual.
Notifications look up notify.* keys instead of English source
strings. Toolbox interpolations go through toolbox_i18n::format so
zh/en word order lives in the JSON catalogs.
Keep redistribution and integrity notices out of ELF .rodata by storing
XOR+position-math blobs and decoding at runtime, so casual string search
cannot locate and patch them. Covers toolbox XML banner, bootstrapper
debug toasts, and the shared integrity failure path in daemon.
Introduce a self-contained libonion_activation module for internal-test
license checks, with compile-time public-key injection, debug-style
toasts, and shared notification i18n. Disable with
ONION_ENABLE_BETA_ACTIVATION=OFF when the beta gate is no longer needed.
There were seven ways to log, each invented where the previous one was not
reachable:
OnionHEN_log libonion_platform, the only one with a file sink
shellui_log libonion_ipc, klog only — because it did not depend on
libonion_platform
game_log same body as shellui_log
onion_ipc_log same body again
logf libonion_ipc's IPC server, with a sink the host had to
register
log_msg onion_elfldr_server
crash_log util's fault handler, plus a second copy in common/
boot_log bootstrapper's fault handler
klog_printf / klog_puts / printf / puts, called directly
A message's destination therefore depended on which module happened to emit
it: ShellUI's ~300 records went to volatile klog and never reached a log file,
while the daemon's went to klog, stdout and disk.
Everything now goes through the LOG_* macros. All seven legacy entry points
are gone, and klog_printf survives only as a sink inside log.c.
The bare -nostdlib libraries deliberately did not get their own backend. Those
flags only affect the static library's own link step; each is linked into a
host with full libc and pthread, which is why they already called vsnprintf.
A second backend would have recreated the split this removes.
Levels were inferred from message text rather than applied uniformly — the old
entry points carried no severity, so a blanket mapping would either bury real
failures at debug or promote routine chatter to error. Result: 291 error, 63
warn, 140 info, 309 debug.
Consequences worth noting:
* ShellUI records now reach the log file, so a user report finally contains
what the injected process did. In release builds most of them are debug
and compile out, so this costs nothing on a retail unit.
* The IPC server's log-sink injection is gone; both servers registered the
same forwarder.
* common/backtrace.cpp and backtrace.hpp are deleted. That was a third copy
of the frame walking plus its own crash_log, and every caller of
printBacktrace/printBacktraceForCrash had already been commented out.
* Fault handlers use onion_log_emergency, so crash records go to the same
file as everything else instead of a separate crash log.
The shared entry point carries a printf format attribute, which the old
shellui_log explicitly avoided. That attribute found seven real format
defects: %p given typed pointers, %lx given a MonoObject*, %p given a
uint64_t, and %u given an unsigned long. Four of them only compile in debug
builds, so they had gone unnoticed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds [logging] level to the shared config schema, applied on every settings
load — so BREW_RELOAD_SETTINGS re-applies it and a user can raise verbosity
for a bug report without a debug payload or a reboot.
libonion_settings stays independent of libonion_platform, so the level
constants exist in both. onion/log_settings.hpp is the single place that sees
both headers and static_asserts that they still agree; it also clamps a
request to what the build actually compiled in and reports the effective
level back, so asking for trace in a release build logs why it stayed at
info rather than silently ignoring the setting.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
OnionHEN_log wrote unconditionally to klog, stdout and a file: no level, no
size bound, no locking, and an open/write/close per record. Release builds
therefore logged exactly as much as debug builds, and the file grew without
limit on a console the user cannot easily clean out.
Add ERROR/WARN/INFO/DEBUG/TRACE behind two gates. ONION_LOG_COMPILE_LEVEL is
checked first and is a constant expression, so a level compiled out costs
nothing at all — the arguments are never evaluated, which matters for the
LOG_TRACE sites that format state. onion_log_set_level then allows raising
verbosity at runtime for a bug report.
Runtime behaviour:
* one mutex around the three sinks so records never interleave, with
formatting kept outside it — the daemon logs from five threads
* the file sink rotates at a size cap, keeping one previous generation
* the descriptor stays open instead of reopening per record
* a monotonic timestamp and the level are prefixed to every record
* exactly one trailing newline regardless of what the caller passed
onion_log_emergency is the fault-handler path: it formats on the stack and
writes without locking, since the faulting thread may already hold the log
lock, and it bypasses both gates because a crash is always worth recording.
OnionHEN_log keeps its name and maps to INFO. Its ~600 call sites predate
levels and are mostly lifecycle reporting, so demoting them wholesale would
empty out a release log.
The test Makefile now emits and consumes depfiles: editing onion/log.h
previously reused a stale log.o, which reported a failure the source no
longer had.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
util and bootstrapper each carried their own copy of the frame-pointer
walking primitives and backtrace printer, so a fix to either had to be made
twice.
Move them to onion/fault_frame.h. They stay header-inline rather than
becoming library functions because onion_current_frame() returns the frame of
its caller and a fault handler uses that to overwrite its own return address:
putting it behind a call would insert a frame and shift which one gets
rewritten. Signal registration, cleanup policy and the setjmp site differ
between the two handlers and stay where they are.
The backtrace addresses are now assembled into one line and sent through the
sink. util previously printed the frames with raw printf() while the markers
around them went through crash_log(), so the crash log recorded
"backtrace start/end" with no addresses between them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
get_ip_address had three independent implementations (shellui, util, daemon)
because each module also carried its own copy of SceNetCtlInfo and its own
prototype for sceNetCtlGetInfo, with the pointer typed as SceNetCtlInfo* in
two of them and void* in the third.
The shellui and util copies stored the result in an unsigned int and tested
`ret < 0`, which is never true for an unsigned value. Their error branch was
unreachable, so a failed lookup returned success, left not_connected clear,
and copied an uninitialised SceNetCtlInfo to the caller instead of the
IP NOT FOUND placeholder. util's rest-mode network-recovery retry keys off
that return value and therefore never ran.
Declare the netctl ABI once in source/include/ps5/net_ctl.h, add
onion_net_get_ip_address to libonion_platform with an explicit buffer-size
contract, and keep util's not_connected latch in util where it belongs.
Cover the status mapping, the placeholder length and buffer validation with
host tests.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cache the PS5 system language once per process and share the resolved locale across Toolbox, plain notifications, and rich notifications. Keep ShellUI queries behind the registered trampoline, localize the daemon welcome toast, and cover cache refresh and localized payload generation in host tests.
Share the Toolbox language setting across bootstrapper, daemon, util, and ShellUI notifications. Localize both plain and icon-rich toast text with system-language fallback, and add host coverage for language resolution and rich payload formatting.
Remove FPS calculation from the shellui monitor bar while keeping CPU,
GPU, RAM, and IP metrics, and delete the full game-process inject path
(fps_elf, fps.prx, SHM) so titles are no longer soft-injected.
Clear any legacy fps_overlay ready marker on daemon/shellui start, and
bound CPU sampling retries so a stuck probe cannot block other metrics.
Rename product, namespaces, libraries, paths, and assets from Orion/orion
to Onion/onion across the tree. TCP stack-shutdown magic is now ONIO
(0x4F4E494F) to match the corrected branding.