#!/bin/sh
#++
# Copyright (c) 2008, Oracle. All rights reserved.
#
#    NAME
#      lockfile - OCM lockfile implementation
#
#    DESCRIPTION
#      when a system-wide lockfile utility is not available, we use this script
#
#    EXIT CODES
#      0 - Success
#      1 - Failure
#      2 - Missing argument(s)
#      3 - other...
#--

_binDir=/bin
_usrBinDir=/usr/bin

AWK=${_binDir}/awk
CAT=${_binDir}/cat
DATE=${_binDir}/date
ECHO=${_binDir}/echo

RM=${_binDir}/rm
RMF="$RM -f"

LN=${_binDir}/ln
LNS="$LN -s"

if [ -f ${_binDir}/cut ]
then
  CUT=${_binDir}/cut
elif [ -f ${_usrBinDir}/cut ]
then
  CUT=${_usrBinDir}/cut
fi

if [ -z "${CUT}" ] 
then
  exit 2
fi

if [ -f ${_binDir}/uname ]
then
    UNAME=${_binDir}/uname
elif [ -f ${_usrBinDir}/uname ]
then
    UNAME=${_usrBinDir}/uname
fi
if [ -z "${UNAME}" ] 
then
  exit 2
fi

PLATFORM=`$UNAME | $CUT -f1`

if [ $PLATFORM = "OSF1" ]
then
  if [ -z "${BIN_SH}" ]
  then
    BIN_SH=xpg4
    export BIN_SH
    $0 "$@"
    exit $?
  fi
fi

if [ "$PLATFORM" = "SunOS" ]
then
  AWK=/usr/xpg4/bin/awk
fi

sleepTime=`$ECHO $1 | $CUT -f2 -d'-'`
retryFlag=$2
retryNum=$3
timeOutFlag=$4
timeOut=$5
lockFile=$6

RET=1

$ECHO INFO : sleepTime:$sleepTime, retryNum:$retryNum, timeOut:$timeOut lockFile:$lockFile;

if [ -z "${sleepTime}" -o -z "${retryFlag}" -o -z "${retryNum}" -o -z "${timeOutFlag}" -o -z "${timeOut}" -o -z "${lockFile}" ]; then
  exit 2
fi

checkTimeOut()
{
  lkYear=`$CAT $lockFile | $AWK '{print $1}'`
  lkMonth=`$CAT $lockFile | $AWK '{print $2}'`
  lkDay=`$CAT $lockFile | $AWK '{print $3}'`
  lkHour=`$CAT $lockFile | $AWK '{print $4}'`
  lkMin=`$CAT $lockFile | $AWK '{print $5}'`
  lkSec=`$CAT $lockFile | $AWK '{print $6}'`

  cuDate=`$DATE +'%Y %m %d %H %M %S'`
  cuYear=`$ECHO $cuDate | $AWK '{print $1}'`
  cuMonth=`$ECHO $cuDate | $AWK '{print $2}'`
  cuDay=`$ECHO $cuDate | $AWK '{print $3}'`
  cuHour=`$ECHO $cuDate | $AWK '{print $4}'`
  cuMin=`$ECHO $cuDate | $AWK '{print $5}'`
  cuSec=`$ECHO $cuDate | $AWK '{print $6}'`

  lkTotalSec=`expr $lkYear \* 365 \* 30 \* 24 \* 60 \* 60 + $lkMonth \* 30 \* 24 \* 60 \* 60 + $lkDay \* 24 \* 60 \* 60 + $lkHour \* 60 \* 60 + $lkMin \* 60 + $lkSec`
  cuTotalSec=`expr $cuYear \* 365 \* 30 \* 24 \* 60 \* 60 + $cuMonth \* 30 \* 24 \* 60 \* 60 + $cuDay \* 24 \* 60 \* 60 + $cuHour \* 60 \* 60 + $cuMin \* 60 + $cuSec`

  diffSec=`expr $cuTotalSec - $lkTotalSec`

  if [ $diffSec -gt $timeOut ]; then
    $ECHO Removing lockfile by Force : $lockFile
    $RMF ${lockFile}
  fi
}

lockfile()
{
  $ECHO Trying to lock : $lockFile;
  $DATE +'%Y %m %d %H %M %S' > ${lockFile}.$$
  $LNS  ${lockFile}.$$ $lockFile > /dev/null 2>&1
  if [ $? -eq 0 ]; then
    $ECHO GOT The LOCK...!!!
    RET=0
  else
    $RMF ${lockFile}.$$
    checkTimeOut
  fi
}

lockfile

if [ $RET -eq 1 ]; then
  count=1
  while [ $count -le $retryNum ]
  do
    $ECHO Sleeping : $sleepTime seconds, TRY No. : $count
    sleep $sleepTime
    lockfile
    if [ $RET -eq 0 ]; then
      break;
    fi
    count=`expr $count + 1`
  done
fi
exit $RET 
