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