SHELL := /bin/bash CC := cc CFLAGS := -Wall -O2 TARGET := fa2json SRCS := fs-watcher.c json-writer.c .PHONY: all test clean all: $(TARGET) $(TARGET): $(SRCS) $(CC) $(CFLAGS) -o $@ $^ # Requires root (fanotify FID + mount needs CAP_SYS_ADMIN). # Loop device and mount are cleaned up automatically on exit. # If the test aborts unexpectedly, check: losetup -l and /proc/mounts test: $(TARGET) @set -euo pipefail; \ IMG=""; MNTDIR=""; LOOPDEV=""; FA2JSON_PID=""; \ cleanup() { \ [ -n "$$FA2JSON_PID" ] && { kill "$$FA2JSON_PID" 2>/dev/null; wait "$$FA2JSON_PID" 2>/dev/null || true; }; \ [ -n "$$MNTDIR" ] && umount "$$MNTDIR" 2>/dev/null || true; \ [ -n "$$LOOPDEV" ] && losetup -d "$$LOOPDEV" 2>/dev/null || true; \ [ -n "$$IMG" ] && rm -f "$$IMG"; \ [ -n "$$MNTDIR" ] && rmdir "$$MNTDIR" 2>/dev/null || true; \ }; \ trap cleanup EXIT; \ IMG=$$(mktemp /tmp/fa2json-test-XXXXXX.img); \ MNTDIR=$$(mktemp -d /tmp/fa2json-mnt-XXXXXX); \ echo "--- Creating 10M ext4 image ---"; \ dd if=/dev/zero of="$$IMG" bs=1M count=10 status=none; \ mkfs.ext4 -q "$$IMG"; \ LOOPDEV=$$(losetup --find --show "$$IMG"); \ mount "$$LOOPDEV" "$$MNTDIR"; \ echo "--- Starting fa2json on $$MNTDIR ---"; \ ./$(TARGET) "$$MNTDIR" & FA2JSON_PID=$$!; \ sleep 0.3; \ echo "--- Filesystem operations ---"; \ mkdir "$$MNTDIR/dir_a"; \ touch "$$MNTDIR/file_a.txt"; \ echo "content" >> "$$MNTDIR/file_a.txt"; \ mkdir "$$MNTDIR/dir_b"; \ touch "$$MNTDIR/dir_b/nested.txt"; \ mv "$$MNTDIR/file_a.txt" "$$MNTDIR/file_b.txt"; \ mv "$$MNTDIR/dir_b" "$$MNTDIR/dir_a/dir_b_moved"; \ chmod 600 "$$MNTDIR/file_b.txt"; \ touch -m "$$MNTDIR/file_b.txt"; \ chmod 755 "$$MNTDIR/dir_a"; \ rm "$$MNTDIR/file_b.txt"; \ rm "$$MNTDIR/dir_a/dir_b_moved/nested.txt"; \ rm -rf "$$MNTDIR/dir_a"; \ sleep 0.3; \ echo "--- Done ---" clean: rm -f $(TARGET)