#
# initscript   Executed by init(8) for every program it
#              wants to spawn like this:
#
#              /bin/sh /etc/initscript <id> <level> <action> <process>
#
# Set ulimits from sysconfig
# (c) garloff@suse.de, 1996, 2003
# License: Artistic

# Set umask to safe level, and set ulimits
umask 022
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH
unset HARGS SARGS SARGS2

if test -r /etc/sysconfig/ulimit; then
  . /etc/sysconfig/ulimit
  # Max CPU time (not recommended)
  test -z "$HARDCPULIMIT" -o "$HARDCPULIMIT" = "0" ||
  HARGS="-Ht $HARDCPULIMIT"
  test -z "$SOFTCPULIMIT" -o "$SOFTCPULIMIT" = "0" ||
  SARGS="-St $SOFTCPULIMIT"
  # File descriptors
  test -z "$HARDFDLIMIT" -o "$HARDFDLIMIT" = "0" ||
  HARGS="$HARGS -Hn $HARDFDLIMIT"
  test -z "$SOFTFDLIMIT" -o "$SOFTFDLIMIT" = "0" ||
  SARGS2="$SARGS2 -Sn $SOFTFDLIMIT"
  # Core files (0 makes sense here!)
  test -z "$HARDCORELIMIT" ||
  HARGS="$HARGS -Hc $HARDCORELIMIT"
  test -z "$SOFTCORELIMIT" ||
  SARGS="$SARGS -Sc $SOFTCORELIMIT"
  # File sizes
  test -z "$HARDFILESZLIMIT" -o "$HARDFILESZLIMIT" = "0" ||
  HARGS="$HARGS -Hf $HARDFILESZLIMIT"
  test -z "$SOFTFILESZLIMIT" -o "$SOFTFILESZLIMIT" = "0" ||
  SARGS="$SARGS -Sf $SOFTFILESZLIMIT"
  # User processes
  test -z "$HARDPROCESSLIMIT" -o "$HARDPROCESSLIMIT" = "0" ||
  HARGS="$HARGS -Hu $HARDPROCESSLIMIT"
  test -z "$SOFTPROCESSLIMIT" -o "$SOFTPROCESSLIMIT" = "0" ||
  SARGS="$SARGS -Su $SOFTPROCESSLIMIT"
  # Apply
  test -z "$SARGS"  || ulimit $SARGS
  test -z "$HARGS"  || ulimit $HARGS
  test -z "$SARGS2" || ulimit $SARGS2
  unset HARGS SARGS SARGS2
fi

TOT=0
if test -r /proc/meminfo -a -r /etc/sysconfig/ulimit; then
  # Get memory & swap sizes to evaluate the percentages
  MEMTOT=0; SWPTOT=0
  while read tag num unit; do
    case $tag in
      MemTotal:)
	MEMTOT=$num
	;;
      SwapTotal:)
	SWPTOT=$num
	;;
    esac
  done < /proc/meminfo
  TOT=$(($MEMTOT+$SWPTOT))
fi

if test $TOT != 0; then
  unset NEW268LOCKLIMIT
  case $(uname -r) in
    2.[0-5].*|2.6.[0-7]|2.6.[0-7][.-]*)
	;;
    *)
	NEW268LOCKLIMIT=1
	;;
  esac

  # SINGLE process limits to prevent a process from killing the machine
  # by making it go OOM

  # Maximum No more than VIRTUALLIMIT % of all virtual memory
  test -z "$HARDVIRTUALLIMIT" -o "$HARDVIRTUALLIMIT" = "0" ||
  HARGS="-Hv $((($TOT+99)/100*$HARDVIRTUALLIMIT))"
  test -z "$SOFTVIRTUALLIMIT" -o "$SOFTVIRTUALLIMIT" = "0" ||
  SARGS="-Sv $((($TOT+99)/100*$SOFTVIRTUALLIMIT))"
  # Maximum resident size is $RESIDENTLIMIT % of physical RAM
  test -z "$HARDRESIDENTLIMIT" -o "$HARDRESIDENTLIMIT" = "0" ||
  HARGS="$HARGS -Hm $((($MEMTOT+99)/100*$HARDRESIDENTLIMIT))"
  test -z "$SOFTRESIDENTLIMIT" -o "$SOFTRESIDENTLIMIT" = "0" ||
  SARGS="$SARGS -Sm $((($MEMTOT+99)/100*$SOFTRESIDENTLIMIT))"
  # Limit locked mem to $LOCKLIMIT % of phys RAM
  test -z "$HARDLOCKLIMIT" -o "$HARDLOCKLIMIT" = "0" ||
  HARGS="$HARGS -Hl $((($MEMTOT+99)/100*$HARDLOCKLIMIT))"
  if test -z "$NEW268LOCKLIMIT"; then
    test -z "$SOFTLOCKLIMIT" -o "$SOFTLOCKLIMIT" = "0" ||
    SARGS="$SARGS -Sl $((($MEMTOT+99)/100*$SOFTLOCKLIMIT))"
  else
    test -z "$SOFTLOCKLIMIT" -o "$SOFTLOCKLIMIT" = "0" ||
    SARGS2="$SARGS2 -Sl $((($MEMTOT+99)/100*$SOFTLOCKLIMIT))"
  fi
  # Optional: Limit stack and data segment sizes ($STACKLIMIT, $DATALIMIT) 
  test -z "$HARDSTACKLIMIT" -o "$HARDSTACKLIMIT" = "0" || 
  HARGS="$HARGS -Hs $((($MEMTOT+99)/100*$HARDSTACKLIMIT))"
  test -z "$SOFTSTACKLIMIT" -o "$SOFTSTACKLIMIT" = "0" || 
  SARGS="$SARGS -Ss $((($MEMTOT+99)/100*$SOFTSTACKLIMIT))"
  test -z "$HARDDATALIMIT" -o "$HARDDATALIMIT" = "0" || 
  HARGS="$HARGS -Hd $((($MEMTOT+99)/100*$HARDDATALIMIT))"
  test -z "$SOFTDATALIMIT" -o "$SOFTDATALIMIT" = "0" || 
  SARGS="$SARGS -Sd $((($MEMTOT+99)/100*$SOFTDATALIMIT))"
  # Apply
  test -z "$SARGS"  || ulimit $SARGS
  test -z "$HARGS"  || ulimit $HARGS
  test -z "$SARGS2" || ulimit $SARGS2
  unset SARGS HARGS SARGS2
fi

# Execute the program.
eval exec "$4"

