Reimplementazione fedele di cellar-cli.py (enne2/cellar @ f5216b1) in C99 POSIX.1-2008, mono-thread, senza dipendenze esterne: miniz e' vendored per deflate/inflate raw, mentre contenitore gzip, multipart/form-data in streaming, tar PAX/ustar, JSON e client HTTP/1.1 sono scritti a mano. - 7 comandi (list, upload, download, install, scan-local, wizard-upload, wizard-install) con stdout/stderr/exit code identici al client Python - 30/30 test di parita' (tests/parity_test.sh) contro due server mock indipendenti: output a confronto, alberi installati, interop tar con tarfile di Python e con GNU tar, archivio C equivalente a quello Python - build statiche x86-64 / i686 / aarch64: nessun simbolo GLIBC richiesto, nessuna syscall moderna (statx/openat2/memfd_create/getrandom), LFS 64 bit, resolver DNS di riserva (hosts + query UDP) per glibc statica senza NSS - miglioramento rispetto all'originale: upload multipart in streaming invece di leggere l'intero archivio in RAM - divergenze volute documentate nel README (help piu' sintetico, mtime dei symlink non ripristinato come tarfile, EOF nei prompt, niente TLS) Build: make | make 32 | make arm64 | make test | make verify
45 lines
1.4 KiB
Bash
Executable File
45 lines
1.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Crea una bottiglia finta con i casi difficili: symlink (anche rotto), nomi
|
|
# lunghi (>100 char, per i record PAX "path"), UTF-8, spazi/apici, permessi
|
|
# insoliti e mtime fissi.
|
|
set -euo pipefail
|
|
|
|
dir="${1:?uso: make_fake_bottle.sh <dir-bottles>}"
|
|
bottle="$dir/Fake Bottle"
|
|
rm -rf "$bottle"
|
|
mkdir -p "$bottle/drive_c/Program Files/Game" "$bottle/dosdevices"
|
|
|
|
cat > "$bottle/bottle.yml" <<'YML'
|
|
Name: 'Fake Bottle'
|
|
Runner: soda-9.0-1
|
|
Arch: win32
|
|
Windows: win10
|
|
Environment: Gaming
|
|
YML
|
|
|
|
printf 'hello world\n' > "$bottle/drive_c/Program Files/Game/game.exe"
|
|
printf 'config\n' > "$bottle/drive_c/config.ini"
|
|
printf 'binario\n' > "$bottle/drive_c/program"
|
|
head -c 4096 /dev/urandom > "$bottle/drive_c/blob.bin"
|
|
printf 'unicode\n' > "$bottle/drive_c/perché.txt"
|
|
|
|
longname="$bottle/drive_c/$(python3 -c 'print("a"*110)').txt"
|
|
printf 'long path\n' > "$longname"
|
|
|
|
mkdir -p "$bottle/nested/deep/deeper"
|
|
printf 'deep\n' > "$bottle/nested/deep/deeper/file.txt"
|
|
|
|
ln -s "config.ini" "$bottle/drive_c/link_to_config"
|
|
ln -s "/nonexistent/target" "$bottle/drive_c/broken_link"
|
|
ln -s "../drive_c/config.ini" "$bottle/dosdevices/c_drive"
|
|
|
|
chmod 750 "$bottle/nested"
|
|
chmod 600 "$bottle/drive_c/config.ini"
|
|
chmod 755 "$bottle/drive_c/program"
|
|
|
|
# mtime fissi (con frazione) per verificare i record PAX mtime
|
|
touch -d '2026-03-14 01:12:37.123456789' "$bottle/drive_c/config.ini"
|
|
touch -d '2020-01-02 03:04:05' "$bottle/bottle.yml"
|
|
|
|
echo "$bottle"
|