#! /bin/sh
#
#  Name:
#     lmdiag    script file for diagnosing problems when you cannot
#		check out a license.
#
#  Usage:
#     lmdiag [[-r matlabdir] | [-c licensefile] | -m [marker]] [-n] [feature]
#
#  Description:
#     lmdiag will print information about the license, then attempt to
#     checkout each feature unless feature is specified on the command line, 
#     in which case only that feature is checked. If the checkout fails
#     because lmdiag cannot connect to the license server then the user
#     has the option of running "extended connection diagnostics". This will
#     attempt to connect to each port on the license server node and can
#     detect if the port number in the license file is incorrect. If lmdiag
#     finds the vendor daemon for the feature begin tested, then it will
#     indicate the correct port number for the license file to correct the
#     problem.
#
#  Options:
#
#     -r matlabdir
#
#          Provide the MATLAB root directory path. Should be used when
#          MATLAB is in an automounted file system.
#
#     -c licensefile
#
#	   Path of the license file.
#	   DEFAULT: $MATLAB/etc/license.dat
#
#     -m [marker]
#
#	   Check the license file in /usr/tmp/marker.dat on the
#	   current host. This is created by lmstart/lmboot.
#
#	   If marker is not given then it defaults to:  lm_TMW4
#
#     -n
#
#	   Run in non-interactive mode. No extended connection
#	   diagnostics are available.
#
#     feature
#
#	   Check only this feature.	   
#
#  Copyright (c) 1995 by The MathWorks, Inc.
#  $Revision: 1.3 $  $Date: 1995/05/31 16:14:13 $
#__________________________________________________________________________
#
#**************************************************************************
# Determine the path of the MATLAB root directory - always one directory
# up from the path to this command.
#**************************************************************************
#
    filename=$0
#
# Now it is either a file or a link to a file.
#
    cpath=`pwd`
#
# Follow up to 8 links before giving up. Same as BSD 4.3
#
    n=1
    maxlinks=8
    while [ $n -le $maxlinks ]
    do
