From 0d7d8ad4b012197345da764be45204dfe3786a17 Mon Sep 17 00:00:00 2001 From: holdmysocks <1349908+holdmysocks@users.noreply.github.com> Date: Fri, 2 Oct 2026 12:26:10 -0400 Subject: [PATCH] Ship a single payload instead of an installer tailscale.elf now adds the home screen icon itself, the first time it runs, by handing a small embedded helper payload to the ELF loader. The separate installer is gone: nothing is copied to /data/tailscale any more, and the payload runs from wherever the user keeps it. Uninstall on the status page now logs out, stops the daemon and deletes its data directory. --- README.md | 44 ++-- {installer/assets => appicon}/icon0.png | Bin appicon/main.c | 151 +++++++++++ {installer/assets => appicon}/param.json | 0 docs/BUILDING.md | 12 +- docs/TECHNICAL.md | 20 +- docs/status-page.png | Bin 61260 -> 61182 bytes installer/main.c | 310 ----------------------- launcher/homeicon.c | 128 ++++++++++ launcher/homeicon.h | 5 + launcher/main.c | 3 + tools/build-installer.ps1 | 27 -- tools/build-payload.ps1 | 17 +- tsd/main.go | 10 + tsd/status.html | 7 +- tsd/uninstall.go | 30 --- tsd/web.go | 20 +- 17 files changed, 367 insertions(+), 417 deletions(-) rename {installer/assets => appicon}/icon0.png (100%) create mode 100644 appicon/main.c rename {installer/assets => appicon}/param.json (100%) delete mode 100644 installer/main.c create mode 100644 launcher/homeicon.c create mode 100644 launcher/homeicon.h delete mode 100644 tools/build-installer.ps1 delete mode 100644 tsd/uninstall.go diff --git a/README.md b/README.md index 1895559..9b6638d 100644 --- a/README.md +++ b/README.md @@ -43,38 +43,36 @@ Tested on firmware 13.42 with elfldr 0.26. ## Install -1. Download `tailscale-installer.elf` from the - [latest release](../../releases/latest). -2. Send it to the console's ELF loader, once. Any payload sender works: +There is one file, `tailscale.elf`, and it is an ordinary payload: running +it starts Tailscale. + +1. Download `tailscale.elf` from the [latest release](../../releases/latest). +2. Send it to the console's ELF loader. Any payload sender works: ```bash # Linux / macOS - socat -t 60 - TCP::9021 < tailscale-installer.elf + socat -t 60 - TCP::9021 < tailscale.elf ``` ```powershell # Windows (script from this repository) - .\tools\ps5send.ps1 -File tailscale-installer.elf -PS5Host -Seconds 70 + .\tools\ps5send.ps1 -File tailscale.elf -PS5Host ``` - The installer prints what it does. It: - - stores the daemon payload as `/data/tailscale/tailscale.elf`, - - adds a **Tailscale** icon to the home screen (media section), - - starts Tailscale. - 3. Open `http://:8090` on a phone or PC. Scan the QR code or follow the link and log in to Tailscale. If your tailnet uses device approval, approve the console in the admin console. -The console now has a tailnet address, shown on the status page. - -Sending the installer again upgrades and restarts Tailscale. The login is -kept. +The console now has a tailnet address, shown on the status page. The first +run also adds a **Tailscale** icon to the home screen (media section) that +opens the status page. Tailscale runs until the console restarts. After a restart and jailbreak, -send `/data/tailscale/tailscale.elf` (or the installer) to the ELF loader -again. The installer does not change any payload autoloader; if you use one, -you can add that file to it yourself. +send `tailscale.elf` again; the login and settings are kept. If you use a +payload manager or autoloader, add the file there like any other payload. + +To update, use the new `tailscale.elf` in place of the old one. Sending it +while Tailscale is running replaces the running copy. ## Using it @@ -215,19 +213,21 @@ Files on the console: | `/data/tailscale/state/` | Tailscale's state, including the login. | | `/data/tailscale/tailscale.log` | The daemon's log, rotated at 2 MB. | | `/data/tailscale/tailscale-debug.log` | Tailscale's detailed log, up to 4 MB plus one older file. | -| `/data/tailscale/tailscale.elf` | The daemon payload. | +| `/data/tailscale/icon-installed` | Marks that the home screen icon was added. Delete it to have the icon added again on the next start. | | `/user/app/TSCL00001/` | The home screen icon. | ## Uninstall -Press **Uninstall** on the status page. It deletes the daemon payload and -stops Tailscale. It asks whether to also log out and delete the saved login. +Press **Uninstall** on the status page. It logs the console out of your +tailnet, deletes `/data/tailscale` (login, settings, logs) and stops +Tailscale. -Two things are left to do by hand: +Left to do by hand: - Delete the home screen icon (Options button, then Delete). - Remove the device in the Tailscale admin console. -- If you added the payload to an autoloader yourself, remove it there. +- If you added `tailscale.elf` to a payload manager or autoloader, remove it + there, or it starts again on the next boot. ## Troubleshooting diff --git a/installer/assets/icon0.png b/appicon/icon0.png similarity index 100% rename from installer/assets/icon0.png rename to appicon/icon0.png diff --git a/appicon/main.c b/appicon/main.c new file mode 100644 index 0000000..dc63c46 --- /dev/null +++ b/appicon/main.c @@ -0,0 +1,151 @@ +/* Home screen icon helper for Tailscale on PS5. + * + * A tiny payload that puts a "Tailscale" icon on the home screen: a media app + * whose only content is a link to the status page, which the console opens in + * its browser. The daemon's launcher carries this payload and hands it to the + * ELF loader the first time Tailscale runs. It is a separate payload so that + * the system libraries it needs are never loaded into the daemon's process. + * + * Prints "icon: ok" on success; the launcher looks for that. + * + * Build with -DASSET_DIR="path/to/appicon" and link, in this order, + * -lSceIpmi -lSceAppInstUtil -lSceUserService -lSceSystemService (with + * libSceAppInstUtil alone the payload is never started). */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#ifndef ASSET_DIR +#error "ASSET_DIR must name the folder with param.json and icon0.png" +#endif + +#define TITLE_ID "TSCL00001" +#define APP_DIR "/user/app/" TITLE_ID + +#define INCASSET(name, file) \ + __asm__(".section .rodata\n" \ + ".balign 16\n" \ + ".global " #name "\n" #name ":\n" \ + ".incbin \"" file "\"\n" \ + ".global " #name "_end\n" #name "_end:\n" \ + ".text\n"); \ + extern const uint8_t name[]; \ + extern const uint8_t name##_end[]; + +INCASSET(param_json, ASSET_DIR "/param.json") +INCASSET(icon_png, ASSET_DIR "/icon0.png") + +int sceAppInstUtilInitialize(void); +int sceAppInstUtilTerminate(void); +int sceAppInstUtilAppInstallAll(void *); + +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 -1; + } + while (size > 0) { + ssize_t n = write(fd, data, size); + if (n < 0) { + if (errno == EINTR) { + continue; + } + close(fd); + return -1; + } + data += n; + size -= n; + } + return close(fd); +} + +/* Report whether the file at path already has exactly these contents. */ +static int +file_matches(const char *path, const uint8_t *data, size_t size) { + struct stat st; + uint8_t *buf; + int same = 0; + FILE *f; + + if (stat(path, &st) || (size_t)st.st_size != size || !(f = fopen(path, "rb"))) { + return 0; + } + if ((buf = malloc(size))) { + same = fread(buf, 1, size, f) == size && !memcmp(buf, data, size); + free(buf); + } + fclose(f); + return same; +} + +int +main(void) { + int (*install_title_dir)(const char *, const char *, void *) = 0; + size_t param_size = param_json_end - param_json; + size_t icon_size = icon_png_end - icon_png; + pid_t pid = getpid(); + intptr_t rootvnode; + uint32_t handle; + int err; + + setvbuf(stdout, 0, _IONBF, 0); + + /* /user/app is only writable as root outside the sandbox. */ + if ((rootvnode = kernel_get_root_vnode())) { + kernel_set_proc_rootdir(pid, rootvnode); + kernel_set_proc_jaildir(pid, 0); + } + kernel_set_ucred_uid(pid, 0); + kernel_set_ucred_ruid(pid, 0); + kernel_set_ucred_svuid(pid, 0); + kernel_set_ucred_rgid(pid, 0); + kernel_set_ucred_svgid(pid, 0); + + if (file_matches(APP_DIR "/sce_sys/param.json", param_json, param_size) && + file_matches(APP_DIR "/sce_sys/icon0.png", icon_png, icon_size)) { + printf("icon: ok (already installed)\n"); + return 0; + } + + if ((err = sceAppInstUtilInitialize())) { + printf("icon: sceAppInstUtilInitialize failed: 0x%08x\n", err); + return 1; + } + mkdir(APP_DIR, 0755); + mkdir(APP_DIR "/sce_sys", 0755); + if (write_file(APP_DIR "/sce_sys/param.json", param_json, param_size) || + write_file(APP_DIR "/sce_sys/icon0.png", icon_png, icon_size)) { + printf("icon: could not write to %s: %s\n", APP_DIR, strerror(errno)); + sceAppInstUtilTerminate(); + return 1; + } + + /* Register just this title where the firmware supports it; otherwise ask + * for a rescan of everything under /user/app. */ + if (!kernel_dynlib_handle(-1, "libSceAppInstUtil.sprx", &handle)) { + install_title_dir = (void *)kernel_dynlib_resolve(-1, handle, "Wudg3Xe3heE"); + } + if (install_title_dir) { + err = install_title_dir(TITLE_ID, "/user/app/", 0); + } else { + err = sceAppInstUtilAppInstallAll(0); + } + sceAppInstUtilTerminate(); + if (err) { + printf("icon: registering the app failed: 0x%08x\n", err); + return 1; + } + printf("icon: ok (installed %s)\n", TITLE_ID); + return 0; +} diff --git a/installer/assets/param.json b/appicon/param.json similarity index 100% rename from installer/assets/param.json rename to appicon/param.json diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 52e1a5a..717f4ff 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -51,18 +51,18 @@ These folders are not in the repository. ## Building the payloads ```powershell -# daemon payload: C launcher + Go program -> out\tailscale.elf -.\tools\build-payload.ps1 -GoDir tsd -Name tailscale -Version 0.4.0 - -# installer -> out\tailscale-installer.elf (embeds out\tailscale.elf) -.\tools\build-installer.ps1 +# C launcher + Go program + home screen icon helper -> out\tailscale.elf +.\tools\build-payload.ps1 -GoDir tsd -Name tailscale -Version 0.4.1 -HomeIcon ``` +`-HomeIcon` also builds `appicon\` into `out\appicon.elf` and embeds it in +the launcher. + ## Sending to the console ```powershell $env:PS5_HOST = '192.168.1.50' # your console -.\tools\ps5send.ps1 -File out\tailscale-installer.elf -Seconds 70 +.\tools\ps5send.ps1 -File out\tailscale.elf ``` `ps5send.ps1` prints whatever the payload writes back. diff --git a/docs/TECHNICAL.md b/docs/TECHNICAL.md index e693cda..67fff2c 100644 --- a/docs/TECHNICAL.md +++ b/docs/TECHNICAL.md @@ -44,11 +44,18 @@ specification. - A payload that is sent again stops the running instance (through the status page, or failing that by the pid it recorded) and takes over. -**The installer** (`installer/`, C) embeds `tailscale.elf`. It writes it to -`/data/tailscale/tailscale.elf`, registers a home screen app whose -`param.json` has a `deeplinkUri` to the status page, and starts the daemon by -sending it to the ELF loader on `127.0.0.1:9021`. It does not modify any -payload autoloader. +**The icon helper** (`appicon/`, C) is a second, tiny payload embedded in the +launcher. The first time `tailscale.elf` runs, the launcher sends it to the +ELF loader on `127.0.0.1:9021`, where it runs as a process of its own, +registers a home screen app whose `param.json` has a `deeplinkUri` to the +status page, reports the result and exits. The launcher then writes +`/data/tailscale/icon-installed` and never does it again. It is a separate +payload so that the system libraries it needs are never loaded into the +long-running daemon process, where their threads could receive signals meant +for the Go runtime. + +There is no installer. Nothing is copied anywhere and no payload autoloader +is touched: the payload is run from wherever the user keeps it. ## The PS5 as a Go target @@ -144,6 +151,9 @@ Linking `libSceAppInstUtil` alone leaves the payload stopped before it runs. It needs `-lSceIpmi -lSceAppInstUtil -lSceUserService -lSceSystemService`, in that order, as in the SDK's `install_app` sample. +The daemon cannot remove the icon; that is left to the user (Options, then +Delete, on the home screen). + ## Known problems - Once, switching the console from Wi-Fi to Ethernet during a Moonlight diff --git a/docs/status-page.png b/docs/status-page.png index 9d5ecc88290df9f7003f4d5e1d2aa69e7bfbe594..20ac98d4f4f7268056e44f7d589246ab9772f9fb 100644 GIT binary patch literal 61182 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 z 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

