#!/bin/sh
### BEGIN INIT INFO
# Provides:          gdm_vnc
# Required-Start:    $gdm
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: initscript for x11vnc on a GDM
# Description:       This script starts x11vnc for the local GDM session.
### END INIT INFO

# Author: Zsolt Mueller <muzso@muzso.hu>

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DESC="VNC server for GDM"
NAME=gdm_vnc
DAEMON=/usr/bin/x11vnc
DAEMON_ARGS="-forever -listen 127.0.0.1"
PIDFILE="/var/run/$NAME.pid"
SCRIPTNAME="/etc/init.d/$NAME"
RUNASUSER=gdmvnc

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r "/etc/default/$NAME" ] && . "/etc/default/$NAME"

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
. /lib/lsb/init-functions

if [ -z "$XAUTHFILE" ]; then
	PGREP=$(which pgrep)
	if [ -x "$PGREP" ]; then
		CMDLINE=$("$PGREP" -fl ' -auth ' | grep '[^a-zA-Z0-9]gdm[^a-zA-Z0-9]')
		if [ -n "$CMDLINE" ]; then
			XAUTHFILE=$(echo "$CMDLINE" | sed 's/.*-auth \+\([^ ]\+\).*/\1/')
		 	XDISPLAY=$(echo "$CMDLINE" | sed 's/.* \(:[0-9]\+\) .*/\1/')
		fi
	fi
fi
[ -f "$XAUTHFILE" ] || unset XAUTHFILE

UGID=$(getent passwd "$RUNASUSER" | cut -f 3,4 -d:)
UHOME=$(getent passwd "$RUNASUSER" | cut -f 6 -d:)
[ -n "$UHOME" ] && TMPXAUTH="$UHOME/$NAME.xauth"

do_start() {
	if [ -z "$XAUTHFILE" ]; then
		log_failure_msg "xauth file of running GDM was not found"
		return 2
	fi
	if [ -z "$XDISPLAY" ]; then
		log_failure_msg "DISPLAY of the running GDM was not found"
		return 2
	fi
	if [ -n "$RUNASUSER" ]; then
		if [ -n "$UGID" ]; then
			if [ ! -d "$UHOME" ]; then
				log_failure_msg "the home directory of user \"$RUNASUSER\" at \"$UHOME\" does not exist"
				return 2
			fi
			if [ -f "$TMPXAUTH" ]; then
				log_failure_msg "the xauth file at \"$TMPXAUTH\" already exists"
				return 2
			fi
			umask 0077
			cp "$XAUTHFILE" "$TMPXAUTH"
			chown $UGID "$TMPXAUTH"
		else
			log_failure_msg "the user \"$RUNASUSER\" was not found"
			return 2
		fi
	else
		TMPXAUTH="$XAUTHFILE"
	fi
	start-stop-daemon --start --quiet --background --make-pidfile --chuid $UGID --pidfile "$PIDFILE" --exec "$DAEMON" --test > /dev/null || return 1
	start-stop-daemon --start --quiet --background --make-pidfile --chuid $UGID --pidfile "$PIDFILE" --exec "$DAEMON" -- -display "$XDISPLAY" -xauth "$TMPXAUTH" $DAEMON_ARGS || return 2
}

do_stop() {
	[ ! -f "$PIDFILE" ] && return 1
	start-stop-daemon --stop --quiet --oknodo --retry=TERM/30/KILL/5 --pidfile "$PIDFILE"
	RETVAL=$?
	[ -f "$TMPXAUTH" ] && rm -f "$TMPXAUTH"
	[ -f "$PIDFILE" ] && rm -f "$PIDFILE"
	return "$RETVAL"
}

case "$1" in
	start)
		[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
		do_start
		case "$?" in
			0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
			*) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
		esac
		;;
	stop)
		[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
		do_stop
		case "$?" in
			0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
			*) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
		esac
		;;
	restart|force-reload)
		log_daemon_msg "Restarting $DESC" "$NAME"
		do_stop
		case "$?" in
			0|1)
				sleep 2
				do_start
				case "$?" in
					0) log_end_msg 0 ;;
					1) log_end_msg 1 ;;
					*) log_end_msg 1 ;;
				esac
				;;
			*)
				log_end_msg 1
				;;
		esac
		;;
	status)
		pidofproc -p "$PIDFILE" "$DAEMON" > /dev/null
		status=$?
		if [ $status -eq 0 ]; then
			log_success_msg "$DESC is running."
		else
			log_failure_msg "$DESC is not running."
		fi
		exit $status
		;;
	*)
		echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2
		exit 3
		;;
esac


