023f86dc58
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
89 lines
1.9 KiB
Bash
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"
|