#
# Get directory correctly!
#
	newdir=`echo "$filename" | awk '
                        { tail = $0
                          np = index (tail, "/")
                          while ( np != 0 ) {
                             tail = substr (tail, np + 1, length (tail) - np)
                             if (tail == "" ) break
                             np = index (tail, "/")
                          }
                          head = substr ($0, 1, length ($0) - length (tail))
                          if ( tail == "." || tail == "..")
                             print $0
                          else
                             print head
                        }'`
	if [ ! "$newdir" ]; then
	    newdir="."
	fi
	(cd $newdir) > /dev/null 2>&1
	if [ $? -ne 0 ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo 'Internal error 1: We could not determine the path of the'
    echo '                  MATLAB root directory.'
    echo ''
    echo "                  original command path = $0"
    echo "                  current  command path = $filename"
    echo ''
    echo '                  Please contact:'
    echo '' 
    echo '                      MathWorks Technical Support'
    echo ''
    echo '                  for further assistance.'
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	    exit 1
	fi
	cd $newdir
#
# Need the function pwd - not the built in one
#
	newdir=`/bin/pwd`
#
	newbase=`expr //$filename : '.*/\(.*\)' \| $filename`
        lscmd=`ls -l $newbase 2>/dev/null`
	if [ ! "$lscmd" ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo 'Internal error 2: Could not determine the path of the'
    echo '                  MATLAB root directory.'
    echo ''
    echo "                  original command path = $filename"
    echo "                  current  command path = $filename"
    echo ''
    echo '                  Please contact:'
    echo '' 
    echo '                      MathWorks Technical Support'
    echo ''
    echo '                  for further assistance.'
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	    exit 1
	fi
#
# Check for link portably
#
	if [ `expr "$lscmd" : '.*->.*'` -ne 0 ]; then
	    filename=`echo "$lscmd" | awk '{ print $NF }'`
	else
#
# It's a file
#
	    dir="$newdir"
	    command="$newbase"
#
	    cd $dir/..
	    MATLAB=`/bin/pwd`; export MATLAB
	    break
	fi
        n=`expr $n + 1`
    done
    if [ $n -gt $maxlinks ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo 'Internal error 3: More than $maxlinks links in path to'
    echo "                  this script. That's too many!"
    echo ''
    echo "                  original command path = $filename"
    echo "                  current  command path = $filename"
    echo ''
    echo '                  Please contact:'
    echo '' 
    echo '                      MathWorks Technical Support'
    echo ''
    echo '                  for further assistance.'
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	exit 1
    fi
#	
    cd $cpath
#
#**************************************************************************
#
    . $MATLAB/etc/util/arch.sh
    if [ "$Arch" = "unknown" ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo '    Sorry! We could not determine the machine architecture for your'
    echo '           host. Please contact:'
    echo '' 
    echo '               MathWorks Technical Support'
    echo ''
    echo '           for further assistance.'
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        exit 1
    elif [ "$Arch" = "lnx86" ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo '    lmdiag is not supported or required on Linux.'
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        exit 1
    fi
#
    (cd $MATLAB/etc/$Arch) > /dev/null 2>&1
    if [ $? -ne 0 ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo "    Sorry! License manager directory MATLAB/etc/$Arch does not exit."
    echo ''
    echo "           MATLAB = $MATLAB"
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        exit 1
    fi
#
    licensefile=$MATLAB/etc/license.dat
    marker="lm_TMW4"
    markerpath=/usr/tmp
#
    set_licensefile="FALSE"
    arglist=
#
# Parse the arguments
#
#     -r matlabdir
#     -c licensefile
#     -m [marker]
#     -n
#     feature
#
    stat="OK"
    while [ "$stat" = "OK" -a  $# -gt 0 ]; do
        case "$1" in
	    -h|-help)
                stat=""
		;;
            -r)
                shift
                if [ $# -gt 0 ]; then
                    case "$1" in
                        -*)
                            stat=""
                            ;;
                         *)
#
# Minimum check - must be a valid directory
#
                            (cd $1) > /dev/null 2>&1
                            if [ $? -ne 0 ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo '    Sorry! MATLAB directory provided with -r option does not exist.'
    echo ''
    echo "           MATLAB = $1"
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                                exit 1
                            elif [ ! -f "$1/etc/lmboot" ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo '    Sorry! MATLAB directory provided with -r option is bad.'
    echo ''
    echo "           MATLAB = $1"
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                                exit 1
                            fi
#
                            MATLAB="$1"
                            shift
                            ;;
                    esac
                else
                    stat=""
                fi
                ;;
            -c)
                shift
		if [ "$usermarker" = "1" ]; then
		    stat=""
		elif [ $# -gt 0 ]; then
                    case "$1" in
                        -*)
                            stat=""
                            ;;
                         *)
                            licensefile="$1"
                            shift
                            set_licensefile="TRUE"
                            ;;
                    esac
		else
		    stat=""
		fi
                ;;
            -n)
                shift
                arglist="$arglist -n"
                ;;
            -m)
                shift
		if [ "$set_licensefile" = "TRUE" ]; then
		    stat=""
		else
		    usemarker=1
                    if [ $# -gt 0 ]; then
                        case "$1" in
                            -*)
                                ;;
                             *)
		    	        marker="$1"
		    	        shift
                                ;;
                        esac
		    fi
		fi
                ;;
	     *)
                arglist="$arglist $1"
                shift
		;;
	esac
    done
    if [ "$stat" = "" ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   echo '--------------------------------------------------------------------'
   echo '    Usage: lmdiag -h | [[-r matlabdir] | [-c licensefile]'
   echo '                       | -m [marker]] [-n] [feature]'
   echo ''
   echo '    -h              - * Print usage.'
   echo '    -r matlabdir    - * Provide the MATLAB root directory path.'
   echo '    -c licensfile   -   Path of the license file.'
   echo '                        DEFAULT: $MATLAB/etc/license.dat'
   echo '    -m [marker]     - * Check the license file in'
   echo '                        /usr/tmp/marker.dat on the current host'
   echo '                        UNSPECIFIED: lm_TMW4'
   echo '    -n              -   Run in batch. No extended connection'
   echo '                        diagnostics are available.'
   echo '    feature         -   Check only this feature.'
   echo ''
   echo '    *  Additional MathWorks Options.'
   echo '--------------------------------------------------------------------'
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	exit 1
    fi
#
    if [ $set_licensefile = "FALSE" -a "$usemarker" != "1" -a ! -f $MATLAB/etc/license.dat ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo '    Sorry! No license.dat file found in MATLAB/etc directory.'
    echo ''
    echo "           MATLAB = $MATLAB"
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        exit 1
    elif [ $set_licensefile = "TRUE" -a ! -f $licensefile ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo '    Sorry! License file does not exist.'
    echo ''
    echo "           file = $licensefile"
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        exit 1
    elif [ "$usemarker" = "1" -a ! -f $markerpath/$marker.dat ]; then
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo ''
    echo '    Sorry! License file does not exist on this host.'
    echo ''
    echo "           file = $markerpath/$marker.dat"
    echo ''
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        exit 1
    fi
#
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo '------------------------------------------------------------------'
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    if [ $set_licensefile = "FALSE" -a "$usemarker" != "1" ]; then
 	   $MATLAB/etc/$Arch/lmdiag -c $MATLAB/etc/license.dat $arglist
    elif [ $set_licensefile = "TRUE" ]; then
 	   $MATLAB/etc/$Arch/lmdiag -c $licensefile $arglist
    else
 	   $MATLAB/etc/$Arch/lmdiag -c $markerpath/$marker.dat $arglist
    fi
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    echo '------------------------------------------------------------------'
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
