#!/bin/sh
#
# nvidia	This script adjust NVIDIA glx.
#
# chkconfig: 345 04 96
# description: 	This script adjust NVIDIA XFree86 driver \
#		for equivalent kernel driver.

WITHOUT_RC_COMPAT=1

# Source function library.
. /etc/init.d/functions

LOCKFILE=/var/lock/subsys/nvidia

RPMQ=/usr/bin/rpmquery
GREP=/bin/grep
CUT=/bin/cut
SORT=/bin/sort
UNIQ=/usr/bin/uniq
RM=/bin/rm
READLINK=/bin/readlink

APT_CACHE=/usr/bin/apt-cache
NV_SET_GLX=/usr/sbin/nvidia_set_glx

NV_MODULES="nvidia.ko nvidia.o NVdriver.o"
NVIDIA_KERNEL="NVIDIA_kernel"
NVIDIA_GLX="NVIDIA_GLX"
DUMMY="dummy"

NV_MODULE_PATH="/lib/modules/`uname -r`/nVidia"
NV_XDRV_PATH="/usr/X11R6/lib/nvidia_"

RETVAL=0

nv_kernel_version()
{
    for f in $NV_MODULES
    do
	if [ -f $NV_MODULE_PATH/$f ]
	then

	    NV_KERNEL_PKG=`LC_ALL=C $RPMQ -f $NV_MODULE_PATH/$f`
	    if [ -z "$NV_KERNEL_PKG" ]
	    then
		NV_KERNEL_VERSION=$DUMMY
		break
	    fi

	    NV_KERNEL_VERSION=`LC_ALL=C $RPMQ --provides $NV_KERNEL_PKG| $GREP $NVIDIA_KERNEL| $CUT -d\  -f3`

	    break
	fi
    done

    if [ -z "$NV_KERNEL_VERSION" ]
    then
	NV_KERNEL_VERSION=$DUMMY
	break
    fi

    echo $NV_KERNEL_VERSION
}

nv_glx_version()
{
    if [ -z "$NV_KERNEL_VER" ]
    then
	NV_KERNEL_VER=`nv_kernel_version`
    fi

    if [ "$NV_KERNEL_VER" == $DUMMY ]
    then
	echo $DUMMY
	return
    fi

    NV_XMOD_PATH="$NV_XDRV_PATH$NV_KERNEL_VER/modules/drivers/nvidia_drv.o"
    
    NV_GLX_PKG=`LC_ALL=C $RPMQ -f $NV_XMOD_PATH 2>/dev/null`
    if [ -z "$NV_GLX_PKG" ]
    then
	NV_GLX_VERSION=$DUMMY
    else
	NV_GLX_VERSION=`LC_ALL=C $RPMQ --qf '%{VERSION}\n' $NV_GLX_PKG`
    fi
    echo $NV_GLX_VERSION
}

status()
{
    NV_KERNEL_VER=`nv_kernel_version`
    NV_GLX_VER=`nv_glx_version`

    echo
    echo -n "NVIDIA drivers"
    if [ "$NV_KERNEL_VER" == "$NV_GLX_VER" -a "$NV_GLX_VER" != "$DUMMY" ]
    then
	echo -n " $NV_GLX_VER version found"
    else
	echo -n " not found"
    fi

    if [ -f "$LOCKFILE" ]
    then
	echo " and adjusted."
    else
	echo " and not adjusted."
        echo "You may adjust it by command \"service ${0##*/} start\""
    fi

    if [ "$NV_KERNEL_VER" == "$DUMMY" -a -x $APT_CACHE ]
    then
	echo
	echo "  Try to install one of following packages for kernel `uname -r`:"
	$APT_CACHE search $NVIDIA_KERNEL| $GREP -v source| $CUT -d\  -f1| $SORT| $UNIQ
    fi

    if [ "$NV_GLX_VER" == "$DUMMY" -a -x $APT_CACHE ]
    then
	echo "  Try to install  one of following packages for XFree86:"
	$APT_CACHE search $NVIDIA_GLX| $GREP -v -e{source,common}| $CUT -d\  -f1| $SORT| $UNIQ
    fi
}

case "$1" in
  start)
	NV_KERNEL_VER=`nv_kernel_version`
	NV_GLX_VER=`nv_glx_version`
	MSG="Adjusting XFree86 video driver:"

	if [ "$NV_KERNEL_VER" == "$NV_GLX_VER" -a "$NV_GLX_VER" != "$DUMMY" ]
	then
		action "$MSG" $NV_SET_GLX $NV_GLX_VER
		touch "$LOCKFILE"
	else
		action "$MSG" /bin/false
		RETVAL=1
	fi
	;;

  status)
	status
	;;
  reload|restart|condrestart)
	;;
  stop|condstop)
 	rm -f "$LOCKFILE"
 	;;
  *)
 	echo "Usage: ${0##*/} {start|stop|status}"
	;;
esac

exit $RETVAL
