Files
ports/sysutils/spiped/files/spiped.in
T
Colin Percival 023f86dc58 sysutils/spiped: Clean up UNIX sockets
When a TCP socket is closed, it becomes possible to create a new
socket listening on the same address; the behaviour of UNIX (aka
"local") sockets is different, in that an inode remains even after
it is closed, and blocks the creation of a new socket with the same
address.

When spiped is launched with a UNIX socket as its source address,
delete any existing socket with that address first.  This makes it
possible to "service spiped restart" when UNIX sockets are used.

Deleting the socket when stopping spiped would also work for the
case of restarting the daemon, but not for the case of starting the
daemon after an unclean system shutdown; so deleting only prior to
starting the daemon seemed like the better option.

PR:	295432
Reported by:	feld
2026-06-29 14:47:14 -07:00

89 lines
1.9 KiB
Bash

#!/bin/sh
# PROVIDE: spiped
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
# to enable this service:
#
# spiped_enable: Set to YES to enable spiped.
# spiped_uid: User for spiped process (default "spiped").
# spiped_gid: Group for spiped process (default "spiped").
# spiped_pipes: List of names of pipes to create.
# spiped_pipe_X_mode: "encrypt"/"client" or "decrypt"/"server".
# spiped_pipe_X_source: Source address of pipe X.
# spiped_pipe_X_target: Target address of pipe X.
# spiped_pipe_X_key: Key file for pipe X.
# spiped_pipe_X_flags: Optional flags for pipe X. See spiped(1) for details.
. /etc/rc.subr
name="spiped"
rcvar=spiped_enable
load_rc_config $name
: ${spiped_enable="NO"}
: ${spiped_uid="spiped"}
: ${spiped_gid="spiped"}
command=%%PREFIX%%/bin/${name}
start_cmd="${name}_start"
stop_cmd="${name}_stop"
spiped_start()
{
local P PIDFILE MODE SOURCE TARGET KEY MODEFLAG
for P in ${spiped_pipes}; do
PIDFILE=/var/run/spiped_${P}.pid
eval MODE=\$spiped_pipe_${P}_mode
eval SOURCE=\$spiped_pipe_${P}_source
eval TARGET=\$spiped_pipe_${P}_target
eval KEY=\$spiped_pipe_${P}_key
eval FLAGS=\$spiped_pipe_${P}_flags
case "$MODE" in
encrypt | client)
MODEFLAG="-e"
;;
decrypt | server)
MODEFLAG="-d"
;;
*)
echo Invalid value for spiped_pipe_${P}_mode: $MODE
continue
esac
case "$SOURCE" in
/*)
[ -S "$SOURCE" ] && rm -f "$SOURCE"
;;
esac
${command} -D $MODEFLAG -s $SOURCE -t $TARGET -k $KEY \
-u ${spiped_uid}:${spiped_gid} -p $PIDFILE $FLAGS
done
}
spiped_stop()
{
local P PIDFILE
for P in ${spiped_pipes}; do
PIDFILE=/var/run/spiped_${P}.pid
if [ -f $PIDFILE ] ; then
rc_pid=$(check_pidfile $PIDFILE $command)
fi
if [ -z "$rc_pid" ]; then
[ -n "$rc_fast" ] && return 0
_run_rc_notrunning
return 1
fi
echo "Stopping ${name}."
kill $sig_stop $rc_pid
wait_for_pids $rc_pid
rm $PIDFILE
done
}
run_rc_command "$1"