| #!/bin/sh |
| |
| # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| XUSER="${1}" |
| VT="${2}" |
| XAUTH_FILE="${3}" |
| |
| cros-xauth ${XAUTH_FILE} && chown ${XUSER}:${XUSER} ${XAUTH_FILE} |
| |
| # Set permissions for logfile |
| mkdir -p /var/log/xorg && chown ${XUSER}:${XUSER} /var/log/xorg |
| ln -sf xorg/Xorg.0.log /var/log/Xorg.0.log |
| |
| # Disables all the Ctrl-Alt-Fn shortcuts for switching between virtual terminals |
| # if we're in verified boot mode. Otherwise, disables only Fn (n>=3) keys. |
| MAXVT=0 |
| if is_developer_end_user; then |
| # developer end-user |
| MAXVT=2 |
| fi |
| |
| # The X server sends SIGUSR1 to its parent once it's ready to accept |
| # connections -- but only if its own process has inherited SIG_IGN for the |
| # SIGUSR1 handler. So we: |
| # 1. Start a shell through sudo that waits for SIGUSR1. |
| # 2. This shell starts another subshell which clears its own handler for (among |
| # other things) SIGUSR1, then calls exec on the actual X binary. |
| # 3. When X is ready to accept connections, it sends SIGUSR1, which is caught |
| # by the outer shell. Note that both X and the parent shell are running |
| # with the same UID through the sudo session -- this is important to allow |
| # SIGUSR1 to propagate. |
| # 4. The script then terminates, leaving X running. |
| |
| # The '-noreset' works around an apparent bug in the X server that |
| # makes us fail to boot sometimes; see http://crosbug.com/7578. |
| nice -n -20 sudo -u ${XUSER} sh -c " |
| trap 'exit 0' USR1 |
| ( trap '' USR1 TTOU TTIN |
| exec /usr/bin/X -nohwaccess -noreset -maxvt ${MAXVT} -nolisten tcp vt${VT} \ |
| -auth ${XAUTH_FILE} -logfile /var/log/xorg/Xorg.0.log 2> /dev/null ) & |
| wait" |