#!/bin/sh
if test -z "`lspci|grep VGA|grep -i nvidia`"; then
 echo Error: No nVidia VGA adapter found.
 exit 3
fi
if test $(id -u) != 0; then
 echo Error: You must be root to run this script!
 exit 4
fi
if test -n "$DISPLAY"; then
 echo Error: Can\`t be run within X! Use a text console \(ALT-CTRL-F1\)
 exit 5
fi
#VER=1.0-4620
#URL=http://www.sh.nu/download/nvidia/linux-2.4/
#VER=1.0-5328
#VER=1.0-5336
#VER=1.0-6106
VER=1.0-6111
#VER=1.0-6629
ARCH=""
[ "$(uname -m)" == "x86_64" ] && ARCH="_64"
URL=http://download.nvidia.com/XFree86/Linux-x86$ARCH/$VER/
PATCH=0
HACK=0
cd /usr/src
wget -Nc "$URL"NVIDIA-Linux-x86$ARCH-$VER-pkg1.run
rm -rf NVIDIA-Linux-x86$ARCH-$VER-pkg1
sh NVIDIA-Linux-x86$ARCH-$VER-pkg1.run --extract-only &>/dev/null || (
 rm -f NVIDIA-Linux-x86$ARCH-$VER-pkg1.run
 echo NVIDIA-Linux-x86$ARCH-$VER-pkg1.run could not be extracted
 echo and has been deleted. Please restart this script.
 exit 1
) || exit $?
if test "$(kernelversion)" == "2.6" -a "$PATCH" == "1"; then
 wget -Nc http://www.minion.de/files/NVIDIA_kernel-$VER-2.6.diff
fi
if test -f /etc/modutils/1alsa; then
 mv /lib/modules/extra/alsa /lib/modules/`uname -r`/
 rm -f /etc/modutils/1alsa
 update-modules
fi
DM=`cat /etc/X11/default-display-manager 2>/dev/null`
DM=`basename $DM 2>/dev/null`
if test -z "$DM"; then
 test -e /etc/init.d/kdm && /etc/init.d/kdm stop
else
 test -e /etc/init.d/$DM && /etc/init.d/$DM stop
fi
rmmod nvidia &>/dev/null
rm -f /lib/modules/`uname -r`/kernel/drivers/video/nvidia.*o
cd NVIDIA-Linux-x86$ARCH-$VER-pkg1
if test "$VER" == "1.0-4620" -o "$VER" == "1.0-6106" -o "$VER" == "1.0-6111" -o "$VER" == "1.0-6629"; then
 rm -f /usr/bin/nvidia-settings
 rm -f /usr/local/bin/nvidia-settings
 cp usr/bin/nvidia-settings /usr/local/bin
fi
if test "$(kernelversion)" == "2.6"; then 
 if test "$PATCH" == "1"; then
  cd usr/src/nv
  patch -p1 < ../../../../NVIDIA_kernel-$VER-2.6.diff
  ln -s Makefile.kbuild Makefile
  cd ../../..
 fi
else
 # fix NVIDIA's stupid error in Makefile 
 perl -pi -e 's/"\$\$\?"/"\$\?"/' Makefile
fi
[ "$(uname -r|cut -d- -f1)" == "2.6.10" ] && perl -pi -e s/pci_find_class/pci_get_class/ usr/src/nv/nv.c
CC=gcc-$(perl -pe '($_)=/gcc.[Vv]ersion\s(3\.\d|2\.\d+)/;' /proc/version)
if test -e /usr/bin/$CC; then
 make install CC=/usr/bin/$CC IGNORE_CC_MISMATCH=1
else
 make install IGNORE_CC_MISMATCH=1
fi
cd ..
rm -rf NVIDIA-Linux-x86$ARCH-$VER-pkg1
rm -f /etc/modutils/nvidia
perl -pi -e 's|.*char-major-195.*[\n]?||' /etc/modutils/aliases
perl -pi -e 's|[\n]?$|\n|' /etc/modutils/aliases
echo alias char-major-195 nvidia >> /etc/modutils/aliases
update-modules
if ! test -e /etc/X11/XF86Config-4.1st; then
 cp /etc/X11/XF86Config-4 /etc/X11/XF86Config-4.1st
fi
perl -p -e 's/^[\s]*Load\s*"GLcore"/#\tLoad  "GLcore"/;
            s/^[\s]*Load\s*"dri"/#\tLoad  "dri"/;
            s/^[\s]*#*[\s]*Load\s*"glx"/\tLoad  "glx"/;
            s/^[\s]*Driver\s*"nv"/\tDriver      "nvidia"/g;
            s/^[\s]*Driver\s*"fbdev"/\tDriver      "nvidia"/g;
            s/^[\s]*Driver\s*"vesa"/\tDriver      "nvidia"/g;
	    s/DefaultColorDepth.*/DefaultColorDepth 24/;
            s/^[\s]*Option\s*"sw_cursor"/\t#Option     "sw_cursor"/;
            s/^.*IgnoreDisplayDevices.*\n?//g;
	    s/^([\s]*Driver\s*"nvidia")/\1\n\tOption      "IgnoreDisplayDevices"\t"TV"/g' \
            < /etc/X11/XF86Config-4.1st > /etc/X11/XF86Config-4
test "$HACK" == "1" && rm -rf /usr/lib/tls
ldconfig
sync
if test -z "$DM"; then
 test -e /etc/init.d/kdm && /etc/init.d/kdm start
else
 test -e /etc/init.d/$DM && /etc/init.d/$DM start
fi
