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