mirror of
https://github.com/phantomptr/ps5upload.git
synced 2026-10-19 02:20:02 -05:00
* feat(elfldr): vendor elfldr with a read deadline, embedded in the engine elfldr serves one connection at a time and its reads had no deadline, so a client that went silent without closing (a dropped link, a machine or console asleep mid-send) left it running but deaf on :9021 — users had to load elfldr again. Measured on the Phat (FW 5.10): the stock build answered nothing while a silent connection stayed open; with a 15 s SO_RCVTIMEO it dropped that connection and answered the next request at once, and a payload sent with 10 s pauses still loaded. third_party/elfldr is upstream 02cfe91 plus ps5upload.patch (GPLv3, credited), with the tested ELF checked in so every engine build embeds it; `make elfldr` rebuilds it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(elfldr): the engine swaps a console's stock elfldr for the patched one GET /api/ps5/elfldr/health tells healthy / stuck / absent from a request elfldr answers without running anything. POST /api/ps5/elfldr/ensure replaces the standard elfldr.elf with the embedded patched build when it answers and isn't the one this engine installed (a reboot or autoloader brings the stock one back), leaves any other loader on :9021 alone, and returns once the new one answers. On the Phat: upgraded (pid 685, answering at once), then 'current'; the helper was untouched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ci(publish): give each client build 75 minutes The Intel macOS build ran past the 45-minute limit for v5.37.0 (about 33 minutes for v5.35.0 and v5.36.0), which cancelled it and skipped create-release, so v5.37.0 was never published. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(engine): history tests get their own temp dirs TmpDir named directories by pid and nanoseconds, but macOS time ticks in microseconds: two tests starting together shared a directory and one deleted it under the other (a_legacy_host_port_file_is_still_read read nothing). A counter makes each name unique. The elfldr embed test reads the embedded bytes directly instead of clearing an env var mid-run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(elfldr): the app keeps the patched elfldr in place and never sends into a stuck one Before sending the helper, the app checks the console's loader: a stuck one (took the connection, never answered) is waited out for 20 s — the patched build clears in 15 — and one that stays stuck is reported plainly ('load elfldr again') instead of a socket error. Once the helper is up, the engine swaps the stock elfldr for the patched build: at once after a fresh helper send (a reboot or wake brings the stock one back), else at most every 10 minutes per console. Desktop, browser and Android share the engine routes; strings in all 20 languages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(changelog): 5.37.1 — elfldr recovers by itself; 5.37.0 folded in Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(elfldr): swap it in when the helper is already up at launch Only ensurePayloadCurrent asked for the patched elfldr, and a helper that is already up when the app opens never goes through it — on the Phat the stock elfldr stayed. The status poll's 'arrives at up' edge (first sighting included) now asks too, after the same settle as the log capture and never during a transfer. Hardware (Phat FW 5.10, web build and Android app): stock elfldr replaced ~10 s after opening; a silent :9021 connection held while the helper was shut down — the helper came back through the patched elfldr; with the stock elfldr wedged, the Android app sent nothing for 150 s (health: stuck), then redeployed and swapped elfldr once released. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(convert): the compress stage pays for reading and writing on one thread kraken_image::compress runs the encoder on a pool, but one thread reads the source and writes each compressed block, so the stage takes the longer of encoding and read+write — not the slower of reading and encoding, as the estimate assumed. With the Windows Battlefield 6 run's speeds the model now gives 75 min for a 71-min build. The estimate also reports the speeds it measured (rates), because the small read/write samples can be fooled by caches: on a source read an hour earlier the read sample hit the file cache at 8.6 GB/s and the estimate came out at 25 min for a 54-min build. Calibrating from past builds is the follow-up. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(changelog): build-time estimate, stated as measured Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ci(docker): 25 minutes for the PR image checks Both PR gates build the whole image (engine, and the client for the web UI one) in about 7-10 minutes; the engine gate took 9m55s and the web UI gate was cancelled at its 10-minute limit on PR #338. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
1.1 KiB
C
43 lines
1.1 KiB
C
/* Copyright (C) 2024 John Törnblom
|
|
|
|
This program is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by the
|
|
Free Software Foundation; either version 3, or (at your option) any
|
|
later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; see the file COPYING. If not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
|
|
|
|
typedef struct notify_request {
|
|
char useless1[45];
|
|
char message[3075];
|
|
} notify_request_t;
|
|
|
|
|
|
int sceKernelSendNotificationRequest(int, notify_request_t*, size_t, int);
|
|
|
|
|
|
void
|
|
notify(const char *fmt, ...) {
|
|
notify_request_t req;
|
|
va_list args;
|
|
|
|
bzero(&req, sizeof req);
|
|
va_start(args, fmt);
|
|
vsnprintf(req.message, sizeof req.message, fmt, args);
|
|
va_end(args);
|
|
|
|
sceKernelSendNotificationRequest(0, &req, sizeof req, 0);
|
|
}
|