271 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			271 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
#!/bin/sh -
 | 
						|
#
 | 
						|
# bashbug - create a bug report and mail it to the bug address
 | 
						|
#
 | 
						|
# The bug address depends on the release status of the shell.  Versions
 | 
						|
# with status `devel', `alpha', `beta', or `rc' mail bug reports to
 | 
						|
# chet@cwru.edu and, optionally, to bash-testers@cwru.edu.
 | 
						|
# Other versions send mail to bug-bash@gnu.org.
 | 
						|
#
 | 
						|
# Copyright (C) 1996-2004 Free Software Foundation, Inc.
 | 
						|
#
 | 
						|
#   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 <http://www.gnu.org/licenses/>.
 | 
						|
 | 
						|
#
 | 
						|
# configuration section:
 | 
						|
#	these variables are filled in by the make target in Makefile
 | 
						|
#
 | 
						|
MACHINE="!MACHINE!"
 | 
						|
OS="!OS!"
 | 
						|
CC="!CC!"
 | 
						|
CFLAGS="!CFLAGS!"
 | 
						|
RELEASE="!RELEASE!"
 | 
						|
PATCHLEVEL="!PATCHLEVEL!"
 | 
						|
RELSTATUS="!RELSTATUS!"
 | 
						|
MACHTYPE="!MACHTYPE!"
 | 
						|
 | 
						|
PATH=/bin:/usr/bin:/usr/local/bin:$PATH
 | 
						|
export PATH
 | 
						|
 | 
						|
# Check if TMPDIR is set, default to /tmp
 | 
						|
: ${TMPDIR:=/tmp}
 | 
						|
 | 
						|
#Securely create a temporary directory for the temporary files
 | 
						|
TEMPDIR=$TMPDIR/bbug.$$
 | 
						|
(umask 077 && mkdir $TEMPDIR) || {
 | 
						|
	echo "$0: could not create temporary directory" >&2
 | 
						|
	exit 1
 | 
						|
}
 | 
						|
 | 
						|
TEMPFILE1=$TEMPDIR/bbug1
 | 
						|
TEMPFILE2=$TEMPDIR/bbug2
 | 
						|
        
 | 
						|
USAGE="Usage: $0 [--help] [--version] [bug-report-email-address]"
 | 
						|
VERSTR="GNU bashbug, version ${RELEASE}.${PATCHLEVEL}-${RELSTATUS}"
 | 
						|
 | 
						|
do_help= do_version=
 | 
						|
 | 
						|
while [ $# -gt 0 ]; do
 | 
						|
	case "$1" in
 | 
						|
	--help)		shift ; do_help=y ;;
 | 
						|
	--version)	shift ; do_version=y ;;
 | 
						|
	--)		shift ; break ;;
 | 
						|
	-*)		echo "bashbug: ${1}: invalid option" >&2
 | 
						|
			echo "$USAGE" >& 2
 | 
						|
			exit 2 ;;
 | 
						|
	*)		break ;;
 | 
						|
	esac
 | 
						|
done
 | 
						|
 | 
						|
if [ -n "$do_version" ]; then
 | 
						|
	echo "${VERSTR}"
 | 
						|
	exit 0
 | 
						|
fi
 | 
						|
 | 
						|
if [ -n "$do_help" ]; then
 | 
						|
	echo "${VERSTR}"
 | 
						|
	echo "${USAGE}"
 | 
						|
	echo
 | 
						|
	cat << HERE_EOF
 | 
						|
Bashbug is used to send mail to the Bash maintainers
 | 
						|
for when Bash doesn't behave like you'd like, or expect.
 | 
						|
 | 
						|
Bashbug will start up your editor (as defined by the shell's
 | 
						|
EDITOR environment variable) with a preformatted bug report
 | 
						|
template for you to fill in. The report will be mailed to the
 | 
						|
bug-bash mailing list by default. See the manual for details.
 | 
						|
 | 
						|
If you invoke bashbug by accident, just quit your editor without
 | 
						|
saving any changes to the template, and no bug report will be sent.
 | 
						|
HERE_EOF
 | 
						|
	exit 0
 | 
						|
fi
 | 
						|
 | 
						|
# Figure out how to echo a string without a trailing newline
 | 
						|
N=`echo 'hi there\c'`
 | 
						|
case "$N" in
 | 
						|
