# Copyright 2021-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit pam systemd

DESCRIPTION="Collection of common network programs"
HOMEPAGE="https://www.gnu.org/software/inetutils/"
SRC_URI="mirror://gnu/${PN}/${P}.tar.xz"

LICENSE="GPL-3+"
SLOT="0"
KEYWORDS="amd64"

SERVERS="ftpd inetd rexecd rlogind rshd syslogd talkd telnetd tftpd uucpd"
CLIENTS="ftp dnsdomainname hostname ping ping6 rcp rexec rlogin rsh logger telnet tftp whois ifconfig traceroute"
PROGRAMS="${SERVERS} ${CLIENTS}"
IUSE="idn kerberos pam tcpd ${PROGRAMS}"

DEPEND="
	sys-libs/readline:0=
	ftpd? ( virtual/libcrypt:0= )
	idn? ( net-dns/libidn2:= )
	kerberos? ( virtual/krb5 )
	pam? ( sys-libs/pam )
	tcpd? ( sys-apps/tcp-wrappers )
	uucpd? ( virtual/libcrypt:0= )
"
RDEPEND="${DEPEND}
	ftpd? ( net-ftp/ftpbase[pam?] )
	ftp? ( !net-ftp/ftp )
	dnsdomainname? ( !sys-apps/net-tools )
	hostname? ( !sys-apps/coreutils[hostname(-)] !sys-apps/net-tools[hostname(+)] )
	inetd? ( !sys-apps/netkit-base )
	ping? ( !net-misc/iputils )
	ping6? ( !net-misc/iputils[ipv6(+)] )
	rcp? ( !net-misc/netkit-rsh )
	rexec? ( !net-misc/netkit-rsh )
	rlogin? ( !net-misc/netkit-rsh )
	rsh? ( !net-misc/netkit-rsh )
	logger? ( !sys-apps/util-linux[logger(+)] )
	syslogd? ( !app-admin/sysklogd )
	telnet? ( !net-misc/telnet-bsd !net-misc/netkit-telnetd )
	telnetd? ( !net-misc/telnet-bsd !net-misc/netkit-telnetd )
	tftp? ( !net-ftp/tftp-hpa )
	whois? ( !net-misc/whois )
	ifconfig? ( !sys-apps/net-tools )
	traceroute? ( !net-analyzer/traceroute )
"

QA_CONFIG_IMPL_DECL_SKIP=( MIN static_assert alignof unreachable )

src_configure() {
	local myconf=(
		--localstatedir="${EPREFIX}/var"
		--disable-clients
		--disable-servers
		$(use_with idn)
		--without-krb4
		$(use_with kerberos krb5)
		--without-shishi
		$(use_with pam)
		$(use_with tcpd wrap)
	)

	local prog
	for prog in ${PROGRAMS}; do
		myconf+=( $(use_enable "${prog}") )
	done

	econf "${myconf[@]}"
}

iu_pamd() {
	if use "$1"; then
		pamd_mimic system-remote-login "$2" auth account password session
	fi
}

create_init() {
	use "$1" || return

	newinitd - "$1" <<-EOF
	#!${EPREFIX}/sbin/openrc-run
	command="${EPREFIX}/usr/libexec/$1"
	command_args="$2"
	pidfile="${EPREFIX}/var/run/$1.pid"
	EOF

	systemd_newunit - "$1.service" <<-EOF
	[Service]
	ExecStart="${EPREFIX}/usr/libexec/$1"${2:+ }$2
	PIDFile=${EPREFIX}/var/run/$1.pid
	Type=forking

	[Install]
	WantedBy=multi-user.target
	EOF
}

create_socket_stream() {
	use "$1" || return

	systemd_newunit - "$1.socket" <<-EOF
	[Socket]
	ListenStream=$2
	Accept=yes

	[Install]
	WantedBy=sockets.target
	EOF

	systemd_newunit - "$1@.service" <<-EOF
	[Unit]
	CollectMode=inactive-or-failed

	[Service]
	ExecStart="${EPREFIX}/usr/libexec/$1"
	StandardInput=socket
	StandardError=journal
	EOF
}

create_socket_datagram() {
	use "$1" || return

	systemd_newunit - "$1.socket" <<-EOF
	[Socket]
	ListenDatagram=$2

	[Install]
	WantedBy=sockets.target
	EOF

	systemd_newunit - "$1.service" <<-EOF
	[Service]
	ExecStart="${EPREFIX}/usr/libexec/$1"
	StandardInput=socket
	StandardError=journal
	EOF
}

src_install() {
	default
	iu_pamd rexecd rexec
	iu_pamd rlogind rlogin
	iu_pamd rshd rsh
	if use kerberos; then
		iu_pamd rlogind krlogin
		iu_pamd rshd krsh
	fi

	create_init ftpd --daemon
	create_init inetd
	create_init rlogind --daemon
	create_init syslogd

	create_socket_stream ftpd 21
	create_socket_stream rexecd 512
	create_socket_stream rlogind 513
	create_socket_stream rshd 514
	create_socket_stream telnetd 23
	create_socket_stream uucpd 540

	create_socket_datagram talkd 518
}