blob: 2e4de4fe384f2aab7c0f547a1af84df4d0cb5bb0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
#!@XSESSION_SHELL@
#
# 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:
# 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 $
command="$@"
# 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 (resp. /usr/etc/profile) and .profile
if [ -f /etc/profile ]; then
. /etc/profile
elif [ -f /usr/etc/profile ]; then
. /usr/etc/profile
fi
test -f "$HOME/.profile" && . "$HOME/.profile"
# Second read /etc/xprofile (resp. /usr/etc/xprofile) and .xprofile for X specific setup
if [ -f /etc/xprofile ]; then
. /etc/xprofile
elif [ -f /usr/etc/xprofile ]; then
. /usr/etc/xprofile
fi
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"
# Translation stuff
if [ -x "@libexecdir@/gdmtranslate" ] ; then
gdmtranslate="@libexecdir@/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
}
OLD_IFS=$IFS
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
IFS=$OLD_IFS
echo "$OUTPUT"
}
zenity=`gdmwhich zenity`
# 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=`gdmwhich freetemp`
if [ -n "$freetemp" ] ; then
"$freetemp"
fi
userresources="$HOME/.Xresources"
usermodmap="$HOME/.Xmodmap"
userxkbmap="$HOME/.Xkbmap"
if [ -f /etc/X11/Xresources ]; then
sysresources=/etc/X11/Xresources
else
sysresources=/usr/etc/X11/Xresources
fi
if [ -f /etc/X11/Xmodmap ]; then
sysmodmap=/etc/X11/Xmodmap
else
sysmodmap=/usr/etc/X11/Xmodmap
fi
if [ -f /etc/X11/Xkbmap ]; then
sysxkbmap=/etc/X11/Xkbmap
else
sysxkbmap=/usr/etc/X11/Xkbmap
fi
rh6sysresources=/etc/X11/xinit/Xresources
rh6sysmodmap=/etc/X11/xinit/Xmodmap
# merge in defaults
if [ -f "$rh6sysresources" ]; then
xrdb -nocpp -merge "$rh6sysresources"
fi
if [ -f "$sysresources" ]; then
xrdb -nocpp -merge "$sysresources"
fi
if [ -f "$userresources" ]; then
xrdb -nocpp -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
xhost +si:localuser:`id -un` || :
# run all system xinitrc shell scripts.
if [ -d /usr/etc/X11/xinit/xinitrc.d ]; then
for i in /usr/etc/X11/xinit/xinitrc.d/* ; do
sname=$(basename "$i")
test -x "/etc/X11/xinit/xinitrc.d/$sname" && continue
if [ -x "$i" -a ! -d "$i" ]; then
. "$i"
fi
done
fi
if [ -d /etc/X11/xinit/xinitrc.d ]; then
for i in /etc/X11/xinit/xinitrc.d/* ; do
if [ -x "$i" -a ! -d "$i" ]; then
. "$i"
fi
done
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
if [ -n "$zenity" ] ; then
disptext=`gettextfunc "System has no Xclients file, so starting a failsafe xterm session. Windows will have focus only if the mouse pointer is above them. To get out of this mode type 'exit' in the window."`
"$zenity" --info --text "$disptext"
else
echo "$0: Cannot find Xclients"
fi
exec xterm -geometry 80x24+0+0
fi
fi
# add ssh-agent if found
sshagent="`gdmwhich ssh-agent`"
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
disptext=`gettextfunc "Failed to start the session, so starting a failsafe xterm session. Windows will have focus only if the mouse pointer is above them. To get out of this mode type 'exit' in the window."`
"$zenity" --info --text "$disptext"
fi
exec xterm -geometry 80x24+0+0
|