*c)	n=-n c= ;;
 | 
						|
*)	n= c='\c' ;;
 | 
						|
esac
 | 
						|
 | 
						|
BASHTESTERS="bash-testers@cwru.edu"
 | 
						|
 | 
						|
case "$RELSTATUS" in
 | 
						|
alpha*|beta*|devel*|rc*)	BUGBASH=chet@cwru.edu ;;
 | 
						|
*)				BUGBASH=bug-bash@gnu.org ;;
 | 
						|
esac
 | 
						|
 | 
						|
case "$RELSTATUS" in
 | 
						|
alpha*|beta*|devel*|rc*)
 | 
						|
		echo "$0: This is a testing release.  Would you like your bug report"
 | 
						|
		echo "$0: to be sent to the bash-testers mailing list?"
 | 
						|
		echo $n "$0: Send to bash-testers? $c"
 | 
						|
		read ans
 | 
						|
		case "$ans" in
 | 
						|
		y*|Y*)	BUGBASH="${BUGBASH},${BASHTESTERS}" ;;
 | 
						|
		esac ;;
 | 
						|
esac
 | 
						|
 | 
						|
BUGADDR="${1-$BUGBASH}"
 | 
						|
 | 
						|
if [ -z "$DEFEDITOR" ] && [ -z "$EDITOR" ]; then
 | 
						|
	if [ -x /usr/bin/editor ]; then
 | 
						|
		DEFEDITOR=editor
 | 
						|
	elif [ -x /usr/local/bin/ce ]; then
 | 
						|
		DEFEDITOR=ce
 | 
						|
	elif [ -x /usr/local/bin/emacs ]; then
 | 
						|
		DEFEDITOR=emacs
 | 
						|
	elif [ -x /usr/contrib/bin/emacs ]; then
 | 
						|
		DEFEDITOR=emacs
 | 
						|
	elif [ -x /usr/bin/emacs ]; then
 | 
						|
		DEFEDITOR=emacs
 | 
						|
	elif [ -x /usr/bin/xemacs ]; then
 | 
						|
		DEFEDITOR=xemacs
 | 
						|
	elif [ -x /usr/contrib/bin/jove ]; then
 | 
						|
		DEFEDITOR=jove
 | 
						|
	elif [ -x /usr/local/bin/jove ]; then
 | 
						|
		DEFEDITOR=jove
 | 
						|
	elif [ -x /usr/bin/vi ]; then
 | 
						|
		DEFEDITOR=vi
 | 
						|
	else
 | 
						|
		echo "$0: No default editor found: attempting to use vi" >&2
 | 
						|
		DEFEDITOR=vi
 | 
						|
	fi
 | 
						|
fi
 | 
						|
 | 
						|
 | 
						|
: ${EDITOR=$DEFEDITOR}
 | 
						|
 | 
						|
: ${USER=${LOGNAME-`whoami`}}
 | 
						|
 | 
						|
trap 'rm -rf "$TEMPDIR"; exit 1' 1 2 3 13 15
 | 
						|
trap 'rm -rf "$TEMPDIR"' 0
 | 
						|
 | 
						|
UN=
 | 
						|
if (uname) >/dev/null 2>&1; then
 | 
						|
	UN=`uname -a`
 | 
						|
fi
 | 
						|
 | 
						|
if [ -f /usr/lib/sendmail ] ; then
 | 
						|
	RMAIL="/usr/lib/sendmail"
 | 
						|
	SMARGS="-i -t"
 | 
						|
elif [ -f /usr/sbin/sendmail ] ; then
 | 
						|
	RMAIL="/usr/sbin/sendmail"
 | 
						|
	SMARGS="-i -t"
 | 
						|
else
 | 
						|
	RMAIL=rmail
 | 
						|
	SMARGS="$BUGADDR"
 | 
						|
fi
 | 
						|
 | 
						|
INITIAL_SUBJECT='[50 character or so descriptive subject here (for reference)]'
 | 
						|
 | 
						|
cat > "$TEMPFILE1" <<EOF
 | 
						|
From: ${USER}
 | 
						|
To: ${BUGADDR}
 | 
						|
Subject: ${INITIAL_SUBJECT}
 | 
						|
 | 
						|
Configuration Information [Automatically generated, do not change]:
 | 
						|
Machine: $MACHINE
 | 
						|
