1278 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			1278 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C++
		
	
	
	
XCOMM!/bin/sh
 | 
						|
XCOMM
 | 
						|
XCOMM Copyright 2002-2004 by Roland Mainz <roland.mainz@nrubsig.org>.
 | 
						|
XCOMM
 | 
						|
XCOMM This script manages the Xprint server side
 | 
						|
 | 
						|
XCOMM Basic support for IRIX-style "chkconfig"
 | 
						|
XCOMM chkconfig: 2345 61 61
 | 
						|
XCOMM description: Startup/shutdown script for Xprint server(s)
 | 
						|
 | 
						|
XCOMM Basic support for the Linux Standard Base Specification 1.0.0
 | 
						|
XCOMM (Note: The Should-Start/Stop lines are there so that this works in the
 | 
						|
XCOMM future, when the LSB adopts these. The X-UnitedLinux lines are there 
 | 
						|
XCOMM so that it works right now.)
 | 
						|
XCOMM## BEGIN INIT INFO
 | 
						|
XCOMM Provides: xprint
 | 
						|
XCOMM Required-Start: $local_fs $remote_fs $syslog $network
 | 
						|
XCOMM Required-Stop: $local_fs $remote_fs $syslog
 | 
						|
XCOMM Should-Start: cups lpd xfs
 | 
						|
XCOMM Should-Stop:  cups lpd xfs
 | 
						|
XCOMM X-UnitedLinux-Should-Start: cups lpd xfs
 | 
						|
XCOMM X-UnitedLinux-Should-Stop:  cups lpd xfs
 | 
						|
XCOMM Default-Start: 3 5
 | 
						|
XCOMM Default-Stop: 0 1 2 6
 | 
						|
XCOMM Description: Startup/shutdown script for Xprint server(s)
 | 
						|
XCOMM## END INIT INFO
 | 
						|
 | 
						|
#undef sun
 | 
						|
#undef unix
 | 
						|
 | 
						|
XCOMM###########################################################################
 | 
						|
XCOMM
 | 
						|
XCOMM This script has three main tasks:
 | 
						|
XCOMM 1. Start Xprint servers ("Xprt") at boot time.
 | 
						|
XCOMM 2. Shutdown Xprint servers when the machine is being shut down.
 | 
						|
XCOMM 3. Query the list of available printers.
 | 
						|
XCOMM
 | 
						|
XCOMM Additional tasks are:
 | 
						|
XCOMM 4. Restart ('restart'|'force-reload') and conditional restart
 | 
						|
XCOMM    ('condrestart'/'try-restart') for Linux support
 | 
						|
XCOMM 5. Wrapping of application call with setting XPSERVERLIST ('wrapper')
 | 
						|
XCOMM
 | 
						|
XCOMM Usage:
 | 
						|
XCOMM - Start Xprint server(s) manually:
 | 
						|
XCOMM   % /etc/init.d/xprint start
 | 
						|
XCOMM
 | 
						|
XCOMM - Stop Xprint server(s) manually:
 | 
						|
XCOMM   % /etc/init.d/xprint stop
 | 
						|
XCOMM
 | 
						|
XCOMM - Populate $XPSERVERLIST env var (for example as part of a global
 | 
						|
XCOMM   login script like /etc/profile or per-user login scripts like
 | 
						|
XCOMM   $HOME/.profile (sh/ksh/bash))
 | 
						|
XCOMM   % XPSERVERLIST="`/etc/init.d/xprint get_xpserverlist`"
 | 
						|
XCOMM   % export XPSERVERLIST
 | 
						|
XCOMM
 | 
						|
XCOMM Installation:
 | 
						|
XCOMM   Copy this script to /etc/init.d/xprint and make sure that it is
 | 
						|
XCOMM   executable. If your installation is LSB-compliant, then run
 | 
						|
XCOMM   % /usr/lib/lsb/install_initd /etc/init.d/xprint
 | 
						|
XCOMM   to start the service on startup. Otherwise, manually create links
 | 
						|
XCOMM   to the matching run levels.
 | 
						|
XCOMM   Examples:
 | 
						|
XCOMM     - Solaris 2.7/2.8/2.9:
 | 
						|
XCOMM       % cp xprint /etc/init.d/xprint
 | 
						|
XCOMM       % chmod a+rx /etc/init.d/xprint
 | 
						|
XCOMM       % ln /etc/init.d/xprint /etc/rc0.d/K38xprint
 | 
						|
XCOMM       % ln /etc/init.d/xprint /etc/rc1.d/K38xprint
 | 
						|
XCOMM       % ln /etc/init.d/xprint /etc/rc2.d/S81xprint
 | 
						|
XCOMM       % ln /etc/init.d/xprint /etc/rcS.d/K38xprint
 | 
						|
XCOMM
 | 
						|
XCOMM     - SuSE Linux 7.3
 | 
						|
XCOMM       % cp xprint /etc/init.d/xprint
 | 
						|
XCOMM       % chmod a+rx /etc/init.d/xprint
 | 
						|
XCOMM       % ln -s ../xprint /etc/init.d/rc3.d/K13xprint
 | 
						|
XCOMM       % ln -s ../xprint /etc/init.d/rc3.d/S12xprint
 | 
						|
XCOMM       % ln -s ../xprint /etc/init.d/rc5.d/K13xprint
 | 
						|
XCOMM       % ln -s ../xprint /etc/init.d/rc5.d/S12xprint
 | 
						|
XCOMM       % ln -s ../xprint /etc/init.d/rc2.d/K13xprint
 | 
						|
XCOMM       % ln -s ../xprint /etc/init.d/rc2.d/S12xprint
 | 
						|
XCOMM
 | 
						|
XCOMM     - SuSE Linux 6.4:
 | 
						|
XCOMM       % cp xprint /sbin/init.d/xprint
 | 
						|
XCOMM       % chmod a+rx /sbin/init.d/xprint
 | 
						|
XCOMM       % ln -s ../xprint /sbin/init.d/rc2.d/K20xprint
 | 
						|
XCOMM       % ln -s ../xprint /sbin/init.d/rc2.d/S20xprint
 | 
						|
XCOMM       % ln -s ../xprint /sbin/init.d/rc3.d/K20xprint
 | 
						|
XCOMM       % ln -s ../xprint /sbin/init.d/rc3.d/S20xprint
 | 
						|
XCOMM
 | 
						|
XCOMM   Notes: 
 | 
						|
XCOMM   - The Xprint servers must be started _after_ the print
 | 
						|
XCOMM     spooler or the server(s) may refuse to start
 | 
						|
XCOMM   - The script should be readable by all users to ensure that they
 | 
						|
XCOMM     can use the "get_xpserverlist"-option
 | 
						|
XCOMM
 | 
						|
XCOMM Custom configuration:
 | 
						|
XCOMM   - Edit the function setup_config() in this script to match your needs
 | 
						|
XCOMM
 | 
						|
XCOMM Known bugs/ToDo/Notes:
 | 
						|
XCOMM   - The shell script assumes that a Xserver can be reached via 
 | 
						|
XCOMM     "hostname:displaynum" where "hostname" is obtained from
 | 
						|
XCOMM     "/usr/bin/hostname". It may happen that a kernel firewall
 | 
						|
XCOMM     blocks an X connection on the same host (e.g. client && Xserver 
 | 
						|
XCOMM     are running on the same host).
 | 
						|
XCOMM     Suggested fix: Fix the firewall config.
 | 
						|
XCOMM     Suggested workaround: Edit this script and replace the use of 
 | 
						|
XCOMM     /usr/bin/hostname with "echo 'localhost'".
 | 
						|
XCOMM
 | 
						|
XCOMM###########################################################################
 | 
						|
XCOMM
 | 
						|
 | 
						|
 | 
						|
XCOMM###########################################################################
 | 
						|
 | 
						|
fatal_error()
 | 
						|
{
 | 
						|
    echo "${0}: ## FATAL ERROR: ${1}" 1>&2
 | 
						|
    exit 1
 | 
						|
}
 | 
						|
 | 
						|
error_echo()
 | 
						|
{
 | 
						|
    echo "${0}: ## ERROR: ${1}" 1>&2
 | 
						|
}
 | 
						|
 | 
						|
warning_echo()
 | 
						|
{
 | 
						|
    echo "${0}: ## WARNING: ${1}" 1>&2
 | 
						|
}
 | 
						|
 | 
						|
verbose_echo()
 | 
						|
{
 | 
						|
    echo "${0}: ${1}"
 | 
						|
}
 | 
						|
 | 
						|
msg()
 | 
						|
{
 | 
						|
    echo "${1}"
 | 
						|
}
 | 
						|
 | 
						|
XCOMM###########################################################################
 | 
						|
 | 
						|
#ifndef OS_LINUX
 | 
						|
XCOMM Force use of a POSIX conformant sh 
 | 
						|
XCOMM (Solaris /sbin/sh is plain Bourne shell)
 | 
						|
[ "$1" != "posix_sh_forced" -a -x /bin/ksh  ]            && exec /bin/ksh  "$0" posix_sh_forced "$@"
 | 
						|
[ "$1" != "posix_sh_forced" -a -x /bin/bash ]            && exec /bin/bash --norc --noprofile "$0" posix_sh_forced "$@"
 | 
						|
