summaryrefslogtreecommitdiff
blob: c7767383d9465bd969d218cfe41ec97b241c67df (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
#!/sbin/runscript
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License, v2
# $Header: /var/cvsroot/gentoo-x86/x11-base/xorg-server/files/xdm.initd-9,v 1.1 2012/11/11 01:49:30 chithanh Exp $

# This is here to serve as a note to myself, and future developers.
#
# Any Display manager (gdm,kdm,xdm) has the following problem:  if
# it is started before any getty, and no vt is specified, it will
# usually run on vt2.  When the getty on vt2 then starts, and the
# DM is already started, the getty will take control of the keyboard,
# leaving us with a "dead" keyboard.
#
# Resolution: add the following line to /etc/inittab
#
#  x:a:once:/etc/X11/startDM.sh
#
# and have /etc/X11/startDM.sh start the DM in daemon mode if
# a lock is present (with the info of what DM should be started),
# else just fall through.
#
# How this basically works, is the "a" runlevel is a additional
# runlevel that you can use to fork processes with init, but the
# runlevel never gets changed to this runlevel.  Along with the "a"
# runlevel, the "once" key word means that startDM.sh will only be
# run when we specify it to run, thus eliminating respawning
# startDM.sh when "xdm" is not added to the default runlevel, as was
# done previously.
#
# This script then just calls "telinit a", and init will run
# /etc/X11/startDM.sh after the current runlevel completes (this
# script should only be added to the actual runlevel the user is
# using).
#
# Martin Schlemmer
# aka Azarah
# 04 March 2002

depend() {
	need localmount xdm-setup

	# this should start as early as possible
	# we can't do 'before *' as that breaks it
	# (#139824) Start after ypbind and autofs for network authentication
	# (#145219 #180163) Could use lirc mouse as input device
	# (#70689 comment #92) Start after consolefont to avoid display corruption
	# (#291269) Start after quota, since some dm need readable home
	# (#390609) gdm-3 will fail when dbus is not running
	# (#366753) starting keymaps after X causes problems
	after bootmisc consolefont modules netmount
	after readahead-list ypbind autofs openvpn gpm lircmd
	after quota keymaps
	before alsasound

	# Start before X
	use consolekit dbus xfs
}

setup_dm() {
	local MY_XDM
	
	MY_XDM=$(echo "${DISPLAYMANAGER}" | tr '[:upper:]' '[:lower:]')

	# Load our root path from profile.env
	# Needed for kdm
	PATH=${PATH}:$(. /etc/profile.env; echo "${ROOTPATH}")

	NAME=
	case "${MY_XDM}" in
		kdm|kde)
			EXE=/usr/bin/kdm
			PIDFILE=/var/run/kdm.pid
			;;
		entrance*)
			EXE=/usr/sbin/entrance
			PIDFILE=/var/run/entrance.pid
			;;
		gdm|gnome)
			EXE=/usr/bin/gdm
			[ "${RC_UNAME}" != "Linux" ] && NAME=gdm-binary
			PIDFILE=/var/run/gdm.pid
			;;
		wdm)
			EXE=/usr/bin/wdm
			PIDFILE=
			;;
		gpe)
			EXE=/usr/bin/gpe-dm
			PIDFILE=/var/run/gpe-dm.pid
			;;
		lxdm)
			EXE=/usr/sbin/lxdm-binary
			PIDFILE=/var/run/lxdm.pid
			START_STOP_ARGS="--background"
			;;
		lightdm)
			EXE=/usr/sbin/lightdm
			PIDFILE=/var/run/lightdm.pid
			START_STOP_ARGS="--background"
			;;
		*)
			# first find out if there is such executable
			EXE="$(command -v ${MY_XDM} 2>/dev/null)"
			PIDFILE="/var/run/${MY_XDM}.pid"

			# warn user that he is doing sick things if the exe was not found
			if [ -z "${EXE}" ]; then
				echo "ERROR: Your XDM value is invalid."
				echo "  No ${MY_XDM} executable could be found on your system."
			fi
			;;
	esac

	if ! [ -x "${EXE}" ]; then
		EXE=/usr/bin/xdm
		PIDFILE=/var/run/xdm.pid
		if ! [ -x "/usr/bin/xdm" ]; then
			echo "ERROR: Please set your DISPLAYMANAGER variable in /etc/conf.d/xdm,"
			echo "	or install x11-apps/xdm package"
			eend 255
		fi
	fi
}

# Check to see if something is defined on our VT
vtstatic() {
	if [ -e /etc/inittab ] ; then
		grep -Eq "^[^#]+.*\<tty$1\>" /etc/inittab
	elif [ -e /etc/ttys ] ; then
		grep -q "^ttyv$(($1 - 1))" /etc/ttys
	else
		return 1
	fi
}

start() {
	local EXE NAME PIDFILE
	setup_dm

	if [ -f /etc/.noxdm ]; then
		einfo "Skipping ${EXE##*/}, /etc/.noxdm found or \"nox\" bootparam passed."
		rm /etc/.noxdm
		return 0
	fi

	ebegin "Setting up ${EXE##*/}"

	# save the prefered DM
	save_options "service" "${EXE}"
	save_options "name"    "${NAME}"
	save_options "pidfile" "${PIDFILE}"
	save_options "start_stop_args" "${START_STOP_ARGS}"

	if [ -n "${CHECKVT-y}" ] ; then
		if vtstatic "${CHECKVT:-7}" ; then
			if [ -x /sbin/telinit ] && [ "${SOFTLEVEL}" != "BOOT" ] && [ "${RC_SOFTLEVEL}" != "BOOT" ]; then
				ewarn "Something is already defined on VT ${CHECKVT:-7}, will start X later"
				telinit a >/dev/null 2>&1
				return 0
			else
				eerror "Something is already defined on VT ${CHECKVT:-7}, not starting"
				return 1
			fi
		fi
	fi

	/etc/X11/startDM.sh
	eend 0
}

stop() {
	local curvt retval

	retval=0
	if [ -t 0 ]; then
		if type fgconsole >/dev/null 2>&1; then
			curvt=$(fgconsole 2>/dev/null)
		else
			curvt=$(tty)
			case "${curvt}" in
				/dev/ttyv[0-9]*) curvt=${curvt#/dev/ttyv} ;;
				*) curvt= ;;
			esac
		fi
	fi
	local myexe myname mypidfile myservice
	myexe=$(get_options "service")
	myname=$(get_options "name")
	mypidfile=$(get_options "pidfile")
	myservice=${myexe##*/}

	[ -z "${myexe}" ] && return 0

	ebegin "Stopping ${myservice}"

	if start-stop-daemon --quiet --test --stop --exec "${myexe}"; then
		start-stop-daemon --stop --exec "${myexe}" --retry TERM/5/TERM/5 \
			${mypidfile:+--pidfile} ${mypidfile} \
			${myname:+--name} ${myname}
		retval=${?}
	fi

	# switch back to original vt
	if [ -n "${curvt}" ]; then
		if type chvt >/dev/null 2>&1; then
			chvt "${curvt}"
		else
			vidcontrol -s "$((curvt + 1))"
		fi
	fi

	eend ${retval} "Error stopping ${myservice}"
	return ${retval}
}

# vim: set ts=4 :