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.
 |