#! /bin/sh # Copyright 2008-2009 litl, LLC. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. SCRIPTNAME=$0 START_SYSTEM_BUS= START_SESSION_BUS= done=0 while [ "$done" != 1 ]; do case $1 in --system ) START_SYSTEM_BUS=1 ;; --session) START_SESSION_BUS=1 ;; * ) WRAPPED_SCRIPT=$1 done=1 ;; esac shift done die() { if ! test -z "$DBUS_SESSION_BUS_PID" ; then echo "killing message bus "$DBUS_SESSION_BUS_PID >&2 kill -9 $DBUS_SESSION_BUS_PID fi if ! test -z "$DBUS_SYSTEM_BUS_PID" ; then echo "killing message bus "$DBUS_SYSTEM_BUS_PID >&2 kill -9 $DBUS_SYSTEM_BUS_PID fi echo $SCRIPTNAME: $* >&2 exit 1 } ## convenient to be able to ctrl+C without leaking the message bus process trap 'die "Received terminal signal"' INT TERM HUP if test -z "$TOP_SRCDIR" ; then die "Must set TOP_SRCDIR" fi if test -z "$BUILDDIR" ; then die "Must set BUILDDIR" fi RANDOM=`dbus-uuidgen` ## this has to be set BEFORE we start session bus, ## or stuff the session bus starts won't get it if ! test -z "$START_SYSTEM_BUS" ; then DBUS_SYSTEM_BUS_ADDRESS="unix:abstract=/tmp/dbus-$USER-$$-$RANDOM-system" export DBUS_SYSTEM_BUS_ADDRESS fi STDERR_LOGFILE="$BUILDDIR"/stderr.log if test x"$XDG_DATA_HOME" != x ; then mkdir -p "$XDG_DATA_HOME"/logs || exit 1 STDERR_LOGFILE="$XDG_DATA_HOME"/logs/stderr.log fi /bin/rm -f "$STDERR_LOGFILE" SYSTEM_MONITOR_LOGFILE=`echo "$STDERR_LOGFILE" | sed -e s/stderr.log/dbus-system.log/g` if ! test -z "$START_SESSION_BUS" ; then CONFIG_FILE="$TOP_SRCDIR"/test/test-bus.conf unset DBUS_SESSION_BUS_ADDRESS unset DBUS_SESSION_BUS_PID echo "Running dbus-launch --config-file=$CONFIG_FILE" >&2 eval `dbus-launch --sh-syntax --config-file=$CONFIG_FILE 2>"$STDERR_LOGFILE"` if test -z "$DBUS_SESSION_BUS_PID" ; then die "Failed to launch message bus for test script to run" fi echo "Started bus pid $DBUS_SESSION_BUS_PID at $DBUS_SESSION_BUS_ADDRESS" >&2 fi if ! test -z "$START_SYSTEM_BUS" ; then SYSTEM_CONFIG_FILE="$TOP_SRCDIR"/test/test-bus.conf echo "Running dbus-daemon --fork --print-pid --config-file=$SYSTEM_CONFIG_FILE" >&2 unset DBUS_SYSTEM_BUS_PID DBUS_SYSTEM_BUS_PID=`dbus-daemon --fork --print-pid --config-file=$SYSTEM_CONFIG_FILE 2>>"$STDERR_LOGFILE"` if test -z "$DBUS_SYSTEM_BUS_PID" ; then die "Failed to launch system bus for test script to run" fi echo "Started bus pid $DBUS_SYSTEM_BUS_PID at $DBUS_SYSTEM_BUS_ADDRESS" >&2 dbus-monitor --system "type='method_call'" "type='signal'" "type='method_return'" "type='error'" > "$SYSTEM_MONITOR_LOGFILE" 2>&1 & fi # Execute wrapped script echo "Running with dbus: $WRAPPED_SCRIPT $@ with stderr to $STDERR_LOGFILE" >&2 $WRAPPED_SCRIPT "$@" 2>>"$STDERR_LOGFILE" || die "script \"$WRAPPED_SCRIPT\" failed" if ! test -z "$DBUS_SESSION_BUS_PID" ; then kill -TERM $DBUS_SESSION_BUS_PID || die "Message bus vanished! should not have happened" && echo "Killed daemon $DBUS_SESSION_BUS_PID" >&2 fi if ! test -z "$DBUS_SYSTEM_BUS_PID" ; then kill -TERM $DBUS_SYSTEM_BUS_PID || die "Message bus vanished! should not have happened" && echo "Killed daemon $DBUS_SYSTEM_BUS_PID" >&2 fi sleep 2 ## be sure it really died if ! test -z "$DBUS_SESSION_BUS_PID" ; then kill -9 $DBUS_SESSION_BUS_PID > /dev/null 2>&1 || true fi if ! test -z "$DBUS_SYSTEM_BUS_PID" ; then kill -9 $DBUS_SYSTEM_BUS_PID > /dev/null 2>&1 || true fi exit 0