#!/bin/sh # # This is SORT OF LIKE an X session, but not quite. You get a command as the # first argument (it could be multiple words, so run it with "eval"). As a # special case, the command can be: # failsafe - Run an xterm only # default - Run the appropriate Xclients startup (see the code below) # custom - Run ~/.xsession and if that's not available run 'default' # # (Note that other arguments could also follow, but only the command one is # right now relevant and supported) # # The output is ALREADY redirected to .xsession-errors in GDM. This way # .xsession-errors actually gets more output such as if the PreSession script # is failing. This also prevents DoS attacks if some app in the users session # can be prodded to dump lots of stuff on the stdout/stderr. We wish to be # robust don't we? In case you wish to use an existing script for other DM's, # you can just not redirect when GDMSESSION is set. GDMSESSION will always # be set from gdm. # # Also note that this is not run as a login shell, this is just executed. # This is why we source the profile files below. # # based on: # $XConsortium: Xsession /main/10 1995/12/18 18:21:28 gildea $ # this will go into the .xsession-errors along with all other echo's # good for debugging where things went wrong echo "$0: Beginning session setup..." # First read /etc/profile and .profile test -f /etc/profile && . /etc/profile test -f "$HOME/.profile" && . "$HOME/.profile" # Second read /etc/xprofile and .xprofile for X specific setup test -f /etc/xprofile && . /etc/xprofile test -f "$HOME/.xprofile" && . "$HOME/.xprofile" # Third read .bash_profile for keychain to work correctly test -f "$HOME/.bash_profile" && . "$HOME/.bash_profile" # Translation stuff if [ -x "/usr/libexec/gdmtranslate" ] ; then gdmtranslate="/usr/libexec/gdmtranslate" else gdmtranslate= fi # Note that this should only go to zenity dialogs which always expect utf8 gettextfunc () { if [ "x$gdmtranslate" != "x" ] ; then "$gdmtranslate" --utf8 "$1" else echo "$1" fi } zenity=`which zenity 2>/dev/null` command="$1" if [ -z "$command" ] ; then command=failsafe fi if [ x"$command" = xfailsafe ] ; then if [ -n "$zenity" ] ; then "$zenity" --info --text `gettextfunc "This is the failsafe xterm session. Windows now have focus only if you have your cursor above them. To get out of this mode type 'exit' in the window in the upper left corner"` else echo "$0: Starting the failsafe xterm session." fi exec xterm -geometry 80x24+0+0 fi # Note: ~/.xsession-errors is now done in the daemon so that it # works for ALL sessions (except ones named 'Failsafe') # clean up after xbanner freetemp=`which freetemp 2>/dev/null` if [ -n "$freetemp" ] ; then "$freetemp" fi userresources="$HOME/.Xresources" usermodmap="$HOME/.Xmodmap" userxkbmap="$HOME/.Xkbmap" sysresources=/etc/X11/Xresources sysmodmap=/etc/X11/Xmodmap sysxkbmap=/etc/X11/Xkbmap rh6sysresources=/etc/X11/xinit/Xresources rh6sysmodmap=/etc/X11/xinit/Xmodmap # merge in defaults if [ -f "$rh6sysresources" ]; then xrdb -merge "$rh6sysresources" fi if [ -f "$sysresources" ]; then xrdb -merge "$sysresources" fi if [ -f "$userresources" ]; then xrdb -merge "$userresources" fi # merge in keymaps if [ -f "$sysxkbmap" ]; then setxkbmap `cat "$sysxkbmap"` XKB_IN_USE=yes fi if [ -f "$userxkbmap" ]; then setxkbmap `cat "$userxkbmap"` XKB_IN_USE=yes fi # # Eeek, this seems like too much magic here # if [ -z "$XKB_IN_USE" -a ! -L /etc/X11/X ]; then if grep '^exec.*/Xsun' /etc/X11/X > /dev/null 2>&1 && [ -f /etc/X11/XF86Config ]; then xkbsymbols=`sed -n -e 's/^[ ]*XkbSymbols[ ]*"\(.*\)".*$/\1/p' /etc/X11/XF86Config` if [ -n "$xkbsymbols" ]; then setxkbmap -symbols "$xkbsymbols" XKB_IN_USE=yes fi fi fi # xkb and xmodmap don't play nice together if [ -z "$XKB_IN_USE" ]; then if [ -f "$rh6sysmodmap" ]; then xmodmap "$rh6sysmodmap" fi if [ -f "$sysmodmap" ]; then xmodmap "$sysmodmap" fi if [ -f "$usermodmap" ]; then xmodmap "$usermodmap" fi fi unset XKB_IN_USE # Normalize languages, some places/distros screw us up in /etc/profile, # so in case the user did select a language if [ -n "$GDM_LANG" ]; then LANG="$GDM_LANG" export LANG if [ -n "$LC_ALL" ]; then if [ "$LC_ALL" != "$LANG" ]; then LC_ALL="$LANG" fi else unset LC_ALL fi if [ -n "$LANGUAGE" ]; then if [ "$LANGUAGE" != "$LANG" ]; then LANGUAGE="$LANG" fi else unset LANGUAGE fi if [ -n "$LINGUAS" ]; then if [ "$LINGUAS" != "$LANG" ]; then LINGUAS="$LANG" fi else unset LINGUAS fi fi # run all system xinitrc shell scripts. if [ -d /etc/X11/xinit/xinitrc.d ]; then for i in /etc/X11/xinit/xinitrc.d/* ; do if [ -x "$i" ]; then . "$i" fi done fi if [ "x$command" = "xcustom" ] ; then if [ -x "$HOME/.xsession" ]; then command="$HOME/.xsession" else echo "$0: Cannot find ~/.xsession will try the default session" command="default" fi fi if [ "x$command" = "xdefault" ] ; then if [ -x "$HOME/.Xclients" ]; then command="$HOME/.Xclients" elif [ -x /etc/X11/xinit/Xclients ]; then command="/etc/X11/xinit/Xclients" elif [ -x /etc/X11/Xclients ]; then command="/etc/X11/Xclients" else echo "$0: Cannot find Xclients" # FIXME: kind of an evil failsafe command="xsm" fi fi # add ssh-agent if found sshagent="`which ssh-agent 2>/dev/null`" if [ -n "$sshagent" ] && [ -x "$sshagent" ] && [ -z "$SSH_AUTH_SOCK" ]; then command="$sshagent -- $command" elif [ -z "$sshagent" ] ; then echo "$0: ssh-agent not found!" fi echo "$0: Setup done, will execute: $command" eval exec $command echo "$0: Executing $command failed, will run xterm" if [ -n "$zenity" ] ; then "$zenity" --info --text `gettextfunc "I could not start your session and so I have started the failsafe xterm session. Windows now have focus only if you have your cursor above them. To get out of this mode type 'exit' in the window in the upper left corner"` fi exec xterm -geometry 80x24+0+0