#!/bin/sh

# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Timeouts in msec
readonly SIGTERM_TIMEOUT=2500
readonly SIGKILL_TIMEOUT=2000

# Where to write debug logs to.
LOGPATH="/var/log/shutdown_force_kill_processes"

# Send SIGTERM once to all processes that match regex in $1, then wait for
# them all to terminate.  If processes matching $1 are still running after
# SIGTERM_TIMEOUT msec they are all sent SIGKILL once.  If processes matching
# $1 are still present after SIGKILL_TIMEOUT msec a message is logged.
term_process() {
  local process="$1"

  pkill "${process}"
  local pid i=0
  while [ "${i}" -lt "${SIGTERM_TIMEOUT}" ]; do
    pid="$(pgrep "${process}")"
    if [ $? -ne 0 ] ; then
      return
    fi
    sleep .1
    : "$(( i += 100 ))"
  done

  logger -t "term_process(${process})" \
      "PIDs [${pid}] did not terminate, sending SIGKILL"
  echo "term_process(${process})" \
      "PIDs [${pid}] did not terminate, sending SIGKILL"

  pkill -KILL "${process}"
  i=0
  while [ "${i}" -lt "${SIGKILL_TIMEOUT}" ]; do
    pid="$(pgrep "${process}")"
    if [ $? -ne 0 ] ; then
      return
    fi
    sleep .1
    : "$(( i += 100 ))"
  done
  logger -t "term_process(${process})" "PIDs [${pid}] not dead after SIGKILL"
  echo "term_process(${process})" "PIDs [${pid}] not dead after SIGKILL"
}

# Parses the output of `lsof -Fn` in the format (p<pid>\n(n<filename>\n)*)*,
# and returns the list of <pid>s that were followed by some filename matching
# the regex argument $1. This is an utility function for use in
# kill_with_open_files_on_path_and_mountpoints().
_lsofFn_filter() {
  sed -n -E -e "
    # Hold all the most recent 'p' line in the buffer.
    /^p/h
    # Look for a matching 'n' line.  Pick % as it's unlikely to be in a path.
    # Enclose $1 by parentheses so that the caller can pass in regular
    # expressions like /home|/foo.
    \\%^n($1)%{
      # Get the last 'p' line out of the buffer.
      g
      # Delete the leading 'p'.
      s:^p::
      # Print it.
      p
    }
  " | sort -u
}

# For a given path pattern regex (the first argument) and given mountpoints
# (the rest), this will kill all processes with open files on that mountpoint
# with its path matches the regex, so that it can be unmounted. It starts off
# by sending a TERM and if the process hasn't exited quickly enough it will
# send KILL.
#
# Since a typical shutdown should have no processes with open files on a
# partition that we care about at this point, we log the set of processes
# to /var/log/shutdown_force_kill_processes
kill_with_open_files_on_path_and_mountpoints() {
  local pids pid i
  local path_regex="$1"
  shift

  pids="$(lsof -n -Fn "$@" | _lsofFn_filter "${path_regex}")"
  if [ -z "${pids}" ] ; then
    return  # The typical case; no open files at this point.
  fi

  # pids should have been empty. Since it is not, we log for future inspection.
  lsof -n "$@" >"${LOGPATH}"

  # First try a gentle kill -TERM
  for i in 1 2 3 4 5 6 7 8 9 10; do
    for pid in ${pids} ; do
      ! kill -TERM "${pid}"
    done
    pids="$(lsof -n -Fn "$@" | _lsofFn_filter "${path_regex}")"
    if [ -z "${pids}" ] ; then
      return
    fi
    sleep .1
  done

  # Now kill -KILL as necessary
  for i in 1 2 3 4 5 6 7 8 9 10; do
    for pid in ${pids} ; do
      ! kill -KILL "${pid}"
    done
    pids=$(lsof -n -Fn "$@" | _lsofFn_filter "${path_regex}")
    if [ -z "${pids}" ] ; then
      return
    fi
    sleep .1
  done
}

# For a given mountpoint, this will kill all processes with open files
# on that mountpoint so that it can be unmounted. It starts off by sending
# a TERM and if the process hasn't exited quickly enough it will send KILL.
kill_with_open_files_on() {
  kill_with_open_files_on_path_and_mountpoints . "$@"
}
