#!/bin/sh

if test "x$UNSAFE_TO_TRANSLATE" = "xyes" ; then
  LANG=C
  unset LC_ALL
  unset LC_MESSAGES
fi

if test -x "$LIBEXECDIR/gdmtranslate" ; then
  GDMTRANSLATE="$LIBEXECDIR/gdmtranslate"
else
  GDMTRANSLATE=
fi

gettextfunc () {
  if test "x$GDMTRANSLATE" != "x" ; then
    "$GDMTRANSLATE" "$1"
  else
    echo "$1"
  fi
}

gdmwhich () {
  COMMAND="$1"
  OUTPUT=
  IFS=:
  for dir in $PATH
  do
    if test -x "$dir/$COMMAND" ; then
      if test "x$OUTPUT" = "x" ; then
        OUTPUT="$dir/$COMMAND"
      fi
    fi
  done
  unset IFS
  echo "$OUTPUT"
}

MSG3=`gettextfunc "I cannot start the X server (your graphical interface).  It is likely that it is not set up correctly.  You will need to log in on a console and rerun the X configuration program.  Then restart GDM."`
MSG4=`gettextfunc "Would you like me to try to run the X configuration program?  Note that you will need the root password for this."`
MSG5=`gettextfunc "Please type in the root (privileged user) password."`
MSG6=`gettextfunc "I will now try to restart the X server again."`
MSG7=`gettextfunc "I will disable this X server for now.  Restart GDM when it is configured correctly."`
MSG8=`gettextfunc "I cannot start the X server (your graphical interface).  It is likely that it is not set up correctly.  Would you like to view the X server output to diagnose the problem?"`
MSG9=`gettextfunc "Would you like to view the detailed X server output as well?"`

# there are some env vars defined:
# XLOG = the log file for the X server
# BINDIR = location of gdm binaries
# SBINDIR = location of gdm system binaries
# LIBEXECDIR = location of gdm libexec binaries (gdmaskpass, gdmopen)

# return values are
# 0 = try again, runs this server again
# 1 = abort this display, removes this server from the list
# 32 = something went very wrong, things will just get logged.
#      this means this script didnt work so do alternative things
#      to tell the user if possible

#
# First see if we can find an X configuration program
#  (first one in the list will be used)
#
XCONFIGURATOR=
for n in \
  /usr/bin/system-config-display \
  /usr/bin/redhat-config-xfree86 \
  /usr/sbin/XFdrake		 \
  /usr/bin/X11/XF86Setup	 \
  /usr/bin/X11/Xconfigurator	 \
  /usr/bin/X11/xf86cfg		 \
   ; do
  # standard shell test has no or and loops have no breaks, eek
  if test "x$XCONFIGURATOR" = "x" ; then
    if test -x "$n" ; then
      XCONFIGURATOR="$n"
    fi
  fi
done

#
# Now we check for dialog and gdmaskpass
#
DIALOG=`gdmwhich dialog`
if test "x$DIALOG" = "x" ; then
  DIALOG=`gdmwhich whiptail`
fi
if test -x "$LIBEXECDIR/gdmaskpass" ; then
  ASKPASS="$LIBEXECDIR/gdmaskpass"
else
  ASKPASS=
fi

#
#  If this is a mouse problem try mouseconfig and modify some
#  messages
#
if grep '^\(Cannot open mouse\|No core pointer\)' "$XLOG" 2> /dev/null ; then

  MSG8=`gettextfunc "I cannot start the X server (your graphical interface).  It seems that the pointer device (your mouse) is not set up correctly.  Would you like to view the X server output to diagnose the problem?"`

  if test -x /usr/sbin/mouseconfig ; then
    XCONFIGURATOR=/usr/sbin/mouseconfig
    # Note: we know this is a mouse problem and yay we have mouseconfig
    MSG4=`gettextfunc "Would you like me to try to run the mouse configuration program?  Note that you will need the root password for this."`
  fi

  if test -x /usr/bin/system-config-mouse ; then
    XCONFIGURATOR=/usr/bin/system-config-mouse
    # Note: we know this is a mouse problem and yay we have system-config-mouse
    MSG4=`gettextfunc "Would you like me to try to run the mouse configuration program?  Note that you will need the root password for this."`
  fi

fi

# we require 'gdmopen', to open a console, because we really dont
# have one.  Perhaps someone should try to figure out some shell
# black magic to get this to work on other then linux systems
if test ! -x "$LIBEXECDIR/gdmopen" ; then
  exit 32
fi

# when we run ourselves from the open we will pass a -noopen argument
if test "x$1" = "x-noopen" ; then
  shift
else
  #
  # We do a lot of work wastefully over again, but oh well,
  # perhaps this needs fixing.
  #
  "$LIBEXECDIR/gdmopen" -l /bin/sh -c "$0 -noopen $@"
  exit $?
fi

clear

# Note, dialog required, though this script could be fixed to not require it
# I suppose
if test "x" = "x$DIALOG" ; then
  echo =======================================================================
  echo 
  cat "$XLOG"
  echo 
  echo =======================================================================
  echo
  if test -x /usr/bin/fmt ; then
    echo  "$MSG3" | /usr/bin/fmt
  else
    echo  "$MSG3"
  fi
  echo
  echo =======================================================================
  read
  exit 1
fi

if "$DIALOG" --yesno "$MSG8" 10 50 ; then 
  "$DIALOG" --textbox "$XLOG" 22 76
  # Support XFree86 v4 logfile thingie
  if grep '^(..) Log file: "' "$XLOG" 2> /dev/null ; then
    XLOG_DETAIL=`grep '^(..) Log file: "' "$XLOG" | sed 's/^[^"]*"\([^"]*\)".*$/\1/'`
    if "$DIALOG" --yesno "$MSG9" 10 50 ; then 
      "$DIALOG" --textbox "$XLOG_DETAIL" 22 76
    fi
  fi
fi

if test "x$XCONFIGURATOR" = "x" ; then
  "$DIALOG" --msgbox "$MSG7" 8 50
  exit 1
fi

if "$DIALOG" --yesno "$MSG4" 10 50 ; then 
  clear
  echo
  echo "$MSG5"
  if test "x$ASKPASS" = "x" ; then
    # dirty trick to fool su into asking the root password even if were
    # root
    su nobody -c "su -c $XCONFIGURATOR"
  else
    if "$ASKPASS" ; then
      "$XCONFIGURATOR"
    fi
  fi
  clear
  "$DIALOG" --msgbox "$MSG6" 8 50
  exit 0
else
  "$DIALOG" --msgbox "$MSG7" 8 50
  exit 1
fi