8}W#_7e7LL*q-g?6be+@qnP>HNYaKJ6DQ$z0=3 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%0D+& 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%0AM0 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 Aod5s; diff --git a/installer/main.c b/installer/main.c deleted file mode 100644 index bb29944..0000000 --- a/installer/main.c +++ /dev/null @@ -1,310 +0,0 @@ -/* Tailscale installer payload for jailbroken PS5s. - * - * Stores the Tailscale daemon payload on the console, adds a home screen - * icon that opens the status page, and starts the daemon through the ELF - * loader on this console. It does not touch any payload autoloader. Build - * with tools\build-installer.ps1, which sets DAEMON_ELF and - * ASSET_DIR and links the system libraries the app installer needs. */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#ifndef DAEMON_ELF -#error "DAEMON_ELF must name the daemon payload to embed" -#endif - -#define DATA_DIR "/data/tailscale" -#define DAEMON_NAME "tailscale.elf" -#define LOADER_PORT 9021 - -extern const uint8_t daemon_elf[]; -extern const uint8_t daemon_elf_end[]; - -__asm__(".section .rodata\n" - ".balign 16\n" - ".global daemon_elf\n" - "daemon_elf:\n" - ".incbin \"" DAEMON_ELF "\"\n" - ".global daemon_elf_end\n" - "daemon_elf_end:\n" - ".text\n"); - -/* The home screen launcher: a media app whose only content is a link, which - * the console opens in its browser. ASSET_DIR is set by the build. */ -#ifndef ASSET_DIR -#error "ASSET_DIR must name the folder with param.json and icon0.png" -#endif -#define LAUNCHER_TITLE_ID "TSCL00001" -#define LAUNCHER_DIR "/user/app/" LAUNCHER_TITLE_ID - -#define INCASSET(name, file) \ - __asm__(".section .rodata\n" \ - ".balign 16\n" \ - ".global " #name "\n" #name ":\n" \ - ".incbin \"" file "\"\n" \ - ".global " #name "_end\n" #name "_end:\n" \ - ".text\n"); \ - extern const uint8_t name[]; \ - extern const uint8_t name##_end[]; - -INCASSET(launcher_param_json, ASSET_DIR "/param.json") -INCASSET(launcher_icon_png, ASSET_DIR "/icon0.png") - -int sceAppInstUtilInitialize(void); -int sceAppInstUtilTerminate(void); -int sceAppInstUtilAppInstallAll(void *); - -typedef struct notify_request { - char useless1[45]; - char message[3075]; -} notify_request_t; - -int sceKernelSendNotificationRequest(int, notify_request_t *, size_t, int); - -static void -notify(const char *fmt, ...) { - notify_request_t req; - va_list args; - - memset(&req, 0, sizeof(req)); - va_start(args, fmt); - vsnprintf(req.message, sizeof(req.message), fmt, args); - va_end(args); - sceKernelSendNotificationRequest(0, &req, sizeof(req), 0); -} - -static int -write_all(int fd, const uint8_t *data, size_t size) { - while (size > 0) { - ssize_t n = write(fd, data, size); - if (n < 0) { - if (errno == EINTR) { - continue; - } - return -1; - } - data += n; - size -= n; - } - return 0; -} - -/* Write a file through a temporary name so a failed write never leaves a - * truncated payload behind. */ -static int -write_file(const char *path, const uint8_t *data, size_t size) { - char tmp[512]; - int fd; - - snprintf(tmp, sizeof(tmp), "%s.tmp", path); - if ((fd = open(tmp, O_WRONLY | O_CREAT | O_TRUNC, 0755)) < 0) { - return -1; - } - if (write_all(fd, data, size)) { - close(fd); - unlink(tmp); - return -1; - } - close(fd); - if (rename(tmp, path)) { - unlink(tmp); - return -1; - } - return 0; -} - -static int -install_daemon(const char *dir) { - char path[512]; - - mkdir(dir, 0755); - snprintf(path, sizeof(path), "%s/%s", dir, DAEMON_NAME); - if (write_file(path, daemon_elf, daemon_elf_end - daemon_elf)) { - printf(" could not write %s: %s\n", path, strerror(errno)); - return -1; - } - printf(" wrote %s (%.1f MB)\n", path, (daemon_elf_end - daemon_elf) / 1048576.0); - return 0; -} - -/* Report whether the file at path already has exactly these contents. */ -static int -file_matches(const char *path, const uint8_t *data, size_t size) { - struct stat st; - uint8_t *buf; - int same = 0; - FILE *f; - - if (stat(path, &st) || (size_t)st.st_size != size || !(f = fopen(path, "rb"))) { - return 0; - } - if ((buf = malloc(size))) { - same = fread(buf, 1, size, f) == size && !memcmp(buf, data, size); - free(buf); - } - fclose(f); - return same; -} - -/* Put a "Tailscale" icon on the home screen that opens the status page in - * the console's browser. Does nothing if it is already there and current. - * Returns 0 on success. */ -static int -install_launcher_app(void) { - int (*install_title_dir)(const char *, const char *, void *) = 0; - size_t param_size = launcher_param_json_end - launcher_param_json; - size_t icon_size = launcher_icon_png_end - launcher_icon_png; - uint32_t handle; - int err; - - if (file_matches(LAUNCHER_DIR "/sce_sys/param.json", launcher_param_json, param_size) && - file_matches(LAUNCHER_DIR "/sce_sys/icon0.png", launcher_icon_png, icon_size)) { - printf(" already installed\n"); - return 0; - } - - if ((err = sceAppInstUtilInitialize())) { - printf(" sceAppInstUtilInitialize failed: 0x%08x\n", err); - return -1; - } - mkdir(LAUNCHER_DIR, 0755); - mkdir(LAUNCHER_DIR "/sce_sys", 0755); - if (write_file(LAUNCHER_DIR "/sce_sys/param.json", launcher_param_json, param_size) || - write_file(LAUNCHER_DIR "/sce_sys/icon0.png", launcher_icon_png, icon_size)) { - printf(" could not write to %s: %s\n", LAUNCHER_DIR, strerror(errno)); - sceAppInstUtilTerminate(); - return -1; - } - - /* Register just this title where the firmware supports it; otherwise ask - * for a rescan of everything under /user/app. */ - if (!kernel_dynlib_handle(-1, "libSceAppInstUtil.sprx", &handle)) { - install_title_dir = (void *)kernel_dynlib_resolve(-1, handle, "Wudg3Xe3heE"); - } - if (install_title_dir) { - err = install_title_dir(LAUNCHER_TITLE_ID, "/user/app/", 0); - } else { - err = sceAppInstUtilAppInstallAll(0); - } - sceAppInstUtilTerminate(); - if (err) { - printf(" registering the app failed: 0x%08x\n", err); - return -1; - } - printf(" installed (%s), opens http://127.0.0.1:8090/\n", LAUNCHER_TITLE_ID); - return 0; -} - -/* Hand the daemon to the ELF loader on this console and relay what it prints - * for a while, so that the login link reaches whoever sent the installer. */ -static int -start_daemon(int relay_seconds) { - struct sockaddr_in addr = {0}; - struct timeval start, now; - char buf[4096]; - int fd; - - if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - return -1; - } - addr.sin_family = AF_INET; - addr.sin_port = htons(LOADER_PORT); - addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - if (connect(fd, (struct sockaddr *)&addr, sizeof(addr))) { - close(fd); - return -1; - } - if (write_all(fd, daemon_elf, daemon_elf_end - daemon_elf)) { - close(fd); - return -1; - } - - gettimeofday(&start, 0); - for (;;) { - struct timeval tv = {1, 0}; - fd_set rfds; - - gettimeofday(&now, 0); - if (now.tv_sec - start.tv_sec >= relay_seconds) { - break; - } - FD_ZERO(&rfds); - FD_SET(fd, &rfds); - if (select(fd + 1, &rfds, 0, 0, &tv) <= 0) { - continue; - } - ssize_t n = read(fd, buf, sizeof(buf)); - if (n <= 0) { - break; - } - if (write_all(STDOUT_FILENO, (uint8_t *)buf, n)) { - break; - } - } - close(fd); - return 0; -} - -int -main(void) { - pid_t pid = getpid(); - intptr_t rootvnode; - - setvbuf(stdout, 0, _IONBF, 0); - - /* Run as root outside the sandbox so /data and USB drives are writable. */ - if ((rootvnode = kernel_get_root_vnode())) { - kernel_set_proc_rootdir(pid, rootvnode); - kernel_set_proc_jaildir(pid, 0); - } - kernel_set_ucred_uid(pid, 0); - kernel_set_ucred_ruid(pid, 0); - kernel_set_ucred_svuid(pid, 0); - kernel_set_ucred_rgid(pid, 0); - kernel_set_ucred_svgid(pid, 0); - -#ifdef LAUNCHER_ONLY - /* Test build: only (re)install the home screen icon. */ - printf("Home screen icon:\n"); - return install_launcher_app() ? 1 : 0; -#endif - - printf("Tailscale for PS5 installer\n\n"); - - printf("Daemon payload:\n"); - if (install_daemon(DATA_DIR)) { - notify("Tailscale install failed:\ncould not write to %s", DATA_DIR); - return 1; - } - - printf("Home screen icon:\n"); - install_launcher_app(); - - printf("\nStarting Tailscale...\n"); - if (start_daemon(45)) { - printf("Could not reach the ELF loader on port %d: %s\n", LOADER_PORT, strerror(errno)); - notify("Tailscale is installed but could not be started:\nno ELF loader on port %d.", LOADER_PORT); - return 1; - } - - printf("\nDone. The status page is on port 8090 of this console.\n" - "Tailscale runs until the console restarts. To start it again, send\n" - "%s/%s to the ELF loader.\n", - DATA_DIR, DAEMON_NAME); - return 0; -} diff --git a/launcher/homeicon.c b/launcher/homeicon.c new file mode 100644 index 0000000..307a296 --- /dev/null +++ b/launcher/homeicon.c @@ -0,0 +1,128 @@ +/* Installs the home screen icon the first time the payload runs. + * + * The icon is installed by a separate small payload (appicon/), embedded + * here and handed to the ELF loader on this console, so that the system + * libraries it needs never end up in this process. Build with + * -DICON_HELPER="path/to/appicon.elf"; without it this file does nothing. */ + +#include "homeicon.h" + +#ifdef ICON_HELPER + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define DATA_DIR "/data/tailscale" +/* Records that the icon has been installed, and which version of it. Once + * it exists the icon is left alone, so an icon the user deletes from the + * home screen stays deleted. Remove the file to get the icon back. */ +#define ICON_MARKER DATA_DIR "/icon-installed" +#define ICON_VERSION "1\n" +#define LOADER_PORT 9021 + +extern const uint8_t icon_helper[]; +extern const uint8_t icon_helper_end[]; + +__asm__(".section .rodata\n" + ".balign 16\n" + ".global icon_helper\n" + "icon_helper:\n" + ".incbin \"" ICON_HELPER "\"\n" + ".global icon_helper_end\n" + "icon_helper_end:\n" + ".text\n"); + +static int +marker_is_current(void) { + char buf[16] = {0}; + int fd = open(ICON_MARKER, O_RDONLY); + + if (fd < 0) { + return 0; + } + read(fd, buf, sizeof(buf) - 1); + close(fd); + return !strcmp(buf, ICON_VERSION); +} + +void +home_icon_install_once(void) { + struct sockaddr_in addr = {0}; + struct timeval tv = {1, 0}; + const uint8_t *data = icon_helper; + size_t left = icon_helper_end - icon_helper; + char reply[512] = {0}; + size_t got = 0; + int fd; + + if (marker_is_current()) { + return; + } + mkdir(DATA_DIR, 0755); + + if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + return; + } + addr.sin_family = AF_INET; + addr.sin_port = htons(LOADER_PORT); + addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + if (connect(fd, (struct sockaddr *)&addr, sizeof(addr))) { + /* No ELF loader on the usual port: go without an icon this time. */ + close(fd); + return; + } + while (left > 0) { + ssize_t n = write(fd, data, left); + if (n <= 0) { + close(fd); + return; + } + data += n; + left -= n; + } + + /* The helper reports "icon: ok" or what went wrong, then exits, which + * closes the connection. Give it 20 seconds. */ + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + for (int tries = 0; tries < 20 && got < sizeof(reply) - 1; tries++) { + const char *line = strstr(reply, "icon: "); + if (line && strchr(line, '\n')) { + break; + } + ssize_t n = read(fd, reply + got, sizeof(reply) - 1 - got); + if (n == 0) { + break; + } + if (n > 0) { + got += n; + } + } + close(fd); + + if (strstr(reply, "icon: ok")) { + if ((fd = open(ICON_MARKER, O_WRONLY | O_CREAT | O_TRUNC, 0644)) >= 0) { + write(fd, ICON_VERSION, sizeof(ICON_VERSION) - 1); + close(fd); + } + fprintf(stderr, "launcher: home screen icon installed\n"); + } else { + fprintf(stderr, "launcher: home screen icon not installed: %s\n", got ? reply : "no reply from the helper"); + } +} + +#else + +void +home_icon_install_once(void) { +} + +#endif diff --git a/launcher/homeicon.h b/launcher/homeicon.h new file mode 100644 index 0000000..a8c30cc --- /dev/null +++ b/launcher/homeicon.h @@ -0,0 +1,5 @@ +#pragma once + +/* Put the Tailscale icon on the home screen if that has not been done yet. + * Never fails: without an icon everything else still works. */ +void home_icon_install_once(void); diff --git a/launcher/main.c b/launcher/main.c index e2c2402..7379aa3 100644 --- a/launcher/main.c +++ b/launcher/main.c @@ -10,6 +10,7 @@ #include #include "goload.h" +#include "homeicon.h" #ifndef GO_IMAGE #error "GO_IMAGE must name the Go binary to embed" @@ -134,6 +135,8 @@ main(int argc, char **argv) { kernel_set_ucred_rgid(pid, 0); kernel_set_ucred_svgid(pid, 0); + home_icon_install_once(); + if (leave_realtime_class()) { /* Without this a runaway goroutine could hang the console, so do not * take the chance. */ diff --git a/tools/build-installer.ps1 b/tools/build-installer.ps1 deleted file mode 100644 index 4a9c978..0000000 --- a/tools/build-installer.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -# Build the installer payload around an already built daemon payload. -# .\tools\build-installer.ps1 [-Daemon out\tailscale.elf] [-Send] -param( - [string]$Daemon = 'out\tailscale.elf', - [string]$Out = 'out\tailscale-installer.elf', - [switch]$Send, - [int]$Seconds = 70 -) - -$ErrorActionPreference = 'Stop' -. (Join-Path $PSScriptRoot 'env.ps1') - -$daemonPath = (Resolve-Path (Join-Path $DevRoot $Daemon)).Path -replace '\\', '/' -$assets = (Join-Path $DevRoot 'installer\assets') -replace '\\', '/' -$outPath = Join-Path $DevRoot $Out - -# The app installer library only loads when these come with it, in this -# order (as in the SDK's install_app sample). With libSceAppInstUtil alone -# the payload never starts: the loader leaves it stopped. -Invoke-PS5CC -O2 -Wall "-DDAEMON_ELF=`"$daemonPath`"" "-DASSET_DIR=`"$assets`"" ` - -lSceIpmi -lSceAppInstUtil -lSceUserService -lSceSystemService ` - -o $outPath (Join-Path $DevRoot 'installer\main.c') - -Write-Host ("built {0} ({1:N1} MB)" -f $outPath, ((Get-Item $outPath).Length / 1MB)) -if ($Send) { - & (Join-Path $PSScriptRoot 'ps5send.ps1') -File $outPath -Seconds $Seconds -} diff --git a/tools/build-payload.ps1 b/tools/build-payload.ps1 index 52c534a..10cf695 100644 --- a/tools/build-payload.ps1 +++ b/tools/build-payload.ps1 @@ -1,4 +1,5 @@ # Build a Go program for the PS5 and wrap it in the launcher payload. +# .\tools\build-payload.ps1 -GoDir tsd -Name tailscale -Version 0.4.1 -HomeIcon # .\tools\build-payload.ps1 -GoDir probe-go -Name probe [-DebugLoader] [-Watchdog 120] [-Send] param( [Parameter(Mandatory = $true)][string]$GoDir, @@ -9,6 +10,7 @@ param( [string]$MaxProcs = '', # GOMAXPROCS for the Go program (launcher default: 4) [string]$GoDebug = '', # GODEBUG value baked into the launcher [int]$Watchdog = 0, # test builds: kill the process after this many seconds + [switch]$HomeIcon, # embed the helper that adds the home screen icon on first run [switch]$DebugLoader, # print loader details and early crash registers [switch]$KeepSymbols, [switch]$Send, @@ -39,7 +41,20 @@ if ($DebugLoader) { $ccArgs += '-DGOLOAD_DEBUG' } if ($Watchdog -gt 0) { $ccArgs += "-DGOLOAD_WATCHDOG=$Watchdog" } if ($MaxProcs) { $ccArgs += "-DGO_MAXPROCS=`"$MaxProcs`"" } if ($GoDebug) { $ccArgs += "-DGO_DEBUG=`"$GoDebug`"" } -$ccArgs += @('-o', $elf, (Join-Path $DevRoot 'launcher\main.c'), (Join-Path $DevRoot 'launcher\goload.c')) +if ($HomeIcon) { + # The icon helper is a payload of its own. The app installer library only + # loads when these come with it, in this order (as in the SDK's + # install_app sample); with libSceAppInstUtil alone the payload is never + # started. + $helper = Join-Path $out 'appicon.elf' + $assets = (Join-Path $DevRoot 'appicon') -replace '\\', '/' + Invoke-PS5CC -O2 -Wall "-DASSET_DIR=`"$assets`"" ` + -lSceIpmi -lSceAppInstUtil -lSceUserService -lSceSystemService ` + -o $helper (Join-Path $DevRoot 'appicon\main.c') + $ccArgs += "-DICON_HELPER=`"$($helper -replace '\\', '/')`"" +} +$ccArgs += @('-o', $elf, (Join-Path $DevRoot 'launcher\main.c'), (Join-Path $DevRoot 'launcher\goload.c'), + (Join-Path $DevRoot 'launcher\homeicon.c')) Invoke-PS5CC @ccArgs Write-Host ("built {0} ({1:N1} MB)" -f $elf, ((Get-Item $elf).Length / 1MB)) diff --git a/tsd/main.go b/tsd/main.go index b0da42a..e98f4ab 100644 --- a/tsd/main.go +++ b/tsd/main.go @@ -122,6 +122,9 @@ type daemon struct { quit chan struct{} quitOnce sync.Once + // removeDataOnExit is set by Uninstall: delete the data directory once + // everything that writes to it has shut down. + removeDataOnExit bool } func (d *daemon) run() error { @@ -204,6 +207,13 @@ func (d *daemon) run() error { d.logf("shutdown timed out") } d.logf("stopped") + + d.mu.Lock() + remove := d.removeDataOnExit + d.mu.Unlock() + if remove { + os.RemoveAll(dataDir) + } return nil } diff --git a/tsd/status.html b/tsd/status.html index e2d1c09..572acf7 100644 --- a/tsd/status.html +++ b/tsd/status.html @@ -239,11 +239,8 @@ $('btn-sunshine').onclick = async () => { await act('/api/sunshine?host=' + encodeURIComponent($('sunshine-select').value)); $('sunshine-select').dataset.signature = ''; }; -$('btn-uninstall').onclick = () => { - if (!confirm('Remove Tailscale from this PS5? It stops now and its payload is deleted.')) return; - const purge = confirm('Also log out and delete the saved login?\n\nOK: delete everything.\nCancel: keep the login, so reinstalling reconnects without logging in again.'); - act('/api/uninstall' + (purge ? '?purge=1' : '')); -}; +$('btn-uninstall').onclick = () => act('/api/uninstall', + 'Remove Tailscale from this PS5?\n\nThis logs the console out of your tailnet, deletes its settings and logs, and stops Tailscale.'); $('logbox').addEventListener('toggle', refresh); refresh(); diff --git a/tsd/uninstall.go b/tsd/uninstall.go deleted file mode 100644 index 7783e1e..0000000 --- a/tsd/uninstall.go +++ /dev/null @@ -1,30 +0,0 @@ -package main - -import ( - "errors" - "io/fs" - "os" - "path/filepath" -) - -// daemonFileName is the name the installer stores the daemon payload under, -// in the data directory. -const daemonFileName = "tailscale.elf" - -// uninstall deletes the installed daemon payload. With purge it also deletes -// the Tailscale state and config, which forgets the login. The running -// process is not affected. -func uninstall(purge bool) error { - var errs []error - if err := os.Remove(filepath.Join(dataDir, daemonFileName)); err != nil && !errors.Is(err, fs.ErrNotExist) { - errs = append(errs, err) - } - if purge { - for _, name := range []string{"state", "config.json", ".cache"} { - if err := os.RemoveAll(filepath.Join(dataDir, name)); err != nil { - errs = append(errs, err) - } - } - } - return errors.Join(errs...) -} diff --git a/tsd/web.go b/tsd/web.go index 2427371..8aaa204 100644 --- a/tsd/web.go +++ b/tsd/web.go @@ -302,22 +302,20 @@ func (d *daemon) stop() { d.quitOnce.Do(func() { close(d.quit) }) } -// handleUninstall removes the installed payload, then stops. With ?purge=1 it -// first logs the console out of the tailnet and deletes the saved state as -// well. +// handleUninstall logs the console out of the tailnet and stops the daemon, +// which deletes its data directory (login, settings, logs) on the way out. +// The payload file itself is wherever the user keeps it, and the home screen +// icon can only be deleted from the home screen. func (d *daemon) handleUninstall(w http.ResponseWriter, r *http.Request) { - purge := r.URL.Query().Get("purge") == "1" - if purge && d.lc != nil { + if d.lc != nil { if err := d.lc.Logout(r.Context()); err != nil { d.logf("uninstall: logout: %v", err) } } - if err := uninstall(purge); err != nil { - d.logf("uninstall: %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - d.logf("uninstalled (purge=%v)", purge) + d.logf("uninstall requested from the status page") + d.mu.Lock() + d.removeDataOnExit = true + d.mu.Unlock() notify("Tailscale was removed from this PS5.") io.WriteString(w, "uninstalled\n") d.stop()