Xserver revision 970
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#!/bin/ksh93
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Permission is hereby granted, free of charge, to any person obtaining a
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# copy of this software and associated documentation files (the "Software"),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# to deal in the Software without restriction, including without limitation
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# the rights to use, copy, modify, merge, publish, distribute, sublicense,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# and/or sell copies of the Software, and to permit persons to whom the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Software is furnished to do so, subject to the following conditions:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# The above copyright notice and this permission notice (including the next
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# paragraph) shall be included in all copies or substantial portions of the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Software.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# DEALINGS IN THE SOFTWARE.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterUSAGE="Usage: $0 [-c <class>] :<display> [<X server arguments>]"
e6c3a72a023407f5d1fface64356e1cc81f1af31Phill Cunnington
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterPATH=/usr/bin:/usr/sbin
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtonprogname=$0
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfunction fatal_error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster print -u2 "${progname}: $*"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington exit 1
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington}
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#########
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington# Default values
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Users must not modify this script to change them - change via SMF properties
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill CunningtonDISPLAY="0"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill CunningtonDEFDEPTH=""
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterCLASSES=""
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill CunningtonTCP_LISTEN=""
a82d04bc19fee9d5e34b41ccd7641da1f62ab634Neil MaddenSERVERARGS=""
a82d04bc19fee9d5e34b41ccd7641da1f62ab634Neil MaddenXSERVER="/usr/bin/Xorg"
a82d04bc19fee9d5e34b41ccd7641da1f62ab634Neil MaddenCONSOLE=""
a82d04bc19fee9d5e34b41ccd7641da1f62ab634Neil Madden
a82d04bc19fee9d5e34b41ccd7641da1f62ab634Neil Madden
a82d04bc19fee9d5e34b41ccd7641da1f62ab634Neil Maddenwhile getopts :c: opt; do
a82d04bc19fee9d5e34b41ccd7641da1f62ab634Neil Madden case $opt in
a82d04bc19fee9d5e34b41ccd7641da1f62ab634Neil Madden c) CLASSES+=" :${OPTARG}" ;;
a82d04bc19fee9d5e34b41ccd7641da1f62ab634Neil Madden ?) print -u2 $USAGE ; exit 2;;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington esac
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtondone
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Maddenshift $((OPTIND - 1))
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtonif (( $# > 1 )) ; then
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington case $1 in
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington :*)
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington # Strip leading ":" from $1 to get display number
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster DISPLAY="${1#:}"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster shift
8d3140b524c0e28c0a49dc7c7d481123ef3cfe11Chris Lee ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster esac
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterREMOTE="false"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfor a in $SERVERARGS "$*" ; do
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case $a in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster -query|-broadcast|-multicast|-indirect)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster REMOTE="true"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ;;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington *)
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington # Do nothing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster esac
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterdone
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterif [[ "${REMOTE}" == "true" ]] ; then
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington CLASSES+=" :remote"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtonelse
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CLASSES+=" :local"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Arguments:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# 1) name of SMF property to find in one of the service instances
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# 2) name of variable to store the value of the property in, if found
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Also sets variable with name of $2_INSTANCE to the service instance the
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington# property was found in, for use in later messages.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfunction getprop {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # Make ${propval} be a reference to the variable named as the second arg
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster nameref propval=$2
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster nameref propinst="${2}_INSTANCE"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # The "" instance is to get the properties from the base service without
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # any instance specifier
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for instance in ":display${DISPLAY}" ${CLASSES} "" ; do
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster propinst="svc:/application/x11/x11-server${instance}"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if svcprop -q -p $1 "${propinst}" ; then
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster propval="$(svcprop -p $1 "${propinst}")"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if [[ "${propval}" == "\"\"" ]] ; then
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster propval=""
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return 0
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster done
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return 1
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fostergetprop options/default_depth DEFDEPTH
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fostergetprop options/server XSERVER
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fostergetprop options/server_args SERVERARGS
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fostergetprop options/tcp_listen TCP_LISTEN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fostergetprop options/display_0_on_console CONSOLE
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterORIGINAL_XSERVER="${XSERVER}"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterif [[ -f ${XSERVER} ]] ; then
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # Canonicalize path, so that we don't break people who specified path
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # via the /usr/X -> openwin or X11 link
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster builtin -f libcmd.so.1 readlink && \
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster XSERVER=$(readlink -f ${XSERVER})
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterelse
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # Automatically select replacements for removed X servers
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case ${XSERVER} in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */Xsun)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster newserver="/usr/bin/Xorg"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */Xvfb)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster newserver="/usr/bin/Xvfb"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fatal_error "${XSERVER} is not an executable"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster esac
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cat 1>&2 <<#EOF
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Specified server ${XSERVER} not found, using ${newserver} instead.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster To correct this warning, change the server property with
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /usr/sbin/svccfg -s ${XSERVER_INSTANCE} \\
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster setprop options/server == ${newserver}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster EOF
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster XSERVER="${newserver}"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Make sure ${XSERVER} is a known X server binary
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfunction is_known_xserver {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster case "$1" in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /usr/bin/Xorg) return 0 ;;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington /usr/bin/amd64/Xorg) return 0 ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /usr/bin/i86/Xorg) return 0 ;;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington /usr/bin/Xvfb) return 0 ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /usr/bin/amd64/Xvfb) return 0 ;;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington /usr/bin/i86/Xvfb) return 0 ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /usr/bin/Xvnc) return 0 ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /usr/openwin/bin/Xsun) return 0 ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /usr/openwin/bin/Xvfb) return 0 ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /opt/SUNWut/lib/Xnewt) return 0 ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster esac
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return 1
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterif ! is_known_xserver "${ORIGINAL_XSERVER}" ; then
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington if ! is_known_xserver "${XSERVER}" ; then
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fatal_error "${XSERVER} is not a valid X server"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington fi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfi
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fostercase ${XSERVER} in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # Xsun based
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /usr/openwin/bin/*)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster DEPTHARG="-defdepth ${DEFDEPTH:-24}"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster # Xorg based
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /usr/bin/*)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if [[ "${DEFDEPTH}" != "" ]] ; then
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster DEPTHARG="-depth ${DEFDEPTH}"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ;;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosteresac
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster# Should not happen, but just in case
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterif [[ "${TCP_LISTEN}" == "" ]] ; then
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if [[ "${REMOTE}" == "true" ]] ; then
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster TCP_LISTEN="true"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster else
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster TCP_LISTEN="false"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterif [[ "${TCP_LISTEN}" == "false" ]] ; then
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LISTENARG="-nolisten tcp"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterelse
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster LISTENARG=""
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterif [[ ("${CONSOLE}" == "true") && ("${DISPLAY}" == "0") ]] ; then
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CONSOLE="-C"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterelse
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CONSOLE=""
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterfi
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan FosterALLARGS="${DEPTHARG} ${LISTENARG} ${SERVERARGS} ${CONSOLE} $*"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterexec ${XSERVER} :${DISPLAY} ${ALLARGS}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster