Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01NQRTGoYgnZQsh7uCh6Jsxm
32 lines
1.2 KiB
Bash
Executable File
32 lines
1.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# mkramdisk.sh - Create a USTAR tar archive for the MontaukOS ramdisk
|
|
# Usage: ./scripts/mkramdisk.sh [input_dir] [output_path]
|
|
|
|
set -e
|
|
|
|
INPUT_DIR="${1:-programs/bin}"
|
|
OUTPUT_PATH="${2:-ramdisk.tar}"
|
|
|
|
if [ ! -d "$INPUT_DIR" ]; then
|
|
echo "mkramdisk: input directory '$INPUT_DIR' does not exist, creating empty ramdisk"
|
|
mkdir -p "$INPUT_DIR"
|
|
# Create a placeholder file so the tar isn't completely empty
|
|
echo "MontaukOS ramdisk" > "$INPUT_DIR/readme.txt"
|
|
fi
|
|
|
|
# Create USTAR tar archive.
|
|
#
|
|
# -h (dereference) is NOT optional: Fs/Ramdisk.cpp only recognises typeflag
|
|
# '5' (directory), so a symlink entry unpacks as a zero-length regular file --
|
|
# silently, with no error anywhere. A staged tree containing symlinks would
|
|
# ship empty files. Copying the target in is the only faithful representation.
|
|
tar --format=ustar -h -cf "$OUTPUT_PATH" -C "$INPUT_DIR" .
|
|
|
|
if tar -tvf "$OUTPUT_PATH" | grep -q '^l'; then
|
|
echo "mkramdisk: ERROR: symlink survived into $OUTPUT_PATH (would unpack as an empty file)" >&2
|
|
tar -tvf "$OUTPUT_PATH" | grep '^l' >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "mkramdisk: created $OUTPUT_PATH from $INPUT_DIR ($(wc -c < "$OUTPUT_PATH") bytes)"
|