[ "$1" != "posix_sh_forced" -a -x /usr/local/bin/ksh ]   && exec /usr/local/bin/ksh "$0" posix_sh_forced "$@"
 | 
						|
[ "$1" != "posix_sh_forced" -a -x /usr/local/bin/bash ]  && exec /usr/local/bin/bash --norc --noprofile "$0" posix_sh_forced "$@"
 | 
						|
if [ "$1" != "posix_sh_forced" ] ; then
 | 
						|
    echo "${0}: ## FATAL ERROR: No POSIX-shell found."  1>&2
 | 
						|
    exit 1
 | 
						|
fi
 | 
						|
 | 
						|
shift # Drop "posix_sh_forced"
 | 
						|
#endif /* !OS_LINUX */
 | 
						|
 | 
						|
XCOMM#debug
 | 
						|
XCOMM set -x
 | 
						|
 | 
						|
XCOMM Change current dir to a location which is writeable by everyone
 | 
						|
cd /tmp
 | 
						|
 | 
						|
XCOMM Clear some environment variables
 | 
						|
unset TEMP TMPDIR SCREENDIR
 | 
						|
 | 
						|
XCOMM Set search path for commands
 | 
						|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
 | 
						|
#ifdef OS_SOLARIS
 | 
						|
export PATH=/usr/xpg4/bin:${PATH}
 | 
						|
#endif
 | 
						|
 | 
						|
XCOMM# Try to figure-out where X11 was installed
 | 
						|
#if defined(OS_SOLARIS)
 | 
						|
XPROJECTROOT=/usr/openwin
 | 
						|
export OPENWINHOME=/usr/openwin
 | 
						|
#elif defined(OS_AIX)
 | 
						|
XPROJECTROOT=/usr/lpp/X11
 | 
						|
#else
 | 
						|
#if defined(ProjectRoot)
 | 
						|
[ -d ProjectRoot/bin ]	&& XPROJECTROOT=ProjectRoot
 | 
						|
#endif
 | 
						|
[ -d /usr/X11/bin ]     && XPROJECTROOT=/usr/X11
 | 
						|
[ -d /usr/X11R6/bin ]   && XPROJECTROOT=/usr/X11R6
 | 
						|
#endif
 | 
						|
XPCUSTOMGLUE=DEF_XPCUSTOMGLUE # This is used for customizing this script
 | 
						|
export XPROJECTROOT XPCUSTOMGLUE
 | 
						|
 | 
						|
if [ -z "${XPROJECTROOT}" ] ; then
 | 
						|
    fatal_error "Unknown XProjectRoot."
 | 
						|
fi
 | 
						|
 | 
						|
XCOMM Set the location of the Xprt binary we want to use.
 | 
						|
XPRT_BIN="${XPROJECTROOT}/bin/Xprt"
 | 
						|
 | 
						|
XCOMM Set the location of the global file where we store the locations 
 | 
						|
XCOMM of the system-wide servers
 | 
						|
if [ -d /var/run ] ; then
 | 
						|
    XP_GLOBAL_SERVERS=/var/run/Xprint_servers
 | 
						|
else
 | 
						|
    XP_GLOBAL_SERVERS=/tmp/.Xprint_servers
 | 
						|
fi
 | 
						|
 | 
						|
XCOMM ${LOGNAME} will not work if user su'ed into another account
 | 
						|
export CURRLOGNAME="$(id -u -n)"
 | 
						|
 | 
						|
XCOMM Set location where we want to store the list of Xprint servers managed
 | 
						|
XCOMM by this user
 | 
						|
XCOMM - If we start as "root" use the global file
 | 
						|
XCOMM - If we start as normal user use a per-user file
 | 
						|
 | 
						|
if [ "${CURRLOGNAME}" != "root" -a "${CURRLOGNAME}" != "" ] ; then
 | 
						|
    XP_PER_USER_SERVERS="/tmp/.Xprint_servers_${CURRLOGNAME}"
 | 
						|
    XP_SERVERS="${XP_PER_USER_SERVERS}"
 | 
						|
else
 | 
						|
    XP_SERVERS="${XP_GLOBAL_SERVERS}"
 | 
						|
fi
 | 
						|
 | 
						|
XCOMM Set umask that owner can r/w all files and everyone else can read them
 | 
						|
umask 022
 | 
						|
 | 
						|
XCOMM Bump limit for per-process open files to ensure that Xprt can open many many fonts
 | 
						|
ulimit -n 1024
 | 
						|
 | 
						|
XCOMM###########################################################################
 | 
						|
 | 
						|
XCOMM Get list of fonts for a given display
 | 
						|
get_fontlist_from_display()
 | 
						|
{
 | 
						|
    ${XPROJECTROOT}/bin/xset -display "${1}" q | 
 | 
						|
      awk "/Font Path:/ { i=1 ; next } i==1 { print \$0 ; i=0 }" | 
 | 
						|
        fontpath2fontlist
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Get list from a fontserver config
 | 
						|
get_fontlist_from_xfs_config()
 | 
						|
{
 | 
						|
    if [ ! -r "${1}" ] ; then
 | 
						|
        return 0
 | 
						|
    fi
 | 
						|
      
 | 
						|
    (        
 | 
						|
      cat "${1}" |
 | 
						|
      while read -r i ; do
 | 
						|
          for val in $i; do
 | 
						|
              case $val in
 | 
						|
                \#*)  break ;;
 | 
						|
                ?*=*) key="${val%%=*}" ;;
 | 
						|
                =*)   key="${tok}" ;;
 | 
						|
                *)    [ "${key}" = "catalogue" -a "${tok}" != "" ] && echo "${tok}" ;;
 | 
						|
              esac
 | 
						|
              tok="${val#*=}"
 | 
						|
          done
 | 
						|
      done
 | 
						|
    ) | tr "," "\n" | fontpath2fontlist
 | 
						|
}
 | 
						|
 | 
						|
get_fontlist_from_all_xfs_configs()
 | 
						|
{
 | 
						|
    get_fontlist_from_xfs_config "/etc/openwin/fs/fontserver.cfg"
 | 
						|
    get_fontlist_from_xfs_config "/usr/openwin/lib/X11/fontserver.cfg"
 | 
						|
    get_fontlist_from_xfs_config "/etc/X11/fs-xtt/config"
 | 
						|
    get_fontlist_from_xfs_config "/etc/X11/fs/config"
 | 
						|
    get_fontlist_from_xfs_config "/etc/X11/xfs/config"
 | 
						|
    get_fontlist_from_xfs_config "${XPROJECTROOT}/lib/X11/fs/config"
 | 
						|
}
 | 
						|
 | 
						|
