#! /bin/sh # # glibcbug - create a bug report and mail it to the bug address. # # configuration section: # these variables are filled in by configure # VERSION="@VERSION@" RELEASE="@RELEASE@" ADDONS="@subdirs@" HOST="@host@" CC='@CC@' CCVERSION='@CCVERSION@' CFLAGS="@CFLAGS@" SYSINCLUDES="@SYSINCLUDES@" VERSIONING="@VERSIONING@" BUILD_STATIC="@static@" BUILD_SHARED="@shared@" BUILD_PIC_DEFAULT="@pic_default@" BUILD_PROFILE="@profile@" BUILD_OMITFP="@omitfp@" BUILD_BOUNDED="@bounded@" BUILD_STATIC_NSS="@static_nss@" TEMP=`mktemp -q ${TMPDIR-/tmp}/glibcbugXXXXXX 2>/dev/null` if test $? -ne 0; then TEMP=${TMPDIR-/tmp}/glibcbug.$$ echo > $TEMP chmod 600 $TEMP fi TEMPx=`mktemp -q ${TMPDIR-/tmp}/glibcbugXXXXXX 2>/dev/null` if test $? -ne 0; then TEMPx=${TMPDIR-/tmp}/glibcbug.$$.x echo > $TEMPx chmod 600 $TEMPx fi BUGGLIBC="glibc-bug-reports-${RELEASE}@gnu.org" BUGADDR=${1-$BUGGLIBC} : ${EDITOR=emacs} : ${USER=${LOGNAME-`whoami`}} trap 'rm -f $TEMP $TEMPx; exit 1' 1 2 3 13 15 trap 'rm -f $TEMP $TEMPx' 0 # How to read the passwd database. PASSWD="cat /etc/passwd" if [ -f /usr/lib/sendmail ] ; then MAIL_AGENT="/usr/lib/sendmail -oi -t" elif [ -f /usr/sbin/sendmail ] ; then MAIL_AGENT="/usr/sbin/sendmail -oi -t" else MAIL_AGENT=rmail fi # Figure out how to echo a string without a trailing newline N=`echo 'hi there\c'` case "$N" in *c) ECHON1='echo -n' ECHON2= ;; *) ECHON1=echo ECHON2='\c' ;; esac # Find out the name of the originator of this PR. if [ -n "$NAME" ]; then ORIGINATOR="$NAME" elif [ -f $HOME/.fullname ]; then ORIGINATOR="`sed -e '1q' $HOME/.fullname`" else # Must use temp file due to incompatibilities in quoting behavior # and to protect shell metacharacters in the expansion of $LOGNAME $PASSWD | grep "^$LOGNAME:" | awk -F: '{print $5}' | sed -e 's/,.*//' > $TEMP ORIGINATOR="`cat $TEMP`" fi if [ -n "$ORGANIZATION" ]; then if [ -f "$ORGANIZATION" ]; then ORGANIZATION="`cat $ORGANIZATION`" fi else if [ -f $HOME/.organization ]; then ORGANIZATION="`cat $HOME/.organization`" elif [ -f $HOME/.signature ]; then ORGANIZATION=`sed -e "s/^/ /" $HOME/.signature; echo ">"` fi fi # If they don't have a preferred editor set, then use if [ -z "$VISUAL" ]; then if [ -z "$EDITOR" ]; then EDIT=vi else EDIT="$EDITOR" fi else EDIT="$VISUAL" fi # Find out some information. SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \ ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""` ARCH=`[ -f /bin/arch ] && /bin/arch` MACHINE=`[ -f /bin/machine ] && /bin/machine` case $HOST in *linux*) KHDRS=`(echo '#include <linux/version.h>' echo '! UTS_RELEASE' ) | $CC $SYSINCLUDES -E - | sed -n '/!/s/[! "]//gp'`;; esac ORGANIZATION_C='<organization of PR author (multiple lines)>' SYNOPSIS_C='<synopsis of the problem (one line)>' SEVERITY_C='<[ non-critical | serious | critical ] (one line)>' PRIORITY_C='<[ low | medium | high ] (one line)>' CLASS_C='<[ sw-bug | doc-bug | change-request | support ] (one line)>' RELEASE_C='<release number or tag (one line)>' ENVIRONMENT_C='<machine, os, target, libraries (multiple lines)>' DESCRIPTION_C='<precise description of the problem (multiple lines)>' HOW_TO_REPEAT_C='<code/input/activities to reproduce the problem (multiple lines)>' FIX_C='<how to correct or work around the problem, if known (multiple lines)>' cat > $TEMP <<EOF SEND-PR: -*- send-pr -*- SEND-PR: Lines starting with \`SEND-PR' will be removed automatically, as SEND-PR: will all comments (text enclosed in \`<' and \`>'). SEND-PR: From: ${USER} To: ${BUGADDR} Subject: [50 character or so descriptive subject here (for reference)] >Submitter-Id: net >Originator: ${ORIGINATOR} >Organization: ${ORGANIZATION- $ORGANIZATION_C} >Confidential: no >Synopsis: $SYNOPSIS_C >Severity: $SEVERITY_C >Priority: $PRIORITY_C >Category: libc >Class: $CLASS_C >Release: libc-${VERSION} >Environment: $ENVIRONMENT_C `[ -n "$HOST" ] && echo Host type: $HOST` `[ -n "$SYSTEM" ] && echo System: $SYSTEM` `[ -n "$ARCH" ] && echo Architecture: $ARCH` `[ -n "$MACHINE" ] && echo Machine: $MACHINE` `[ -n "$ADDONS" ] && echo Addons: $ADDONS` `[ -n "$CFLAGS" ] && echo Build CFLAGS: $CFLAGS` `[ -n "$CC" ] && echo Build CC: $CC` `[ -n "$CCVERSION" ] && echo Compiler version: $CCVERSION` `[ -n "$KHDRS" ] && echo Kernel headers: $KHDRS` `[ -n "$VERSIONING" ] && echo Symbol versioning: $VERSIONING` `[ -n "$BUILD_STATIC" ] && echo Build static: $BUILD_STATIC` `[ -n "$BUILD_SHARED" ] && echo Build shared: $BUILD_SHARED` `[ -n "$BUILD_PIC_DEFAULT" ] && echo Build pic-default: $BUILD_PIC_DEFAULT` `[ -n "$BUILD_PROFILE" ] && echo Build profile: $BUILD_PROFILE` `[ -n "$BUILD_OMITFP" ] && echo Build omitfp: $BUILD_OMITFP` `[ -n "$BUILD_BOUNDED" ] && echo Build bounded: $BUILD_BOUNDED` `[ -n "$BUILD_STATIC_NSS" ] && echo Build static-nss: $BUILD_STATIC_NSS` >Description: $DESCRIPTION_C >How-To-Repeat: $HOW_TO_REPEAT_C >Fix: $FIX_C EOF chmod u+w $TEMP cp $TEMP $TEMPx eval $EDIT $TEMP if cmp -s $TEMP $TEMPx; then echo "File not changed, no bug report submitted." exit 1 fi # # Check the enumeration fields # This is a "sed-subroutine" with one keyword parameter # (with workaround for Sun sed bug) # SED_CMD=' /$PATTERN/{ s||| s|<.*>|| s|^[ ]*|| s|[ ]*$|| p q }' while :; do CNT=0 # # 1) Severity # PATTERN=">Severity:" SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP` case "$SEVERITY" in ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;; *) echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'." esac # # 2) Priority # PATTERN=">Priority:" PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP` case "$PRIORITY" in ""|low|medium|high) CNT=`expr $CNT + 1` ;; *) echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'." esac # # 3) Class # PATTERN=">Class:" CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP` case "$CLASS" in ""|sw-bug|doc-bug|change-request|support) CNT=`expr $CNT + 1` ;; *) echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'." esac [ $CNT -lt 3 ] && echo "Errors were found with the problem report." while :; do $ECHON1 "a)bort, e)dit or s)end? $ECHON2" read input case "$input" in a*) echo "$COMMAND: problem report saved in $HOME/dead.glibcbug." cat $TEMP >> $HOME/dead.glibcbug xs=1; exit ;; e*) eval $EDIT $TEMP continue 2 ;; s*) break 2 ;; esac done done # # Remove comments and send the problem report # (we have to use patterns, where the comment contains regex chars) # # /^>Originator:/s;$ORIGINATOR;; sed -e " /^SEND-PR:/d /^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;; /^>Confidential:/s;<.*>;; /^>Synopsis:/s;$SYNOPSIS_C;; /^>Severity:/s;<.*>;; /^>Priority:/s;<.*>;; /^>Class:/s;<.*>;; /^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;; /^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;; /^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;; /^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;; /^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;; " $TEMP > $TEMPx if $MAIL_AGENT < $TEMPx; then echo "$COMMAND: problem report sent" xs=0; exit else echo "$COMMAND: mysterious mail failure, report not sent." echo "$COMMAND: problem report saved in $HOME/dead.glibcbug." cat $TEMP >> $HOME/dead.glibcbug fi exit 0