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