OS: $OS
 | 
						|
Compiler: $CC
 | 
						|
Compilation CFLAGS: $CFLAGS
 | 
						|
uname output: $UN
 | 
						|
Machine Type: $MACHTYPE
 | 
						|
 | 
						|
Bash Version: $RELEASE
 | 
						|
Patch Level: $PATCHLEVEL
 | 
						|
Release Status: $RELSTATUS
 | 
						|
 | 
						|
Description:
 | 
						|
	[Detailed description of the problem, suggestion, or complaint.]
 | 
						|
 | 
						|
Repeat-By:
 | 
						|
	[Describe the sequence of events that causes the problem
 | 
						|
	to occur.]
 | 
						|
 | 
						|
Fix:
 | 
						|
	[Description of how to fix the problem.  If you don't know a
 | 
						|
	fix for the problem, don't include this section.]
 | 
						|
EOF
 | 
						|
 | 
						|
cp "$TEMPFILE1" "$TEMPFILE2"
 | 
						|
chmod u+w "$TEMPFILE1"
 | 
						|
 | 
						|
trap '' 2		# ignore interrupts while in editor
 | 
						|
 | 
						|
edstat=1
 | 
						|
while [ $edstat -ne 0 ]; do
 | 
						|
	$EDITOR "$TEMPFILE1"
 | 
						|
	edstat=$?
 | 
						|
 | 
						|
	if [ $edstat -ne 0 ]; then
 | 
						|
		echo "$0: editor \`$EDITOR' exited with nonzero status."
 | 
						|
		echo "$0: Perhaps it was interrupted."
 | 
						|
		echo "$0: Type \`y' to give up, and lose your bug report;"
 | 
						|
		echo "$0: type \`n' to re-enter the editor."
 | 
						|
		echo $n "$0: Do you want to give up? $c"
 | 
						|
 | 
						|
		read ans
 | 
						|
		case "$ans" in
 | 
						|
		[Yy]*) exit 1 ;;
 | 
						|
		esac
 | 
						|
 | 
						|
		continue
 | 
						|
	fi
 | 
						|
 | 
						|
	# find the subject from the temp file and see if it's been changed
 | 
						|
	CURR_SUB=`grep '^Subject: ' "$TEMPFILE1" | sed 's|^Subject:[ 	]*||' | sed 1q`
 | 
						|
 | 
						|
	case "$CURR_SUB" in
 | 
						|
	"${INITIAL_SUBJECT}")
 | 
						|
		echo
 | 
						|
		echo "$0: You have not changed the subject from the default."
 | 
						|
		echo "$0: Please use a more descriptive subject header."
 | 
						|
		echo "$0: Type \`y' to give up, and lose your bug report;"
 | 
						|
		echo "$0: type \`n' to re-enter the editor."
 | 
						|
		echo $n "$0: Do you want to give up? $c"
 | 
						|
 | 
						|
		read ans
 | 
						|
		case "$ans" in
 | 
						|
		[Yy]*) exit 1 ;;
 | 
						|
		esac
 | 
						|
 | 
						|
		echo "$0:  The editor will be restarted in five seconds."
 | 
						|
		sleep 5
 | 
						|
		edstat=1
 | 
						|
		;;
 | 
						|
	esac
 | 
						|
 | 
						|
done
 | 
						|
 | 
						|
trap 'rm -rf "$TEMPDIR"; exit 1' 2	# restore trap on SIGINT
 | 
						|
 | 
						|
if cmp -s "$TEMPFILE1" "$TEMPFILE2"
 | 
						|
then
 | 
						|
	echo "File not changed, no bug report submitted."
 | 
						|
	exit
 | 
						|
fi
 | 
						|
 | 
						|
echo $n "Send bug report to ${BUGADDR}? [y/n] $c"
 | 
						|
read ans
 | 
						|
case "$ans" in
 | 
						|
[Nn]*)	exit 0 ;;
 | 
						|
esac
 | 
						|
 | 
						|
${RMAIL} $SMARGS < "$TEMPFILE1" || {
 | 
						|
	cat "$TEMPFILE1" >> $HOME/dead.bashbug
 | 
						|
	echo "$0: mail failed: report saved in $HOME/dead.bashbug" >&2
 | 
						|
}
 | 
						|
 | 
						|
exit 0
 |