#!/bin/bash
#
# Run Valgrind, condensing logged reports into an exit code.
#
# Copyright (C) 2014 Red Hat
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
set -o nounset -o pipefail -o errexit
shopt -s extglob
function usage()
{
cat <&2
usage >&2
exit 1
fi
declare error_exitcode="$1"; shift
declare -a path_pattern_list=()
declare arg
declare collecting_argv
declare -a program_argv=()
declare program_path
declare program_name
declare path_pattern
declare match
declare status=0
# Extract path patterns
while [[ $# != 0 ]]; do
arg="$1"
shift
if [[ "$arg" == "--" ]]; then
break
else
path_pattern_list+=("$arg")
fi
done
# Find program argv list in Valgrind arguments
collecting_argv=false
for arg in "$@"; do
if ! "$collecting_argv" && [[ "$arg" == "--" ]]; then
collecting_argv=true
elif "$collecting_argv" || [[ "$arg" != -* ]]; then
collecting_argv=true
program_argv+=("$arg")
fi
done
if [[ ${#program_argv[@]} == 0 ]]; then
echo "Program path not specified." >&2
usage >&2
exit 1
fi
program_path="${program_argv[0]}"
# Match against path patterns, if any
if [[ ${#path_pattern_list[@]} == 0 ]]; then
match=true
else
match=false
for path_pattern in "${path_pattern_list[@]}"; do
if [[ "$program_path" == $path_pattern ]]; then
match=true
fi
done
fi
# Run the program
if $match; then
# Generate original path from libtool path
program_path=`sed -e 's/^\(.*\/\)\?\.libs\/lt-\([^\/]\+\)$/\1\2/' \
<<<"$program_path"`
program_name=`basename -- "$program_path"`
rm -f -- "$program_name".*.valgrind.log
valgrind --log-file="$program_name.%p.valgrind.log" "$@" || status=$?
if grep -q '^==[0-9]\+== *ERROR SUMMARY: *[1-9]' -- \
"$program_name".*.valgrind.log; then
exit "$error_exitcode"
else
exit "$status"
fi
else
"${program_argv[@]}"
fi