]>
Commit | Line | Data |
---|---|---|
d233b485 CR |
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 | |
74091dd4 | 7 | # chet.ramey@case.edu and, optionally, to bash-testers@cwru.edu. |
d233b485 CR |
8 | # Other versions send mail to bug-bash@gnu.org. |
9 | # | |
74091dd4 | 10 | # Copyright (C) 1996-2021 Free Software Foundation, Inc. |
d233b485 CR |
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.$$ | |
8868edaf | 46 | (umask 077 && mkdir "$TEMPDIR") || { |
d233b485 CR |
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 | |
74091dd4 | 105 | alpha*|beta*|devel*|rc*) BUGBASH=chet.ramey@case.edu ;; |
d233b485 CR |
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 | |
74091dd4 CR |
135 | elif [ -x /usr/bin/vim; then |
136 | DEFEDITOR=vim | |
137 | elif [ -x /usr/bin/gvim; then | |
138 | DEFEDITOR=gvim | |
8868edaf CR |
139 | elif [ -x /usr/bin/nano ]; then |
140 | DEFEDITOR=nano | |
d233b485 CR |
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 |