#!/bin/sh
DIR="${1:-$(pwd)}"
cd "$DIR" 2>/dev/null
if [ $? -ne 0 ]; then
    echo "[X] 目录不存在: $DIR"
    exit 1
fi

KO_LIST=$(ls *.ko 2>/dev/null)
if [ -z "$KO_LIST" ]; then
    echo "[X] 当前目录没有 .ko 文件"
    exit 1
fi

if dmesg >/dev/null 2>&1; then
    HAVE_DMESG=1
else
    HAVE_DMESG=0
fi

PASS=0
FAIL=0
FAILED=""
total=$(echo "$KO_LIST" | wc -l)

echo "== 开始验证 $DIR 的 $total 个模块 =="

for m in $KO_LIST; do
    n="${m%.ko}"

    if [ "$HAVE_DMESG" = "1" ]; then
        start_lines=$(dmesg 2>/dev/null | wc -l)
    else
        start_lines=0
    fi

    insmod "./$m" 2>/dev/null
    rc=$?

    if [ $rc -eq 0 ]; then
        PASS=$((PASS+1))
        rmmod "$n" 2>/dev/null
    else
        FAIL=$((FAIL+1))
        FAILED="$FAILED $n"
        echo "[FAIL $rc] $n"
        if [ "$HAVE_DMESG" = "1" ]; then
            dmesg 2>/dev/null | tail -n +$((start_lines+1)) | grep -E 'Unknown symbol|not found|invalid|error|disagrees' | tail -3
        fi
        rmmod "$n" 2>/dev/null
    fi

    sleep 1
done

echo "== 结果: 成功 $PASS / 失败 $FAIL =="
if [ -n "$FAILED" ]; then
    echo "失败清单:${FAILED}"
fi

exit 0