#!/usr/bin/env bash
#
# Copyright (C) 2026 Masatake YAMATO <yamato@redhat.com>
#
# This file is part of util-linux.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This file is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
TS_TOPDIR="${0%/*}/../.."

# UDPLITE was retired in Linux 7.1-rc1.
# We move UDP-Lite related test parts here from the
# option-inet test case. So we can make UDP-Lite related
# test parts optional where UDPLITE is not available.
TS_DESC="--inet option for UDPLITE"


. "$TS_TOPDIR"/functions.sh

ts_init "$*"
ts_skip_qemu_user
ts_skip_docker

ts_check_test_command "$TS_CMD_LSFD"
ts_check_test_command "$TS_HELPER_MKFDS"
ts_check_ipv6

ts_check_prog "mkfifo"

ts_cd "$TS_OUTDIR"

. "$TS_SELF/lsfd-functions.bash"

readonly -a UDP_ARGS=(3 4
		      lite=1
		      server-port=34567
		      client-port=23456
		      server-do-bind=1
		      client-do-bind=1
		      client-do-connect=1)

lsfd_check_udp_lite 4
lsfd_check_udp_lite 6

FIFO=./test_mkfds-option-inet-udplite.fifo
{
    rm -f "${FIFO}"
    if ! mkfifo "${FIFO}"; then
	ts_finalize  "failed in creating a fifo"
    fi

    "$TS_HELPER_MKFDS" -X ro-regular-file 3 file=/etc/passwd > "${FIFO}" &
    if ! read PID0  < "${FIFO}"; then
	rm "${FIFO}"
	ts_finalize  "$TS_HELPER_MKFDS ro-regular-file...doesn't report its pid"
    fi

    "$TS_HELPER_MKFDS" -X udp "${UDP_ARGS[@]}" > "${FIFO}" &
    if ! read PID1  < "${FIFO}"; then
	kill -CONT "${PID0}"
	wait       "${PID0}"
	rm "${FIFO}"
	ts_finalize  "$TS_HELPER_MKFDS udp lite=1...doesn't report its pid"
    fi

    "$TS_HELPER_MKFDS" -X udp6 "${UDP_ARGS[@]}" > "${FIFO}" &
    if ! read PID2  < "${FIFO}"; then
	kill -CONT "${PID0}" "${PID1}"
	wait       "${PID0}" "${PID1}"
	rm "${FIFO}"
	ts_finalize  "$TS_HELPER_MKFDS udp6 lite=1...doesn't report its pid"
    fi

    OPT='--inet'
    echo "# $OPT"
    ${TS_CMD_LSFD} -n \
		   $OPT \
		   -o ASSOC,TYPE,NAME \
		   -Q "(PID == $PID0) or (PID == $PID1) or (PID == $PID2)"

    OPT='--inet=4'
    echo "# $OPT"
    ${TS_CMD_LSFD} -n \
		   $OPT \
		   -o ASSOC,TYPE,NAME \
		   -Q "(PID == $PID0) or (PID == $PID1) or (PID == $PID2)"

    OPT='--inet=6'
    echo "# $OPT"
    ${TS_CMD_LSFD} -n \
		   $OPT \
		   -o ASSOC,TYPE,NAME \
		   -Q "(PID == $PID0) or (PID == $PID1) or (PID == $PID2)"

    kill -CONT "${PID0}" "${PID1}" "${PID2}"
    if ! wait  "${PID0}" "${PID1}" "${PID2}"; then
	echo PID0: ${PID0}
	echo PID1: ${PID1}
	echo PID2: ${PID2}
    fi

    rm "${FIFO}"
} > "$TS_OUTPUT" 2>&1

ts_finalize
