glibc/glibcbug.in

284 lines
7.2 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#! /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