#!/bin/sh
#
# SPDX-License-Identifier: GPL-2.0-only
#

### BEGIN INIT INFO
# Provides:          sendsigs
# Required-Start:    
# Required-Stop:     umountnfs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Kill all remaining processes.
# Description: 
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

# The nexus server uninitializes the platform when it is asked to stop, while
# the driver's kernel threads keep running against it. That takes the box down
# before it can reset. Leave it to the KILL signal, which runs no handler.
keep=
omit=
for pid in $(pidof nxserver 2>/dev/null); do
	keep="$keep $pid"
	omit="$omit -o $pid"
done

# Kill all processes.
echo "Sending all processes the TERM signal..."
killall5 -15 $omit

# Wait until they ended. Init, kernel threads, zombies, this session and the
# processes kept above are left out.
others_left() {
	for d in /proc/[0-9]*; do
		case "$keep " in *" ${d#/proc/} "*) continue ;; esac
		read -r line < "$d/stat" || continue
		set -- ${line##*) }
		[ "${d#/proc/}" = 1 ] || [ "$2" = 0 ] || [ "$2" = 2 ] || [ "$1" = Z ] || [ "$4" = "$sid" ] || return 0
	done 2>/dev/null
	return 1
}
read -r line < /proc/$$/stat
set -- ${line##*) }
sid=$4
i=0
while [ $i -lt 50 ] && others_left; do
	sleep 0.1
	i=$(($i + 1))
done
echo "Sending all processes the KILL signal..."
killall5 -9

: exit 0
