From ddff8862670730bb66b1aa449d1747797c2330c8 Mon Sep 17 00:00:00 2001 From: Jeffrey Alan Scudder Date: Thu, 26 Mar 2026 15:56:55 -0700 Subject: [PATCH] fix: shutdown animation + curl in initramfs - system.poweroff() now signals main loop to run bye animation instead of calling _exit(0) directly - Add curl binary + libs to initramfs for HTTP fetches - Add busybox wget as fallback Co-Authored-By: Claude Opus 4.6 (1M context) --- fedac/native/docker-build.sh | 11 +++++++++++ fedac/native/src/ac-native.c | 3 ++- fedac/native/src/js-bindings.c | 18 ++++-------------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/fedac/native/docker-build.sh b/fedac/native/docker-build.sh index b50cc0289..16b53169d 100644 --- a/fedac/native/docker-build.sh +++ b/fedac/native/docker-build.sh @@ -129,6 +129,17 @@ for cmd in sh sleep mkdir mount umount cat echo ls cp mv rm ln chmod chown \ done # udhcpc also expected at /sbin/ by wifi.c ln -sf ../bin/busybox "$IROOT/sbin/udhcpc" 2>/dev/null || true + +# ── 2a2: curl + wget for HTTP fetches (captive portals, OTA, API calls) ── +CURL_BIN=$(command -v curl) +if [ -n "$CURL_BIN" ]; then + cp "$CURL_BIN" "$IROOT/bin/curl" + for lib in $(ldd "$CURL_BIN" 2>/dev/null | grep -oP '/\S+'); do + [ -f "$lib" ] && cp -nL "$lib" "$IROOT/lib64/" 2>/dev/null || true + done +fi +# busybox wget as fallback +ln -s busybox "$IROOT/bin/wget" 2>/dev/null || true # Minimal udhcpc script to configure interface after getting lease mkdir -p "$IROOT/usr/share/udhcpc" cat > "$IROOT/usr/share/udhcpc/default.script" << 'UDHCPC_SCRIPT' diff --git a/fedac/native/src/ac-native.c b/fedac/native/src/ac-native.c index 24ff49fb6..df0933885 100644 --- a/fedac/native/src/ac-native.c +++ b/fedac/native/src/ac-native.c @@ -2893,7 +2893,8 @@ int main(int argc, char *argv[]) { } } - if (power_pressed) { + if (power_pressed || poweroff_requested) { + poweroff_requested = 0; // consume the flag // Say bye IMMEDIATELY (TTS + shutdown chime start before animation) char bye_title[80]; { diff --git a/fedac/native/src/js-bindings.c b/fedac/native/src/js-bindings.c index 1c6ef436a..ac9f00181 100644 --- a/fedac/native/src/js-bindings.c +++ b/fedac/native/src/js-bindings.c @@ -3322,22 +3322,12 @@ static JSValue js_reboot(JSContext *ctx, JSValueConst this_val, int argc, JSValu return JS_UNDEFINED; } -// system.poweroff() — clean shutdown (power off) +// system.poweroff() — signal main loop to run shutdown animation then exit +extern volatile int poweroff_requested; static JSValue js_poweroff(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { (void)ctx; (void)this_val; (void)argc; (void)argv; - ac_log("[system] poweroff requested"); - perf_flush(); - if (current_rt && current_rt->audio) { - audio_shutdown_sound(current_rt->audio); - usleep(500000); - } - ac_log("[poweroff] pid=%d, syncing filesystems...\n", getpid()); - ac_log_flush(); - sync(); usleep(300000); sync(); - ac_log("[poweroff] exiting with code 0 (init will power off)...\n"); - ac_log_flush(); - // Exit cleanly — init script sees exit code 0 and runs poweroff - _exit(0); + ac_log("[system] poweroff requested via JS"); + poweroff_requested = 1; // main loop will run bye animation + exit(0) return JS_UNDEFINED; } -- 2.51.2