From 19a8f7ccc9afa87ebcf5153f56ce8a5bc8e5f9fc Mon Sep 17 00:00:00 2001 From: JGZYES Date: Thu, 3 Sep 2026 13:09:41 +0800 Subject: [PATCH] install: self-extract deb (ar->data.tar.gz->/) and rpm (rpm2cpio->cpio->/) payload, no format conversion; alien only as last resort --- src/install.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/install.c b/src/install.c index f112a16..3997fd2 100644 --- a/src/install.c +++ b/src/install.c @@ -237,19 +237,23 @@ static int install_path(const char *path, const char *name) { } if (has_suffix(bname, ".deb") && os == OS_LINUX) { - /* Debian native dpkg; elsewhere (e.g. CentOS) convert via alien */ + /* Self-extract: dpkg native, else pull data.tar.gz via ar and unpack to /, + * else convert via alien. No format-conversion bloat required. */ snprintf(cmd, sizeof(cmd), "if command -v dpkg >/dev/null 2>&1; then sudo dpkg -i \"%s\"; " + "elif command -v ar >/dev/null 2>&1; then T=$(mktemp -d); " + "(cd \"$T\" && ar p \"%s\" data.tar.gz | tar -xzf -); sudo cp -a \"$T\"/. /; rm -rf \"$T\"; " "elif command -v alien >/dev/null 2>&1; then sudo alien -i \"%s\"; " - "else echo 'pmm: need alien to install .deb here (sudo apt-get install alien | sudo yum install alien)' 1>&2; exit 1; fi", - path, path); + "else echo 'pmm: need dpkg, ar+tar or alien for .deb' 1>&2; exit 1; fi", + path, path, path); } else if (has_suffix(bname, ".rpm") && os == OS_LINUX) { - /* RPM-based native rpm; elsewhere (e.g. Debian) convert via alien */ + /* Self-extract: rpm native, else rpm2cpio+cpio the payload into /, else alien. */ snprintf(cmd, sizeof(cmd), "if command -v rpm >/dev/null 2>&1; then sudo rpm -Uvh \"%s\"; " + "elif command -v rpm2cpio >/dev/null 2>&1; then sudo rpm2cpio \"%s\" | (cd / && sudo cpio -idm --quiet); " "elif command -v alien >/dev/null 2>&1; then sudo alien -i \"%s\"; " - "else echo 'pmm: need alien to install .rpm here (sudo apt-get install alien)' 1>&2; exit 1; fi", - path, path); + "else echo 'pmm: need rpm, rpm2cpio+cpio or alien for .rpm' 1>&2; exit 1; fi", + path, path, path); } else if (has_suffix(bname, ".apk") && os == OS_LINUX) { /* Alpine: apk add if available, else extract */ snprintf(cmd, sizeof(cmd),