get_fontlist_from_xf86config()
 | 
						|
{
 | 
						|
    srcxconf=""
 | 
						|
 | 
						|
    XCOMM see xorg.conf(5x) manual page for the list of locations used here    
 | 
						|
    [ "${srcxconf}" = "" -a -f "/etc/X11/xorg.conf"  ]                      && srcxconf="/etc/X11/xorg.conf"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/usr/X11R6/etc/X11/xorg.conf" ]             && srcxconf="/usr/X11R6/etc/X11/xorg.conf"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/etc/X11/xorg.conf-4" ]                     && srcxconf="/etc/X11/xorg.conf-4"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/etc/X11/xorg.conf" ]                       && srcxconf="/etc/X11/xorg.conf"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/etc/xorg.conf" ]                           && srcxconf="/etc/xorg.conf"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/usr/X11R6/etc/X11/xorg.conf.${hostname}" ] && srcxconf="/usr/X11R6/etc/X11/xorg.conf.${hostname}"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/usr/X11R6/etc/X11/xorg.conf-4" ]           && srcxconf="/usr/X11R6/etc/X11/xorg.conf-4"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/usr/X11R6/etc/X11/xorg.conf" ]             && srcxconf="/usr/X11R6/etc/X11/xorg.conf"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/usr/X11R6/lib/X11/xorg.conf.${hostname}" ] && srcxconf="/usr/X11R6/lib/X11/xorg.conf.${hostname}"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/usr/X11R6/lib/X11/xorg.conf-4" ]           && srcxconf="/usr/X11R6/lib/X11/xorg.conf-4"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/usr/X11R6/lib/X11/xorg.conf" ]             && srcxconf="/usr/X11R6/lib/X11/xorg.conf"
 | 
						|
 | 
						|
    XCOMM Xfree86 locations
 | 
						|
    [ "${srcxconf}" = "" -a -f "/etc/X11/XF86Config-4" ] && srcxconf="/etc/X11/XF86Config-4"
 | 
						|
    [ "${srcxconf}" = "" -a -f "/etc/X11/XF86Config" ]   && srcxconf="/etc/X11/XF86Config"
 | 
						|
 | 
						|
 | 
						|
    if [ "${srcxconf}" = "" ] ; then
 | 
						|
        return 0
 | 
						|
    fi
 | 
						|
 | 
						|
    currsection=""
 | 
						|
    cat "${srcxconf}" |
 | 
						|
    while read i1 i2 i3 i4 ; do
 | 
						|
        # Strip "\"" from I2
 | 
						|
        i2="${i2#\"}" ; i2="${i2%\"}"
 | 
						|
 | 
						|
        case "${i1}" in
 | 
						|
            \#*)
 | 
						|
                continue
 | 
						|
                ;;
 | 
						|
            'Section')
 | 
						|
                currsection="${i2}"
 | 
						|
                ;;
 | 
						|
            'EndSection')
 | 
						|
                currsection=""
 | 
						|
                ;;
 | 
						|
            'FontPath')
 | 
						|
                [ "$currsection" = "Files" ] && echo "${i2%:unscaled}"
 | 
						|
                ;;
 | 
						|
        esac  
 | 
						|
    done | egrep -v -i "tcp/|tcp4/|tcp6/|unix/"
 | 
						|
    
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
get_fontlist_from_defoma()
 | 
						|
{
 | 
						|
    # Include Debian defoma font directory where relevant
 | 
						|
    if [ -d "/var/lib/defoma/x-ttcidfont-conf.d/dirs" ] ; then        
 | 
						|
        find "/var/lib/defoma/x-ttcidfont-conf.d/dirs" -name fonts.dir |
 | 
						|
          while read i ; do echo "${i%/fonts.dir}" ; done
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Get list of system fonts
 | 
						|
get_system_fontlist()
 | 
						|
{
 | 
						|
#if defined(OS_SOLARIS)
 | 
						|
          ## List the standard X11 fonts
 | 
						|
          # echo "${XPROJECTROOT}/lib/X11/fonts/F3/"
 | 
						|
          # echo "${XPROJECTROOT}/lib/X11/fonts/F3bitmaps/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/Type1/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/Type1/outline/"
 | 
						|
          # We cannot use /usr/openwin/lib/X11/fonts/Type1/sun/ - see
 | 
						|
          # http://xprint.mozdev.org/bugs/show_bug.cgi?id=5726
 | 
						|
          # ("Xprint doesn't start under Solaris 2.9 due *.ps files in /usr/openwin/lib/X11/fonts/Type1/sun/fonts.dir")
 | 
						|
          #echo "${XPROJECTROOT}/lib/X11/fonts/Type1/sun/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/TrueType/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/Speedo/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/misc/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/75dpi/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/100dpi/"
 | 
						|
  
 | 
						|
          ## List all fonts in all locales installed on this machine
 | 
						|
          cat /usr/openwin/lib/locale/''*/OWfontpath | tr "," "\n" | sort -u
 | 
						|
#elif defined(OS_LINUX)
 | 
						|
          (
 | 
						|
            get_fontlist_from_defoma
 | 
						|
 | 
						|
            get_fontlist_from_xf86config
 | 
						|
            
 | 
						|
            # Getting font paths from XFS is mainly required for compatibilty to RedHat
 | 
						|
            get_fontlist_from_all_xfs_configs
 | 
						|
                   
 | 
						|
            ## List all fonts in all locales installed on this machine
 | 
						|
            (
 | 
						|
              [ -d "/usr/share/fonts" ] && find /usr/share/fonts -name fonts.dir
 | 
						|
              find "${XPROJECTROOT}/lib/X11/fonts" -name fonts.dir 
 | 
						|
            ) | 
 | 
						|
              while read i ; do echo "${i%/fonts.dir}" ; done
 | 
						|
          ) | sort -u
 | 
						|
#else
 | 
						|
          ## List the standard X11 fonts
 | 
						|
          # (AIX should be handled like Solaris but I did not found a way to
 | 
						|
          # enumerate all fonts in all installed locales without scanning the
 | 
						|
          # dirs manually)
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/Type1/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/TrueType/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/TTF/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/Speedo/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/misc/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/75dpi/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/100dpi/"
 | 
						|
          echo "${XPROJECTROOT}/lib/X11/fonts/"
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Filter fonts per given extended regular expressions
 | 
						|
XCOMM (and make sure we filter any model-config fonts - they are managed by Xprt internally)
 | 
						|
filter_fontlist()
 | 
						|
{
 | 
						|
    egrep -- "${1}" | fgrep -v "/models/" | egrep -v -- "${2}"
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Filter font paths with unsupported font types
 | 
						|
XCOMM (such as CID fonts)
 | 
						|
filter_unsupported_fonts()
 | 
						|
{
 | 
						|
    egrep -v -i "/cid(/$|$)|/csl(/$|$)"
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Validate fontpath
 | 
						|
XCOMM Only return valid font path entries (note that these entries may
 | 
						|
XCOMM include non-file stuff like font server references)
 | 
						|
validate_fontlist()
 | 
						|
{
 | 
						|
    while read i ; do       
 | 
						|
        case "${i}" in
 | 
						|
            # Check if font path entry is a font server...
 | 
						|
            tcp/''*|tcp4/''*|tcp6/''*|unix/''*)
 | 
						|
                echo "${i}"
 | 
						|
                ;;
 | 
						|
            # ... if not check if the path is accessible
 | 
						|
            # and has a valid "fonts.dir" index
 | 
						|
            *)
 | 
						|
                [ -f "${i}/fonts.dir" ] && echo "${i}"
 | 
						|
                ;;
 | 
						|
        esac
 | 
						|
    done
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Build a comma-seperated list of fonts (font path) from a list of fonts
 | 
						|
fontlist2fontpath()
 | 
						|
{
 | 
						|
    fp=""
 | 
						|
    read fp;
 | 
						|
    while read i ; do
 | 
						|
        fp="${fp},${i}"
 | 
						|
    done
 | 
						|
    
 | 
						|
    echo "$fp"
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Build a list (one item per line) of fonts from a font path
 | 
						|
fontpath2fontlist()
 | 
						|
{
 | 
						|
    while read i ; do
 | 
						|
        echo "${i}" | tr "," "\n"
 | 
						|
    done
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Sort scaleable fonts (PS Type1 and TrueType) first in a font list
 | 
						|
sort_scaleable_fonts_first()
 | 
						|
{
 | 
						|
    i="$(fontlist2fontpath)"
 | 
						|
    # First list PS Type1 fonts...
 | 
						|
    echo "${i}" | fontpath2fontlist | fgrep "/Type1"
 | 
						|
    # ... then TrueType fonts ...
 | 
						|
    echo "${i}" | fontpath2fontlist | egrep -i "/TrueType|/TT(/$|$)|/TTF(/$|$)"
 | 
						|
    # ... then all others
 | 
						|
    echo "${i}" | fontpath2fontlist | egrep -v -i "/Type1|/TrueType|/TT(/$|$)|/TTF(/$|$)"
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Check if a X display is used by a Xserver or not
 | 
						|
XCOMM Known bugs:
 | 
						|
XCOMM - there is no way in plain bourne shell or bash (see comment about ksh93
 | 
						|
XCOMM   below) to test if a Xserver sits only on a socket and not on a pipe
 | 
						|
XCOMM - some Xserver's don't cleanup their stuff in /tmp on exit which may end
 | 
						|
XCOMM   in the problem that we don't detect possible free display numbers
 | 
						|
XCOMM   (one problem is that only ksh93 can do stuff like 
 | 
						|
XCOMM   "cat </dev/tcp/0.0.0.0/6001")
 | 
						|
CheckIfDisplayIsInUse()
 | 
						|
{
 | 
						|
    id=$1
 | 
						|
    
 | 
						|
    [ -r "/tmp/.X${id}-lock"     ] && return 0;
 | 
						|
    [ -r "/tmp/.X11-unix/X${id}" ] && return 0;
 | 
						|
    [ -r "/tmp/.X11-pipe/X${id}" ] && return 0;
 | 
						|
    
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
 | 
						|
lastdisplaynumreturned_store=/tmp/.Xp_last_display_returned_by_findfreexdisplaynum_${RANDOM}_${RANDOM}
 | 
						|
 | 
						|
XCOMM Try to find a free display number
 | 
						|
FindFreeXDisplayNum()
 | 
						|
{
 | 
						|
    if [ -r "${lastdisplaynumreturned_store}" ] ; then
 | 
						|
      i="$(cat "${lastdisplaynumreturned_store}")"
 | 
						|
    else
 | 
						|
      i=32 # start at display 32
 | 
						|
    fi
 | 
						|
    
 | 
						|
    while [ $i -lt 127 ] ; do
 | 
						|
        i=$(($i + 1))
 | 
						|
 | 
						|
        if CheckIfDisplayIsInUse $i ; then
 | 
						|
            true
 | 
						|
        else
 | 
						|
            echo "$i"
 | 
						|
            echo "$i" >"${lastdisplaynumreturned_store}"
 | 
						|
            return 0
 | 
						|
        fi
 | 
						|
    done
 | 
						|
 | 
						|
    # Using "magic" value of 189 here due lack of a better solution
 | 
						|
    echo "189"
 | 
						|
    echo "189" >"${lastdisplaynumreturned_store}"    
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Check if a process exists or not
 | 
						|
pexists()
 | 
						|
{
 | 
						|
    [ "$1" = "" ] && return 1;
 | 
						|
 | 
						|
    # Use of /proc would be better but not all platforms (like AIX) have procfs
 | 
						|
    [ "$(ps -p $1 | fgrep $1)" != "" ] && return 0;
 | 
						|
    return 1
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Check if there is a spooler running...
 | 
						|
is_spooler_running()
 | 
						|
{
 | 
						|
    # This covers Linux lpd, CUPS, Solaris and AIX 4.x - but what about
 | 
						|
    # AIX 5.x, HP-UX and IRIX ?
 | 
						|
 | 
						|
    [ "$(ps -A | egrep 'lpd|lpsched|cupsd|qdaemon' | fgrep -v 'grep')" != "" ] && return 0;
 | 
						|
    return 1
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Wait until the spooler system has been started (but not more than 30secs)
 | 
						|
wait_for_print_spooler()
 | 
						|
{
 | 
						|
    for i in 1 2 3 4 5 6 7 8 9 10 ; do
 | 
						|
        is_spooler_running && return 0;
 | 
						|
        sleep 3
 | 
						|
    done
 | 
						|
    
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
lock_server_registry()
 | 
						|
{
 | 
						|
    lock_counter=0 # counts in 1/100s
 | 
						|
    waiting_for_lock_msg_send="false"
 | 
						|
    while ! mkdir "${XP_SERVERS}.lock" 2>/dev/null ; do
 | 
						|
        # print notice after 2 seconds
 | 
						|
        if [ ${lock_counter} -gt 200 -a "${waiting_for_lock_msg_send}" != "true" ] ; then
 | 
						|
            echo "${0}: waiting for lock(=${XP_SERVERS}.lock)..."
 | 
						|
            waiting_for_lock_msg_send="true"
 | 
						|
        fi
 | 
						|
 | 
						|
        # tread the lock as "broken" after 20 seconds
 | 
						|
        if [ ${lock_counter} -gt 2000 ] ; then
 | 
						|
            echo "${0}: WARNING: lock timeout for lock(=${XP_SERVERS}.lock)."
 | 
						|
            return 0
 | 
						|
        fi
 | 
						|
                
 | 
						|
        if [ -x /bin/usleep ] ; then
 | 
						|
            /bin/usleep 200000
 | 
						|
            lock_counter=$((${lock_counter} + 20)) # 20/100s
 | 
						|
        else
 | 
						|
            sleep 1
 | 
						|
            lock_counter=$((${lock_counter} + 100)) # 100/100s
 | 
						|
        fi
 | 
						|
    done
 | 
						|
}
 | 
						|
 | 
						|
unlock_server_registry()
 | 
						|
{
 | 
						|
    rmdir "${XP_SERVERS}.lock"
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Kill dead registry locks (silently!)
 | 
						|
kill_dead_registry_locks()
 | 
						|
{
 | 
						|
    rm -Rf "${XP_SERVERS}.lock"
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Start Xprint servers
 | 
						|
start_servers()
 | 
						|
{
 | 
						|
    # Write registry "intro" ...
 | 
						|
    lock_server_registry
 | 
						|
    echo "# Xprint server list"                               >>"${XP_SERVERS}"
 | 
						|
    echo "# File is for private use for ${0}."                >>"${XP_SERVERS}"
 | 
						|
    echo "# Do not edit, rely on the content or file format." >>"${XP_SERVERS}"
 | 
						|
    unlock_server_registry
 | 
						|
 | 
						|
    hostname="$(hostname)"
 | 
						|
 | 
						|
    default_fontpath="$(get_system_fontlist | fontlist2fontpath)"
 | 
						|
    default_fontpath_acceptpattern=".*";
 | 
						|
    default_fontpath_rejectpattern="_No_Match_"; # Match nothing   
 | 
						|
    
 | 
						|
    curr=0
 | 
						|
    while [ $curr -lt $num_xpstart ] ; do
 | 
						|
        if [ "${xpstart_remote_server[$curr]}" != "" ] ; then
 | 
						|
            # Remote Xprt, just put the entry into the registry
 | 
						|
            lock_server_registry
 | 
						|
            echo "display=${xpstart_remote_server[$curr]}" >>"${XP_SERVERS}"
 | 
						|
            unlock_server_registry
 | 
						|
        else
 | 
						|
            # Run block in seperate process to avoid that changes to the
 | 
						|
            # xpstart_* variables affect the next cycle
 | 
						|
            (
 | 
						|
              # Use defaults if there are no special options
 | 
						|
              [ "${xpstart_fontpath[$curr]}"               = "" ] &&               xpstart_fontpath[$curr]="${default_fontpath}";
 | 
						|
              [ "${xpstart_fontpath_acceptpattern[$curr]}" = "" ] && xpstart_fontpath_acceptpattern[$curr]="$default_fontpath_acceptpattern";
 | 
						|
              [ "${xpstart_fontpath_rejectpattern[$curr]}" = "" ] && xpstart_fontpath_rejectpattern[$curr]="$default_fontpath_rejectpattern";
 | 
						|
              [ "${xpstart_displayid[$curr]}"              = "" ] &&              xpstart_displayid[$curr]="$(FindFreeXDisplayNum)"       
 | 
						|
              [ "${xpstart_logger[$curr]}"                 = "" ] &&                 xpstart_logger[$curr]="logger -p lpr.notice -t Xprt_${xpstart_displayid[$curr]}";
 | 
						|
              [ "${xpstart_logfile[$curr]}"                = "" ] &&                xpstart_logfile[$curr]="/dev/null";
 | 
						|
              [ "${xpstart_xprt_binary[$curr]}"            = "" ] &&            xpstart_xprt_binary[$curr]="${XPRT_BIN}";
 | 
						|
              if [ "${xpstart_xprt_binary[$curr]}" = "/usr/openwin/bin/Xprt" -o "$(uname -s)" = "SunOS" ] ; then
 | 
						|
                  # Solaris /usr/openwin/bin/Xprt does not support "-nolisten tcp"
 | 
						|
                  # yet nor is it possible to run a Xserver on a unix socket only
 | 
						|
                  # in Solaris since access to the unix domain sockets in
 | 
						|
                  # /tmp/.X11-pipe and /tmp/.X11-unix is restricted to applications
 | 
						|
                  # with group-id "root" (e.g. the Xprt server would need to be
 | 
						|
                  # setgid "root" that plain users can start it listening on a unix
 | 
						|
                  # socket only)
 | 
						|
                  [ "${xpstart_options[$curr]}" = "" ] && xpstart_options[$curr]="-ac -pn"
 | 
						|
              else
 | 
						|
                  [ "${xpstart_options[$curr]}" = "" ] && xpstart_options[$curr]="-ac -pn -nolisten tcp"
 | 
						|
              fi
 | 
						|
 | 
						|
              # Check if the Xprt binary is available                                     
 | 
						|
              if [ ! -x "${xpstart_xprt_binary[$curr]}" ] ; then                                            
 | 
						|
                  error_echo "Can't find \"${xpstart_xprt_binary[$curr]}\"."                                  
 | 
						|
                  exit 1 # exit block                                                               
 | 
						|
              fi                                                                          
 | 
						|
 | 
						|
              # Verify and set location of font encodings directory file
 | 
						|
              if [ "${xpstart_font_encodings_dir[$curr]}" = "" ] ; then
 | 
						|
                  if [ -f "${XPROJECTROOT}/lib/X11/fonts/xf86encodings/encodings.dir" ] ; then
 | 
						|
                      xpstart_font_encodings_dir[$curr]="${XPROJECTROOT}/lib/X11/fonts/xf86encodings/encodings.dir"
 | 
						|
                  else
 | 
						|
                      xpstart_font_encodings_dir[$curr]="${XPROJECTROOT}/lib/X11/fonts/encodings/encodings.dir";
 | 
						|
                  fi
 | 
						|
              fi
 | 
						|
 | 
						|
              unset FONT_ENCODINGS_DIRECTORY
 | 
						|
              if [ ! -f "${xpstart_font_encodings_dir[$curr]}" ] ; then
 | 
						|
                  warning_echo "Can't find \"${xpstart_font_encodings_dir[$curr]}\", TrueType font support may not work."
 | 
						|
              fi
 | 
						|
 | 
						|
              export FONT_ENCODINGS_DIRECTORY="${xpstart_font_encodings_dir[$curr]}"
 | 
						|
 | 
						|
              # Generate font path (containing only valid font path elements)
 | 
						|
              # from input font path and filter expressions
 | 
						|
              curr_fp=$(echo "${xpstart_fontpath[$curr]}" | 
 | 
						|
                        fontpath2fontlist |
 | 
						|
                        filter_fontlist "${xpstart_fontpath_acceptpattern[$curr]}" "${xpstart_fontpath_rejectpattern[$curr]}" | 
 | 
						|
                        filter_unsupported_fonts |
 | 
						|
                        sort_scaleable_fonts_first | 
 | 
						|
                        validate_fontlist | 
 | 
						|
                        fontlist2fontpath)
 | 
						|
 | 
						|
              # Set Xserver auditing level option
 | 
						|
              unset curr_audit
 | 
						|
              if [ "${xpstart_auditlevel[$curr]}" != "" ] ; then
 | 
						|
                  curr_audit="-audit ${xpstart_auditlevel[$curr]}"
 | 
						|
              fi
 | 
						|
 | 
						|
              # Set Xprt -XpFile option
 | 
						|
              unset curr_xpfile
 | 
						|
              if [ "${xpstart_xpfile[$curr]}" != "" ] ; then
 | 
						|
                  curr_xpfile="-XpFile ${xpstart_xpfile[$curr]}"
 | 
						|
              fi
 | 
						|
 | 
						|
              # Set custom XPCONFIGDIR (if there is one)
 | 
						|
              unset XPCONFIGDIR
 | 
						|
              if [ "${xpstart_xpconfigdir[$curr]}" != "" ] ; then
 | 
						|
                  export XPCONFIGDIR="${xpstart_xpconfigdir[$curr]}"
 | 
						|
              fi
 | 
						|
 | 
						|
              # If someone uses "-nolisten tcp" make sure we do not add a hostname to force local transport
 | 
						|
              if [ "$(echo "${xpstart_options[$curr]}" | egrep "nolisten.*tcp")" != "" ] ; then
 | 
						|
                  xp_display=":${xpstart_displayid[$curr]}"
 | 
						|
              else
 | 
						|
                  xp_display="${hostname}:${xpstart_displayid[$curr]}"
 | 
						|
              fi
 | 
						|
              
 | 
						|
              (
 | 
						|
                (
 | 
						|
                  "${xpstart_xprt_binary[$curr]}" \
 | 
						|
                      ${xpstart_options[$curr]} \
 | 
						|
                      ${curr_xpfile} ${curr_audit} \
 | 
						|
                      -fp ${curr_fp} \
 | 
						|
                      :${xpstart_displayid[$curr]} &
 | 
						|
                  server_pid="$!"
 | 
						|
 
 | 
						|
                  # Append the new server to the registry
 | 
						|
                  lock_server_registry
 | 
						|
                  echo "display=${xp_display} display_id=${xpstart_displayid[$curr]} pid=${server_pid}" >>"${XP_SERVERS}"
 | 
						|
                  unlock_server_registry
 | 
						|
                  
 | 
						|
                  wait
 | 
						|
                  echo "Xprint server pid=${server_pid} done, exitcode=$?."
 | 
						|
                  
 | 
						|
                  # Remove the dead server from the registry
 | 
						|
                  # (only if the registry still exists - if /etc/init.d/xprint stop" gets called the registry
 | 
						|
                  # will be removed - and we should not re-create it afterwards...)
 | 
						|
                  lock_server_registry
 | 
						|
                  if [ -f "${XP_SERVERS}" ] ; then
 | 
						|
                      x="$(cat "${XP_SERVERS}")" # Store content of file "${XP_SERVERS}" in var "x"
 | 
						|
                      echo "${x}" | fgrep -v "display_id=${xpstart_displayid[$curr]} pid=${server_pid}" >"${XP_SERVERS}"
 | 
						|
                  fi
 | 
						|
                  unlock_server_registry                 
 | 
						|
                ) 2>&1 | while read i ; do echo "$i" | tee -a "${xpstart_logfile[$curr]}" | ${xpstart_logger[$curr]} ; done
 | 
						|
              ) &
 | 
						|
            )
 | 
						|
        fi
 | 
						|
        
 | 
						|
        curr=$(($curr + 1))
 | 
						|
    done
 | 
						|
    
 | 
						|
    # Remove tmp. file created by |FindFreeXDisplayNum()|
 | 
						|
    rm -f "${lastdisplaynumreturned_store}"
 | 
						|
 | 
						|
    # Done.
 | 
						|
    lock_server_registry
 | 
						|
    echo "# EOF." >>"${XP_SERVERS}"
 | 
						|
    unlock_server_registry
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
XCOMM Convenience function to check setup and start Xprt server(s)
 | 
						|
do_start()
 | 
						|
{
 | 
						|
    if [ -f "${XP_SERVERS}" ] ; then
 | 
						|
        numservers="$(do_get_xpserverlist | wc -l)"
 | 
						|
        if [ ${numservers} -gt 0 ] ; then
 | 
						|
            verbose_echo "Xprint servers are already running."
 | 
						|
            return 0
 | 
						|
        else
 | 
						|
            verbose_echo "Old server registry found, cleaning-up..."
 | 
						|
            do_stop
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
    
 | 
						|
    # Check if we can write the registry file
 | 
						|
    touch "${XP_SERVERS}" 2>/dev/null
 | 
						|
    if [ ! -f "${XP_SERVERS}" ] ; then
 | 
						|
        error_echo "Cannot create \"${XP_SERVERS}\"."
 | 
						|
        # exit code 4 = user had insufficient privilege (LSB)
 | 
						|
        exit 4
 | 
						|
    fi
 | 
						|
 | 
						|
    if ! setup_config ; then
 | 
						|
        error_echo "setup_config failed."
 | 
						|
        exit 1
 | 
						|
    fi
 | 
						|
 | 
						|
    # Provide two paths here - one which simply starts the Xprt servers,
 | 
						|
    # assuming that there is a print spooler already running (or that 
 | 
						|
    # ${XPCONFIG}/C/print/Xprinters provides static print queue entries
 | 
						|
    # (like for the PSspooldir print model)) and a 2nd path which
 | 
						|
    # explicitly checks if the print queue daemons are running
 | 
						|
    if true ; then
 | 
						|
        msg "Starting Xprint servers: Xprt."
 | 
						|
        start_servers
 | 
						|
    else 
 | 
						|
        # Continue in the background if there is no spooler running yet (that
 | 
						|
        # we don't hold off the boot process nor run in a possible race-condition
 | 
						|
        # when /etc/init.d/lpd was not called yet but the runlevel script waits
 | 
						|
        # for us to finish first ...
 | 
						|
        if is_spooler_running ; then
 | 
						|
            msg "Starting Xprint servers: Xprt."
 | 
						|
            start_servers
 | 
						|
        else
 | 
						|
            msg "Starting Xprint servers (in the background): Xprt."
 | 
						|
            (wait_for_print_spooler ; start_servers) &
 | 
						|
            sleep 5
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
    
 | 
						|
    if [ "${CURRLOGNAME}" = "root" -a -d /var/lock/subsys/ ] ; then
 | 
						|
        touch /var/lock/subsys/xprint
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Convenience function to stop Xprt server(s)
 | 
						|
do_stop()
 | 
						|
{
 | 
						|
    msg "Stopping Xprint servers: Xprt."
 | 
						|
 | 
						|
    lock_server_registry
 | 
						|
    if [ -f "${XP_SERVERS}" ] ; then       
 | 
						|
        reglist="$(cat "${XP_SERVERS}")"
 | 
						|
        rm -f "${XP_SERVERS}"
 | 
						|
    fi
 | 
						|
    unlock_server_registry
 | 
						|
    
 | 
						|
    if [ "${reglist}" != "" ] ; then
 | 
						|
        echo "${reglist}" |
 | 
						|
          grep "^display=.*:.* pid=[0-9]*$" |
 | 
						|
          while read i ; do
 | 
						|
              (
 | 
						|
                eval ${i}
 | 
						|
                if pexists ${pid} ; then 
 | 
						|
                    kill ${pid}
 | 
						|
                fi
 | 
						|
 | 
						|
                # Remove the X sockets/pipes which are not in use anymore
 | 
						|
                # (It would be better if the Xservers would cleanup this
 | 
						|
                # automatically, but most Xservers do not do that... ;-(
 | 
						|
                # Note that this will not work on Solaris where applications
 | 
						|
                # must run with groupid="root" if they want to write into
 | 
						|
                # /tmp/.X11-unix/ and/or /tmp/.X11-pipe/)
 | 
						|
                if [ "${display_id}" != "" ] ; then
 | 
						|
                    rm -f "/tmp/.X${display_id}-lock"     2>/dev/null
 | 
						|
                    rm -f "/tmp/.X11-unix/X${display_id}" 2>/dev/null
 | 
						|
                    rm -f "/tmp/.X11-pipe/X${display_id}" 2>/dev/null
 | 
						|
                fi 
 | 
						|
              )
 | 
						|
          done
 | 
						|
    fi
 | 
						|
 | 
						|
    if [ "${CURRLOGNAME}" = "root" -a -d /var/lock/subsys/ ] ; then
 | 
						|
        rm -f /var/lock/subsys/xprint
 | 
						|
    fi
 | 
						|
    
 | 
						|
    # Remove any outstanding (dead) locks and cleanup
 | 
						|
    rm -f "${XP_SERVERS}"
 | 
						|
    kill_dead_registry_locks
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Convenience function to obtain a list of available Xprint servers
 | 
						|
do_get_xpserverlist()
 | 
						|
{
 | 
						|
    if [ -f "${XP_PER_USER_SERVERS}" -o -f "${XP_GLOBAL_SERVERS}" ] ; then
 | 
						|
        xpserverlist=$(
 | 
						|
          # Enumerate both per-user and global servers (in that order)
 | 
						|
          (
 | 
						|
            [ -f "${XP_PER_USER_SERVERS}" ]  && cat "${XP_PER_USER_SERVERS}"
 | 
						|
            [ -f "${XP_GLOBAL_SERVERS}"   ]  && cat "${XP_GLOBAL_SERVERS}"
 | 
						|
          ) |
 | 
						|
            egrep "^display=.*:.* pid=[0-9]*$|^display=.*:[0-9]*$" |
 | 
						|
              while read i ; do
 | 
						|
                  (
 | 
						|
                    pid="none"
 | 
						|
                    eval ${i}
 | 
						|
                    # Check if the Xprt process exists (if possible)
 | 
						|
                    if [ "$pid" != "none" ] ; then
 | 
						|
                        if pexists ${pid} ; then
 | 
						|
                            echo ${display}
 | 
						|
                        fi
 | 
						|
                    else
 | 
						|
                        echo ${display}
 | 
						|
                    fi
 | 
						|
                  )
 | 
						|
              done | tr "\n" " "
 | 
						|
          )
 | 
						|
        # Only produce output if we have some entries...
 | 
						|
        [ "${xpserverlist}" != "" ] && echo "${xpserverlist}"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
do_restart()
 | 
						|
{
 | 
						|
    msg "Restarting Xprint server(s): Xprt."
 | 
						|
    do_stop
 | 
						|
    sleep 1
 | 
						|
    do_start
 | 
						|
}
 | 
						|
 | 
						|
do_diag()
 | 
						|
{
 | 
						|
    echo "##### Diag start $(date)."
 | 
						|
    
 | 
						|
    # General info
 | 
						|
    echo "## General info start."
 | 
						|
    (
 | 
						|
      echo "PATH=\"${PATH}\""
 | 
						|
      echo "TZ=\"${TZ}\""
 | 
						|
      echo "LANG=\"${LANG}\""
 | 
						|
      echo "uname -a=\"$(uname -a)\""
 | 
						|
      echo "uname -s=\"$(uname -s)\""
 | 
						|
      echo "uname -p=\"$(uname -p)\""
 | 
						|
      echo "uname -i=\"$(uname -i)\""
 | 
						|
      echo "uname -m=\"$(uname -m)\""
 | 
						|
      echo "has /etc/SuSE-release ... $([ -f "/etc/SuSE-release" ] && echo "yes" || echo "no")"
 | 
						|
      echo "has /etc/redhat-release ... $([ -f "/etc/redhat-release" ] && echo "yes" || echo "no")"
 | 
						|
      echo "has /etc/debian_version ... $([ -f "/etc/debian_version" ] && echo "yes" || echo "no")"
 | 
						|
      echo "how many Xprt servers are running ...$(ps -ef | fgrep Xprt | fgrep -v "grep" | wc -l)"
 | 
						|
    ) 2>&1 | while read i ; do echo "  $i" ; done
 | 
						|
    echo "## General info end."
 | 
						|
    
 | 
						|
    # Testing font paths
 | 
						|
    echo "## Testing font paths start."
 | 
						|
    (
 | 
						|
      get_system_fontlist |
 | 
						|
          filter_unsupported_fonts |
 | 
						|
          sort_scaleable_fonts_first | 
 | 
						|
          validate_fontlist | while read d ; do
 | 
						|
          echo "#### Testing \"${d}\" ..."
 | 
						|
          if [ ! -d "$d" ] ; then
 | 
						|
              echo "# Error: $d does not exists."
 | 
						|
              continue
 | 
						|
          fi
 | 
						|
          if [ ! -r "$d" ] ; then
 | 
						|
              echo "# Error: $d not readable."
 | 
						|
              continue
 | 
						|
          fi
 | 
						|
          if [ ! -f "${d}/fonts.dir" ] ; then
 | 
						|
              echo "# Error: ${d}/fonts.dir not found."
 | 
						|
              continue
 | 
						|
          else
 | 
						|
              if [ ! -r "${d}/fonts.dir" ] ; then
 | 
						|
                  echo "# Error: ${d}/fonts.dir not readable."
 | 
						|
                  continue
 | 
						|
              fi
 | 
						|
          fi
 | 
						|
          if [ -f "${d}/fonts.alias" ] ; then
 | 
						|
              if [ ! -r "${d}/fonts.alias" ] ; then
 | 
						|
                  echo "# Error: ${d}/fonts.alias not readable."
 | 
						|
              fi
 | 
						|
          fi
 | 
						|
 | 
						|
          if [ "$(cat "${d}/fonts.dir" | fgrep 'cursor')" != "" ] ; then
 | 
						|
              echo "${d}/fonts.dir has cursor font."
 | 
						|
          fi
 | 
						|
          if [ "$(cat "${d}/fonts.dir" | fgrep 'fixed')" != "" ] ; then
 | 
						|
              echo "${d}/fonts.dir has fixed font."
 | 
						|
          fi
 | 
						|
 | 
						|
          if [ -r "${d}/fonts.alias" ] ; then 
 | 
						|
              if [ "$(cat "${d}/fonts.alias" | fgrep 'cursor')" != "" ] ; then
 | 
						|
                  echo "${d}/fonts.alias has cursor font."
 | 
						|
              fi
 | 
						|
              if [ "$(cat "${d}/fonts.alias" | fgrep 'fixed')" != "" ] ; then
 | 
						|
                  echo "${d}/fonts.alias has fixed font."
 | 
						|
              fi
 | 
						|
          fi
 | 
						|
 | 
						|
          linenum=0
 | 
						|
          cat "${d}/fonts.dir" | while read i1 i2 i3 i4 ; do
 | 
						|
              linenum=$((${linenum} + 1))
 | 
						|
              [ ${linenum} -eq 1 ] && continue
 | 
						|
 | 
						|
              if [ ! -f "${d}/${i1}" ] ; then
 | 
						|
                  echo "ERROR: ${d}/fonts.dir line ${linenum} has non-exististant font \"${i1}\" (=\"${i1} ${i2} ${i3} ${i4}\")"
 | 
						|
              fi
 | 
						|
          done
 | 
						|
      done
 | 
						|
    ) 2>&1 | while read i ; do echo "  $i" ; done
 | 
						|
    echo "## Testing font paths end."
 | 
						|
    
 | 
						|
    echo "##### Diag End $(date)."
 | 
						|
}
 | 
						|
 | 
						|
XCOMM Set platform-defaults for setup_config()
 | 
						|
setup_config_defaults()
 | 
						|
{
 | 
						|
    curr_num_xpstart="${1}"
 | 
						|
    
 | 
						|
    #### Defaults for Linux/Solaris
 | 
						|
    # Start Xprt using builtin XPCONFIGDIR at a free display numer
 | 
						|
    # (Solaris(=SunOS5.x)'s /usr/openwin/bin/Xprt supports TrueType fonts,
 | 
						|
    # therefore we don't need to filter them)
 | 
						|
                      xpstart_fontpath[${curr_num_xpstart}]="";
 | 
						|
        xpstart_fontpath_acceptpattern[${curr_num_xpstart}]=".*";
 | 
						|
        xpstart_fontpath_rejectpattern[${curr_num_xpstart}]="/Speedo|/F3bitmaps|/F3";
 | 
						|
                     xpstart_displayid[${curr_num_xpstart}]="";
 | 
						|
                   xpstart_xpconfigdir[${curr_num_xpstart}]="";
 | 
						|
                        xpstart_xpfile[${curr_num_xpstart}]="";
 | 
						|
                    xpstart_auditlevel[${curr_num_xpstart}]="4";
 | 
						|
                       xpstart_options[${curr_num_xpstart}]="";
 | 
						|
                        xpstart_logger[${curr_num_xpstart}]="";
 | 
						|
    # Check whether we have /dev/stderr (needed for old AIX + old Debian)
 | 
						|
    if [ -w "/dev/stderr" ] ; then
 | 
						|
                       xpstart_logfile[${curr_num_xpstart}]="/dev/stderr";
 | 
						|
    else
 | 
						|
                       xpstart_logfile[${curr_num_xpstart}]="/dev/tty";
 | 
						|
    fi
 | 
						|
                   xpstart_xprt_binary[${curr_num_xpstart}]="";
 | 
						|
 | 
						|
    # Custom rules for the GISWxprintglue package on Solaris
 | 
						|
    # (which uses Solaris's /usr/openwin/bin/Xprt but a custom config)
 | 
						|
    if [ "${XPCUSTOMGLUE}" = "GISWxprintglue" ] ; then
 | 
						|
        xpstart_xpconfigdir[${curr_num_xpstart}]="/opt/GISWxprintglue/server/etc/XpConfig"
 | 
						|
        xpstart_xprt_binary[${curr_num_xpstart}]="/usr/openwin/bin/Xprt"
 | 
						|
    fi
 | 
						|
    # Custom rules for the GISWxprint package on Solaris
 | 
						|
    # (which uses both it's own Xprt and a custom config)
 | 
						|
    if [ "${XPCUSTOMGLUE}" = "GISWxprint" ] ; then
 | 
						|
        xpstart_xpconfigdir[${curr_num_xpstart}]="/opt/GISWxprint/server/etc/XpConfig"
 | 
						|
        xpstart_xprt_binary[${curr_num_xpstart}]="/opt/GISWxprint/bin/Xprt"
 | 
						|
        xpstart_font_encodings_dir[${curr_num_xpstart}]="/opt/GISWxprint/lib/X11/fonts/encodings/encodings.dir"
 | 
						|
    fi
 | 
						|
    
 | 
						|
    #######################################################
 | 
						|
    ###
 | 
						|
    ### Debian Xprint package default configuration
 | 
						|
    ###
 | 
						|
    if [ "${XPCUSTOMGLUE}" = "DebianGlue" ] ; then
 | 
						|
        # Set XPCONFIGDIR=/usr/share/Xprint/xserver
 | 
						|
        xpstart_xpconfigdir[${curr_num_xpstart}]="/usr/share/Xprint/xserver";
 | 
						|
 | 
						|
        # Use fixed display ID (":64"), or else all client programs will have to be
 | 
						|
        # restarted simply to update XPSERVERLIST to the latest ID when upgrading,
 | 
						|
        # which would be a nightmare.
 | 
						|
        xpstart_displayid[${curr_num_xpstart}]=64;
 | 
						|
 | 
						|
        # Do not send any messages to console
 | 
						|
        xpstart_logfile[${curr_num_xpstart}]="/dev/null";
 | 
						|
 | 
						|
        # By default use binary provided by Debian's "xprt-xprintorg" package
 | 
						|
        # (=/usr/bin/Xprt), otherwise leave blank (e.g. use script's default
 | 
						|
        # (=/usr/X11R6/bin/Xprt))
 | 
						|
        if [ -x "/usr/bin/Xprt" ] ; then
 | 
						|
            xpstart_xprt_binary[${curr_num_xpstart}]="/usr/bin/Xprt";
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
    ###
 | 
						|
    ### End Debian default configuration
 | 
						|
    ###
 | 
						|
    #######################################################
 | 
						|
}
 | 
						|
 | 
						|
fetch_etc_initd_xprint_envvars()
 | 
						|
{
 | 
						|
    curr_num_xpstart="${1}"
 | 
						|
 | 
						|
    ## Process some $ETC_INITD_XPRINT_* vars after all which may be used by
 | 
						|
    # a user to override the hardcoded values here when starting Xprt per-user
 | 
						|
    # (a more flexible way is to provide an own setup config script in
 | 
						|
    # "~./Xprint_per_user_startup" - see above)
 | 
						|
    if [ "${ETC_INITD_XPRINT_XPRT_PATH}" != "" ] ; then
 | 
						|
        xpstart_xprt_binary[${curr_num_xpstart}]="${ETC_INITD_XPRINT_XPRT_PATH}"
 | 
						|
    fi
 | 
						|
    if [ "${ETC_INITD_XPRINT_XPCONFIGDIR}" != "" ] ; then
 | 
						|
        xpstart_xpconfigdir[${curr_num_xpstart}]="${ETC_INITD_XPRINT_XPCONFIGDIR}"
 | 
						|
    fi
 | 
						|
    if [ "${ETC_INITD_XPRINT_XPFILE}" != "" ] ; then
 | 
						|
        xpstart_xpfile[${curr_num_xpstart}]="${ETC_INITD_XPRINT_XPFILE}"
 | 
						|
    fi
 | 
						|
    if [ "${ETC_INITD_XPRINT_LOGFILE}" != "" ] ; then
 | 
						|
        xpstart_logfile[${curr_num_xpstart}]="${ETC_INITD_XPRINT_LOGFILE}"
 | 
						|
    fi
 | 
						|
    if [ "${ETC_INITD_XPRINT_DISPLAYID}" != "" ] ; then
 | 
						|
        xpstart_displayid[${curr_num_xpstart}]="${ETC_INITD_XPRINT_DISPLAYID}"
 | 
						|
    fi
 | 
						|
    if [ "${ETC_INITD_XPRINT_FONTPATH}" != "" ] ; then
 | 
						|
        xpstart_fontpath[${curr_num_xpstart}]="${ETC_INITD_XPRINT_FONTPATH}"
 | 
						|
    fi
 | 
						|
    if [ "${ETC_INITD_XPRINT_XPRT_OPTIONS}" != "" ] ; then
 | 
						|
        xpstart_options[${curr_num_xpstart}]="${ETC_INITD_XPRINT_XPRT_OPTIONS}"
 | 
						|
    fi
 | 
						|
    if [ "${ETC_INITD_XPRINT_AUDITLEVEL}" != "" ] ; then
 | 
						|
        xpstart_auditlevel[${curr_num_xpstart}]="${ETC_INITD_XPRINT_AUDITLEVEL}"
 | 
						|
    fi
 | 
						|
    if [ "${ETC_INITD_XPRINT_XF86ENCODINGSDIR}" != "" ] ; then
 | 
						|
        xpstart_font_encodings_dir[${curr_num_xpstart}]="${ETC_INITD_XPRINT_XF86ENCODINGSDIR}"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
XCOMM###########################################################################
 | 
						|
XCOMM setup_config() sets the configuration parameters used to start one
 | 
						|
XCOMM or more Xprint servers ("Xprt").
 | 
						|
XCOMM The following variables are used:
 | 
						|
XCOMM - "num_xpstart" - number of servers to start
 | 
						|
XCOMM - "xpstart_fontpath[index]" - custom font path. Leave blank if you want
 | 
						|
XCOMM   the platform-specific default
 | 
						|
XCOMM - "xpstart_fontpath_acceptpattern[index]" - extended regular expression
 | 
						|
XCOMM   (see egrep(1)) used to filter the font path - items only pass this
 | 
						|
XCOMM   filter if they match the pattern (leave blank if you want to filter
 | 
						|
XCOMM   nothing)
 | 
						|
XCOMM - "xpstart_fontpath_rejectpattern[index]" - extended regular expression
 | 
						|
XCOMM   (see egrep(1)) used to filter the font path - items only pass this
 | 
						|
XCOMM   filter if they do not match the pattern (leave blank if you want to
 | 
						|
XCOMM   filter nothing)
 | 
						|
XCOMM - "xpstart_font_encodings_dir[index]" - location of "encodings.dir".
 | 
						|
XCOMM   Leave blank to use the default.
 | 
						|
XCOMM - "xpstart_displayid[index]" - display id to use for the Xprint server
 | 
						|
XCOMM   (leave blank to choose the next available free display id)
 | 
						|
XCOMM - "xpstart_xpconfigdir[index]" - value for custom XPCONFIGDIR (leave blank
 | 
						|
XCOMM   if you don not want that that XPCONFIGDIR is set at Xprt startup)
 | 
						|
XCOMM - "xpstart_xpfile[index]" - value used for Xprt's "-XpFile" option (leave
 | 
						|
XCOMM   blank if you do not want to set this option)
 | 
						|
XCOMM - "xpstart_auditlevel[index]" - set Xserver auditing level (leave blank to
 | 
						|
XCOMM   use no auditing)
 | 
						|
XCOMM - "xpstart_options[index]" - set further Xprt options (leave blank to set
 | 
						|
XCOMM   no further options)
 | 
						|
XCOMM - "xpstart_logger[index]" - utility which gets stderr/stdout messages from
 | 
						|
XCOMM   Xprt and sends them to a logging daemon. Leave blank to use /usr/bin/logger
 | 
						|
XCOMM   to send such messages to the lpr.notice syslog)
 | 
						|
XCOMM - "xpstart_logfile[index]" - log file to append stderr/stdout messages from
 | 
						|
XCOMM   Xprt to. Leave blank to send messages to /dev/null
 | 
						|
XCOMM - "xpstart_xprt_binary[index]" - set custom Xprt binary (leave blank to use
 | 
						|
XCOMM   the platform-specifc default)
 | 
						|
setup_config()
 | 
						|
{
 | 
						|
    num_xpstart=0;
 | 
						|
    
 | 
						|
    if [ "${ETC_INITD_XPRINT_CUSTOM_SETUP_CONFIG}" != "" ] ; then
 | 
						|
        user_cfg="${ETC_INITD_XPRINT_CUSTOM_SETUP_CONFIG}"
 | 
						|
    else
 | 
						|
        user_cfg="${HOME}/.Xprint_per_user_startup"
 | 
						|
    fi
 | 
						|
    
 | 
						|
    # Source per-user ~/.Xprint_per_user_startup file if there is one
 | 
						|
    # (and do not use the script's defaults below)
 | 
						|
    if [ -r "${user_cfg}" ] ; then
 | 
						|
        # Define API version which should be checked by ${HOME}/.Xprint_per_user_startup
 | 
						|
        # ${HOME}/.Xprint_per_user_startup should bail-out if the version differ
 | 
						|
        etc_initd_xprint_api_version=2
 | 
						|
        
 | 
						|
        # Source per-user settings script
 | 
						|
        . "${user_cfg}"
 | 
						|
        
 | 
						|
        # done with setting the config for per-user Xprt instances
 | 
						|
        return 0;
 | 
						|
    else
 | 
						|
        # Use /etc/init.d/xprint's builtin config
 | 
						|
        # Each entry should start with |setup_config_defaults| to pull the
 | 
						|
        # platform defaults and finish with |num_xpstart=$(($num_xpstart + 1))|
 | 
						|
        # to end the entry
 | 
						|
        
 | 
						|
        # Set platform-defaults
 | 
						|
        setup_config_defaults "${num_xpstart}"
 | 
						|
 | 
						|
        ## -- snip --
 | 
						|
 | 
						|
        # Admins can put their stuff "in" here...
 | 
						|
 | 
						|
        ## -- snip --
 | 
						|
 | 
						|
        # Override script's builtin values with those a user may set via the
 | 
						|
        # $ETC_INIITD_XPRINT_* env vars
 | 
						|
        fetch_etc_initd_xprint_envvars "${num_xpstart}"
 | 
						|
 | 
						|
        num_xpstart=$((${num_xpstart} + 1))
 | 
						|
 | 
						|
        return 0;
 | 
						|
    fi
 | 
						|
 | 
						|
    #### Sample 1:
 | 
						|
    # # Start Xprt on a free display ID with custom XPCONFIGDIR and without
 | 
						|
    # # Speedo and TrueType fonts
 | 
						|
    #    xpstart_fontpath_rejectpattern[$num_xpstart]="/Speedo|/TrueType|/TT(/$|$)|/TTF(/$|$)";
 | 
						|
    #               xpstart_xpconfigdir[$num_xpstart]="/home/gisburn/cwork/Xprint/Xprt_config/XpConfig";
 | 
						|
    #                xpstart_auditlevel[$num_xpstart]="4";
 | 
						|
    #                   xpstart_options[$num_xpstart]="-ac -pn";
 | 
						|
    #num_xpstart=$(($num_xpstart + 1))
 | 
						|
 | 
						|
 | 
						|
    #### Sample 2: 
 | 
						|
    # # Start Xprt without TrueType fonts on a display 55 with custom
 | 
						|
    # # XPCONFIGDIR
 | 
						|
    #    xpstart_fontpath_rejectpattern[$num_xpstart]="/TrueType|/TT(/$|$)|/TTF(/$|$)";
 | 
						|
    #                 xpstart_displayid[$num_xpstart]=55;
 | 
						|
    #               xpstart_xpconfigdir[$num_xpstart]="/home/gisburn/cwork/Xprint/Xprt_config/XpConfig";
 | 
						|
    #                xpstart_auditlevel[$num_xpstart]=4;
 | 
						|
    #                   xpstart_options[$num_xpstart]="-ac -pn";
 | 
						|
    #num_xpstart=$(($num_xpstart + 1))
 | 
						|
 | 
						|
    #### Sample 3: 
 | 
						|
    # # Start Xprt without TrueType fonts on a display 56 with custom
 | 
						|
    # # XPCONFIGDIR and alternate "Xprinters" file
 | 
						|
    #    xpstart_fontpath_rejectpattern[$num_xpstart]="/TrueType|/TT(/$|$)|/TTF(/$|$)";
 | 
						|
    #                 xpstart_displayid[$num_xpstart]=56;
 | 
						|
    #               xpstart_xpconfigdir[$num_xpstart]="/etc/XpConfig/default";
 | 
						|
    #                    xpstart_xpfile[$num_xpstart]="/etc/XpConfig/default/Xprinters_test2"
 | 
						|
    #                xpstart_auditlevel[$num_xpstart]="4";
 | 
						|
    #                   xpstart_options[$num_xpstart]="-ac -pn";
 | 
						|
    #               xpstart_xprt_binary[$num_xpstart]="";
 | 
						|
    #num_xpstart=$(($num_xpstart + 1))
 | 
						|
 | 
						|
    #### Sample 4:
 | 
						|
    # # Start Xprt with Solaris ISO-8859-7 (greek(="el") locale) fonts on
 | 
						|
    # # display 57
 | 
						|
    #                  xpstart_fontpath[$num_xpstart]="/usr/openwin/lib/locale/iso_8859_7/X11/fonts/75dpi,/usr/openwin/lib/locale/iso_8859_7/X11/fonts/Type1,/usr/openwin/lib/X11/fonts/misc/";
 | 
						|
    #    xpstart_fontpath_acceptpattern[$num_xpstart]="";
 | 
						|
    #    xpstart_fontpath_rejectpattern[$num_xpstart]="_No_Match_";
 | 
						|
    #                 xpstart_displayid[$num_xpstart]="57";
 | 
						|
    #                xpstart_auditlevel[$num_xpstart]="4";
 | 
						|
    #                   xpstart_options[$num_xpstart]="-ac -pn";
 | 
						|
    #num_xpstart=$(($num_xpstart + 1))
 | 
						|
 | 
						|
    #### Sample 5:
 | 
						|
    # # Start Xprt with the font list of an existing Xserver (excluding Speedo fonts) on
 | 
						|
    # # display 58
 | 
						|
    # # Note that this only works within a X session. At system boot time
 | 
						|
    # # there will be no $DISPLAY to fetch the information from!!
 | 
						|
    #                  xpstart_fontpath[$num_xpstart]="$(get_fontlist_from_display ${DISPLAY} | fontlist2fontpath)";
 | 
						|
    #    xpstart_fontpath_acceptpattern[$num_xpstart]="";
 | 
						|
    #    xpstart_fontpath_rejectpattern[$num_xpstart]="";
 | 
						|
    #                 xpstart_displayid[$num_xpstart]="58";
 | 
						|
    #               xpstart_xpconfigdir[$num_xpstart]="";
 | 
						|
    #                xpstart_auditlevel[$num_xpstart]="4";
 | 
						|
    #                   xpstart_options[$num_xpstart]="-ac -pn";
 | 
						|
    #               xpstart_xprt_binary[$num_xpstart]="";
 | 
						|
    #num_xpstart=$(($num_xpstart + 1))
 | 
						|
 | 
						|
    #### Sample 6:
 | 
						|
    # # List remote Xprt's here 
 | 
						|
    # # (note that there is no test to check whether these DISPLAYs are valid!)
 | 
						|
    #             xpstart_remote_server[$num_xpstart]="sera:12"    ; num_xpstart=$(($num_xpstart + 1))
 | 
						|
    #             xpstart_remote_server[$num_xpstart]="gandalf:19" ; num_xpstart=$(($num_xpstart + 1))   
 | 
						|
}
 | 
						|
 | 
						|
XCOMM###########################################################################
 | 
						|
 | 
						|
XCOMM Main
 | 
						|
case "$1" in
 | 
						|
    ## Start Xprint servers
 | 
						|
    'start')
 | 
						|
        do_start
 | 
						|
        ;;
 | 
						|
 | 
						|
    ## Stop Xprint servers
 | 
						|
    # Note that this does _not_ kill Xprt instances started using this script 
 | 
						|
    # by non-root users
 | 
						|
    'stop')
 | 
						|
        do_stop
 | 
						|
        ;;
 | 
						|
 | 
						|
    ## Restart Xprint servers
 | 
						|
    'restart'|'force-reload')
 | 
						|
        do_restart
 | 
						|
        ;;
 | 
						|
 | 
						|
    ## Reload configuration without stopping and restarting
 | 
						|
    'reload')
 | 
						|
        # not supported
 | 
						|
        msg "reload not supported, use 'restart' or 'force-reload'"
 | 
						|
        exit 3
 | 
						|
        ;;
 | 
						|
 | 
						|
    ## Restart Xprint only if it is already running
 | 
						|
    'condrestart'|'try-restart')
 | 
						|
        # only restart if it is already running
 | 
						|
        [ -f /var/lock/subsys/xprint ] && do_restart || :
 | 
						|
        ;;
 | 
						|
    
 | 
						|
    ## Get list of all Xprint servers for this user
 | 
						|
    # (incl. per-user and system-wide instances)    
 | 
						|
    'get_xpserverlist')
 | 
						|
        do_get_xpserverlist
 | 
						|
        ;;
 | 
						|
 | 
						|
    ## Get status of Xprint servers, RedHat-style
 | 
						|
    'status')
 | 
						|
        x="$(do_get_xpserverlist)"
 | 
						|
        if [ "${x}" != "" ] ; then
 | 
						|
            msg "Xprint (${x}) is running..."
 | 
						|
            exit 0
 | 
						|
        else
 | 
						|
            msg "Xprint is stopped"
 | 
						|
            exit 3
 | 
						|
        fi 
 | 
						|
        ;;
 | 
						|
        
 | 
						|
    ## Wrapper
 | 
						|
    'wrapper')
 | 
						|
        cmd="${2}"
 | 
						|
        [ "${cmd}" = "" ] && fatal_error "No command given."
 | 
						|
        shift ; shift
 | 
						|
        export XPSERVERLIST="$(do_get_xpserverlist)"
 | 
						|
        [ "${XPSERVERLIST}" = "" ] && fatal_error "No Xprint servers found."
 | 
						|
        exec "${cmd}" "$@"
 | 
						|
        ;;
 | 
						|
 | 
						|
    ## Wrapper for "xplsprinters"
 | 
						|
    'lsprinters')
 | 
						|
        [                  "${ETC_INITD_XPRINT_XPLSPRINTERS_PATH}" != "" ] && cmd="${ETC_INITD_XPRINT_XPLSPRINTERS_PATH}"
 | 
						|
        [ "${cmd}" = "" -a "${XPCUSTOMGLUE}" = "GISWxprintglue"          ] && cmd="/opt/GISWxprintglue/bin/xplsprinters"
 | 
						|
        [ "${cmd}" = "" -a "${XPCUSTOMGLUE}" = "GISWxprint"              ] && cmd="/opt/GISWxprint/bin/xplsprinters"
 | 
						|
        [ "${cmd}" = "" -a "${XPROJECTROOT}" != ""                       ] && cmd="${XPROJECTROOT}/bin/xplsprinters"
 | 
						|
        [ "${cmd}" = ""                                                  ] && cmd="xplsprinters"
 | 
						|
 | 
						|
        shift
 | 
						|
        export XPSERVERLIST="$(do_get_xpserverlist)"
 | 
						|
        [ "${XPSERVERLIST}" = "" ] && fatal_error "No Xprint servers found."
 | 
						|
        exec "${cmd}" "$@"
 | 
						|
        ;;
 | 
						|
 | 
						|
    ## Diagnostics
 | 
						|
    'diag')
 | 
						|
        do_diag
 | 
						|
        ;;
 | 
						|
    
 | 
						|
    ## Print usage
 | 
						|
    *)
 | 
						|
        msg "Usage: $0 { start | stop | restart | reload | force-reload | status | condrestart | try-restart | wrapper | lsprinters | get_xpserverlist | diag }"
 | 
						|
        exit 2
 | 
						|
esac
 | 
						|
exit 0
 | 
						|
 | 
						|
XCOMM EOF.
 |