#!/bin/sh

# $Id: uname,v 1.27 2008/01/09 14:44:02 grubba Exp $

. $NTTOOLS

S=$INIT_UNAME
R=$INIT_UNAME
M=$INIT_UNAME
N=$INIT_UNAME
V=$INIT_UNAME
P=$INIT_UNAME

for a in "$@"
do
  case "$a" in
    --version)
      ver=`echo "$Revision: 1.27 $" |sed -e 's/.* \(.*\) .*/\1/'`
      echo "Fake NT uname version $ver by Fredrik Hubinette and others"
      exit 0
    ;;

    --help)
      echo "Usage: uname [-a] [-m] [-n] [-p] [-r] [-s] [-v]"
      exit 0
    ;;

    --all)  S=yes ; R=yes ; M=yes ; N=yes ; V=yes ; P=yes ;;
    --machine) M=yes ;;
    --nodename) N=yes ;;
    --sysname) S=yes ;;
    --processor) P=yes ;;
    --revision) R=yes ;;

    --*)
      echo "Unknown option $a"
      exit 1
    ;;

    -*)
      case "$a" in
        *m*) M=yes ;;
      esac

      case "$a" in
        *n*) N=yes ;;
      esac

      case "$a" in
        *p*) P=yes ;;
      esac

      case "$a" in
        *s*) S=yes ;;
      esac

      case "$a" in
        *r*) R=yes ;;
      esac

      case "$a" in
        *v*) V=yes ;;
      esac

      case "$a" in
        *a*) M=yes ; N=yes ; S=yes ; V=yes ;;
      esac
    ;;
      
  esac
done

if [ X"$M$N$S$P$R$V" = X ]; then
  S=yes
fi

OUTPUT=

if [ "$S$R$V" = "" ]; then :; else
  if [ "$NT_RAW_VERSION" = "" ]; then
    # Note: The resulting string starts with a line feed,
    #       and then something like:
    # Windows NT Version 4.0
    #       or
    # Microsoft Windows 2000 [Version 5.00.2195]
    #       or
    # Microsoft Windows XP [Version 5.1.2600]
    NT_RAW_VERSION="`sprsh cmd /c ver`"
  fi
fi

if [ X$S = Xyes ]; then
  # System name.
  # Note that the first '.' either matches ' ' or '['.
  SYSNAME="`echo $NT_RAW_VERSION|sed -e 's/.Version.*//;s/^Microsoft//'`"
  # Perform whitespace adjustment.
  OUTPUT="$OUTPUT `echo $SYSNAME|tr ' ' '_'`"
fi

if [ X$N = Xyes ]; then
  # Node name.
  OUTPUT="$OUTPUT $NTHOST"
fi

if [ X$R = Xyes -o X$V = Xyes ]; then
  # Release number or Version number.
  OUTPUT="$OUTPUT `echo $NT_RAW_VERSION|sed -e 's/.*Version//'|sed -e's/[^0-9.]*//g'`"
  # If there are more than one processor, apply "-smp"
  if [ "$NT_NUMBER_OF_PROCESSORS" = "" ]; then
    NT_NUMBER_OF_PROCESSORS="`getntenv NUMBER_OF_PROCESSORS`"
  fi
  if [ "x$NT_NUMBER_OF_PROCESSORS" != "x" ] && [ "$NT_NUMBER_OF_PROCESSORS" -gt 1 ]; then
    OUTPUT="$OUTPUT-smp"
  fi
fi

if [ "$M$P" = "" ]; then :; else
  if [ "$NT_PROCESSOR_ARCHITECTURE" = "" ]; then
    # Query the processor architecture from PIKE_BUILD_ARCH first. It
    # can be set in the cmd box running sprshd to select something
    # specific and avoid the dwim on the physical cpu.
    NT_PROCESSOR_ARCHITECTURE="`getntenv PIKE_BUILD_ARCH`"

    if [ "$NT_PROCESSOR_ARCHITECTURE" = "" ]; then
      # Workaround for XP64 DWIMing NT_PROCESSOR_ARCHITECTURE...
      NT_PROCESSOR_ARCHITECTURE="`getntenv PROCESSOR_IDENTIFIER|cut '-d ' -f1`"

      # PROCESSOR_IDENTIFIER is typically something like:
      #   "ia64 Family 7 Model 1 Stepping 5, GenuineIntel"
      # or
      #   "x86 Family 6 Model 7 Stepping 3, GenuineIntel"
      # or
      #   "EM64T Family 15 Model 4 Stepping 3, GenuineIntel"
      #
      # FIXME: What does it contain on AMD's?
      #
      # PROCESSOR_LEVEL jumps to 15 with P4/Xeon

      case "$NT_PROCESSOR_ARCHITECTURE" in
	"x86")
	  PL=`getntenv PROCESSOR_LEVEL`
	  if [ "$PL" -gt 6 ]; then
	    PL=6
	  fi
	  NT_PROCESSOR_ARCHITECTURE="i${PL}86"
	  if [ "$NT_PROCESSOR_ARCHITECTURE" = "i86" ]; then
	    NT_PROCESSOR_ARCHITECTURE="i386"
	  fi
	;;
	"EM64T"|"AMD64")
	  # FIXME: Consider looking at PROCESSOR_ARCHITEW6432 (=AMD64)?
	  NT_PROCESSOR_ARCHITECTURE="x86_64"
	;;
      esac
    fi
  fi

  if [ "$M" = yes ]; then
    OUTPUT="$OUTPUT $NT_PROCESSOR_ARCHITECTURE"
  fi
  
  if [ "$P" = yes ]; then
    OUTPUT="$OUTPUT $NT_PROCESSOR_ARCHITECTURE"
  fi
fi

# Export these to allow caching.
export NT_RAW_VERSION
export NT_NUMBER_OF_PROCESSORS
export NT_PROCESSOR_ARCHITECTURE

# Note: No quotes, so that we get rid of extra white space.
echo $OUTPUT
