1#!/bin/sh -
2#
3# bashbug - create a bug report and mail it to the bug address
4#
5# The bug address depends on the release status of the shell.  Versions
6# with status `devel', `alpha', `beta', or `rc' mail bug reports to
7# chet@cwru.edu and, optionally, to bash-testers@cwru.edu.
8# Other versions send mail to bug-bash@gnu.org.
9#
10# Copyright (C) 1996-2004 Free Software Foundation, Inc.
11#
12# This program is free software; you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation; either version 2, or (at your option)
15# any later version.
16#
17# This program is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with this program; if not, write to the Free Software
24# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
25
26#
27# configuration section:
28#	these variables are filled in by the make target in Makefile
29#
30MACHINE="Mac"
31OS="Darwin"
32CC="gcc"
33CFLAGS="Xcode"
34RELEASE="3.2"
35PATCHLEVEL="48"
36RELSTATUS="relase"
37MACHTYPE="x86_64-Apple-Darwin"
38
39PATH=/bin:/usr/bin:/usr/local/bin:$PATH
40export PATH
41
42# Check if TMPDIR is set, default to /tmp
43: ${TMPDIR:=/tmp}
44
45#Securely create a temporary directory for the temporary files
46TEMPDIR=$TMPDIR/bbug.$$
47(umask 077 && mkdir $TEMPDIR) || {
48	echo "$0: could not create temporary directory" >&2
49	exit 1
50}
51
52TEMPFILE1=$TEMPDIR/bbug1
53TEMPFILE2=$TEMPDIR/bbug2
54        
55USAGE="Usage: $0 [--help] [--version] [bug-report-email-address]"
56VERSTR="GNU bashbug, version ${RELEASE}.${PATCHLEVEL}-${RELSTATUS}"
57
58do_help= do_version=
59
60while [ $# -gt 0 ]; do
61	case "$1" in
62	--help)		shift ; do_help=y ;;
63	--version)	shift ; do_version=y ;;
64	--)		shift ; break ;;
65	-*)		echo "bashbug: ${1}: invalid option" >&2
66			echo "$USAGE" >& 2
67			exit 2 ;;
68	*)		break ;;
69	esac
70done
71
72if [ -n "$do_version" ]; then
73	echo "${VERSTR}"
74	exit 0
75fi
76
77if [ -n "$do_help" ]; then
78	echo "${VERSTR}"
79	echo "${USAGE}"
80	echo
81	cat << HERE_EOF
82Bashbug is used to send mail to the Bash maintainers
83for when Bash doesn't behave like you'd like, or expect.
84
85Bashbug will start up your editor (as defined by the shell's
86EDITOR environment variable) with a preformatted bug report
87template for you to fill in. The report will be mailed to the
88bash maintainers by default. See the manual for details.
89
90If you invoke bashbug by accident, just quit your editor without
91saving any changes to the template, and no bug report will be sent.
92HERE_EOF
93	exit 0
94fi
95
96# Figure out how to echo a string without a trailing newline
97N=`echo 'hi there\c'`
98case "$N" in
99*c)	n=-n c= ;;
100*)	n= c='\c' ;;
101esac
102
103BASHTESTERS="bash-testers@cwru.edu"
104
105case "$RELSTATUS" in
106alpha*|beta*|devel*|rc*)	BUGBASH=chet@cwru.edu ;;
107*)				BUGBASH=bug-bash@gnu.org ;;
108esac
109
110case "$RELSTATUS" in
111alpha*|beta*|devel*|rc*)
112		echo "$0: This is a testing release.  Would you like your bug report"
113		echo "$0: to be sent to the bash-testers mailing list?"
114		echo $n "$0: Send to bash-testers? $c"
115		read ans
116		case "$ans" in
117		y*|Y*)	BUGBASH="${BUGBASH},${BASHTESTERS}" ;;
118		esac ;;
119esac
120
121BUGADDR="${1-$BUGBASH}"
122
123if [ -z "$DEFEDITOR" ] && [ -z "$EDITOR" ]; then
124	if [ -x /usr/bin/editor ]; then
125		DEFEDITOR=editor
126	elif [ -x /usr/local/bin/ce ]; then
127		DEFEDITOR=ce
128	elif [ -x /usr/local/bin/emacs ]; then
129		DEFEDITOR=emacs
130	elif [ -x /usr/contrib/bin/emacs ]; then
131		DEFEDITOR=emacs
132	elif [ -x /usr/bin/emacs ]; then
133		DEFEDITOR=emacs
134	elif [ -x /usr/bin/xemacs ]; then
135		DEFEDITOR=xemacs
136	elif [ -x /usr/contrib/bin/jove ]; then
137		DEFEDITOR=jove
138	elif [ -x /usr/local/bin/jove ]; then
139		DEFEDITOR=jove
140	elif [ -x /usr/bin/vi ]; then
141		DEFEDITOR=vi
142	else
143		echo "$0: No default editor found: attempting to use vi" >&2
144		DEFEDITOR=vi
145	fi
146fi
147
148
149: ${EDITOR=$DEFEDITOR}
150
151: ${USER=${LOGNAME-`whoami`}}
152
153trap 'rm -rf "$TEMPDIR"; exit 1' 1 2 3 13 15
154trap 'rm -rf "$TEMPDIR"' 0
155
156UN=
157if (uname) >/dev/null 2>&1; then
158	UN=`uname -a`
159fi
160
161if [ -f /usr/lib/sendmail ] ; then
162	RMAIL="/usr/lib/sendmail"
163	SMARGS="-i -t"
164elif [ -f /usr/sbin/sendmail ] ; then
165	RMAIL="/usr/sbin/sendmail"
166	SMARGS="-i -t"
167else
168	RMAIL=rmail
169	SMARGS="$BUGADDR"
170fi
171
172INITIAL_SUBJECT='[50 character or so descriptive subject here (for reference)]'
173
174cat > "$TEMPFILE1" <<EOF
175From: ${USER}
176To: ${BUGADDR}
177Subject: ${INITIAL_SUBJECT}
178
179Configuration Information [Automatically generated, do not change]:
180Machine: $MACHINE
181OS: $OS
182Compiler: $CC
183Compilation CFLAGS: $CFLAGS
184uname output: $UN
185Machine Type: $MACHTYPE
186
187Bash Version: $RELEASE
188Patch Level: $PATCHLEVEL
189Release Status: $RELSTATUS
190
191Description:
192	[Detailed description of the problem, suggestion, or complaint.]
193
194Repeat-By:
195	[Describe the sequence of events that causes the problem
196	to occur.]
197
198Fix:
199	[Description of how to fix the problem.  If you don't know a
200	fix for the problem, don't include this section.]
201EOF
202
203cp "$TEMPFILE1" "$TEMPFILE2"
204chmod u+w "$TEMPFILE1"
205
206trap '' 2		# ignore interrupts while in editor
207
208edstat=1
209while [ $edstat -ne 0 ]; do
210	$EDITOR "$TEMPFILE1"
211	edstat=$?
212
213	if [ $edstat -ne 0 ]; then
214		echo "$0: editor \`$EDITOR' exited with nonzero status."
215		echo "$0: Perhaps it was interrupted."
216		echo "$0: Type \`y' to give up, and lose your bug report;"
217		echo "$0: type \`n' to re-enter the editor."
218		echo $n "$0: Do you want to give up? $c"
219
220		read ans
221		case "$ans" in
222		[Yy]*) exit 1 ;;
223		esac
224
225		continue
226	fi
227
228	# find the subject from the temp file and see if it's been changed
229	CURR_SUB=`grep '^Subject: ' "$TEMPFILE1" | sed 's|^Subject:[ 	]*||' | sed 1q`
230
231	case "$CURR_SUB" in
232	"${INITIAL_SUBJECT}")
233		echo
234		echo "$0: You have not changed the subject from the default."
235		echo "$0: Please use a more descriptive subject header."
236		echo "$0: Type \`y' to give up, and lose your bug report;"
237		echo "$0: type \`n' to re-enter the editor."
238		echo $n "$0: Do you want to give up? $c"
239
240		read ans
241		case "$ans" in
242		[Yy]*) exit 1 ;;
243		esac
244
245		echo "$0:  The editor will be restarted in five seconds."
246		sleep 5
247		edstat=1
248		;;
249	esac
250
251done
252
253trap 'rm -rf "$TEMPDIR"; exit 1' 2	# restore trap on SIGINT
254
255if cmp -s "$TEMPFILE1" "$TEMPFILE2"
256then
257	echo "File not changed, no bug report submitted."
258	exit
259fi
260
261echo $n "Send bug report? [y/n] $c"
262read ans
263case "$ans" in
264[Nn]*)	exit 0 ;;
265esac
266
267${RMAIL} $SMARGS < "$TEMPFILE1" || {
268	cat "$TEMPFILE1" >> $HOME/dead.bashbug
269	echo "$0: mail failed: report saved in $HOME/dead.bashbug" >&2
270}
271
272exit 0
273