home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / bin / glibcbug < prev    next >
Text File  |  1999-02-20  |  7KB  |  270 lines

  1. #! /bin/sh
  2. #
  3. # glibcbug - create a bug report and mail it to the bug address.
  4. #
  5. # configuration section:
  6. #       these variables are filled in by configure
  7. #
  8. VERSION="2.0.7"
  9. BUGGLIBC="bugs@gnu.org"
  10. ADDONS="crypt linuxthreads localedata"
  11. HOST="i386-pc-linux-gnu"
  12. CC='gcc -B$(common-objpfx)'
  13. CFLAGS="-O2"
  14. BUILD_SHARED="yes"
  15. BUILD_PROFILE="yes"
  16. BUILD_OMITFP="no"
  17. STDIO="libio"
  18.  
  19. PATH=/bin:/usr/bin:/usr/local/bin:$PATH
  20. export PATH
  21.  
  22. TEMP=`mktemp -q /tmp/glibcbugXXXXXX 2>/dev/null`
  23. if test $? -ne 0; then
  24.   TEMP=/tmp/glibcbug.$$
  25.   echo > $TEMP
  26.   chmod 600 $TEMP
  27. fi
  28. TEMPx=`mktemp -q /tmp/glibcbugXXXXXX 2>/dev/null`
  29. if test $? -ne 0; then
  30.   TEMPx=/tmp/glibcbug.$$.x
  31.   echo > $TEMPx
  32.   chmod 600 $TEMPx
  33. fi
  34.  
  35. BUGADDR=${1-$BUGGLIBC}
  36. ENVIRONMENT=`uname -a`
  37.  
  38. : ${EDITOR=emacs}
  39.  
  40. : ${USER=${LOGNAME-`whoami`}}
  41.  
  42. trap 'rm -f $TEMP $TEMPx; exit 1' 1 2 3 13 15
  43. trap 'rm -f $TEMP $TEMPx' 0
  44.  
  45.  
  46. # How to read the passwd database.
  47. PASSWD="cat /etc/passwd"
  48.  
  49. if [ -f /usr/lib/sendmail ] ; then
  50.         MAIL_AGENT="/usr/lib/sendmail -oi -t"
  51. elif [ -f /usr/sbin/sendmail ] ; then
  52.         MAIL_AGENT="/usr/sbin/sendmail -oi -t"
  53. else
  54.         MAIL_AGENT=rmail
  55. fi
  56.  
  57. # Figure out how to echo a string without a trailing newline
  58. N=`echo 'hi there\c'`
  59. case "$N" in
  60. *c)    ECHON1='echo -n' ECHON2= ;;
  61. *)    ECHON1=echo ECHON2='\c' ;;
  62. esac
  63.  
  64. # Find out the name of the originator of this PR.
  65. if [ -n "$NAME" ]; then
  66.   ORIGINATOR="$NAME"
  67. elif [ -f $HOME/.fullname ]; then
  68.   ORIGINATOR="`sed -e '1q' $HOME/.fullname`"
  69. else
  70.   # Must use temp file due to incompatibilities in quoting behavior
  71.   # and to protect shell metacharacters in the expansion of $LOGNAME
  72.   $PASSWD | grep "^$LOGNAME:" | awk -F: '{print $5}' | sed -e 's/,.*//' > $TEMP
  73.   ORIGINATOR="`cat $TEMP`"
  74.   rm -f $TEMP
  75. fi
  76.  
  77. if [ -n "$ORGANIZATION" ]; then
  78.   if [ -f "$ORGANIZATION" ]; then
  79.     ORGANIZATION="`cat $ORGANIZATION`"
  80.   fi
  81. else
  82.   if [ -f $HOME/.organization ]; then
  83.     ORGANIZATION="`cat $HOME/.organization`"
  84.   elif [ -f $HOME/.signature ]; then
  85.     ORGANIZATION=`sed -e "s/^/  /" $HOME/.signature; echo ">"`
  86.   fi
  87. fi
  88.  
  89. # If they don't have a preferred editor set, then use
  90. if [ -z "$VISUAL" ]; then
  91.   if [ -z "$EDITOR" ]; then
  92.     EDIT=vi
  93.   else
  94.     EDIT="$EDITOR"
  95.   fi
  96. else
  97.   EDIT="$VISUAL"
  98. fi
  99.  
  100. # Find out some information.
  101. SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \
  102.         ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""`
  103. ARCH=`[ -f /bin/arch ] && /bin/arch`
  104. MACHINE=`[ -f /bin/machine ] && /bin/machine`
  105.  
  106. ORGANIZATION_C='<organization of PR author (multiple lines)>'
  107. SYNOPSIS_C='<synopsis of the problem (one line)>'
  108. SEVERITY_C='<[ non-critical | serious | critical ] (one line)>'
  109. PRIORITY_C='<[ low | medium | high ] (one line)>'
  110. CLASS_C='<[ sw-bug | doc-bug | change-request | support ] (one line)>'
  111. RELEASE_C='<release number or tag (one line)>'
  112. ENVIRONMENT_C='<machine, os, target, libraries (multiple lines)>'
  113. DESCRIPTION_C='<precise description of the problem (multiple lines)>'
  114. HOW_TO_REPEAT_C='<code/input/activities to reproduce the problem (multiple lines)>'
  115. FIX_C='<how to correct or work around the problem, if known (multiple lines)>'
  116.  
  117.  
  118. cat > $TEMP <<EOF
  119. SEND-PR: -*- send-pr -*-
  120. SEND-PR: Lines starting with \`SEND-PR' will be removed automatically, as
  121. SEND-PR: will all comments (text enclosed in \`<' and \`>').
  122. SEND-PR:
  123. From: ${USER}
  124. To: ${BUGADDR}
  125. Subject: [50 character or so descriptive subject here (for reference)]
  126.  
  127. >Submitter-Id:    net
  128. >Originator:    ${ORIGINATOR}
  129. >Organization:
  130. ${ORGANIZATION- $ORGANIZATION_C}
  131. >Confidential:    no
  132. >Synopsis:    $SYNOPSIS_C
  133. >Severity:    $SEVERITY_C
  134. >Priority:    $PRIORITY_C
  135. >Category:    libc
  136. >Class:        $CLASS_C
  137. >Release:    libc-${VERSION}
  138. >Environment:
  139.     $ENVIRONMENT_C
  140. `[ -n "$HOST" ] && echo Host type: $HOST`
  141. `[ -n "$SYSTEM" ] && echo System: $SYSTEM`
  142. `[ -n "$ARCH" ] && echo Architecture: $ARCH`
  143. `[ -n "$MACHINE" ] && echo Machine: $MACHINE`
  144. `[ -n "$ADDONS" ] && echo Addons: $ADDONS`
  145. `[ -n "$CFLAGS" ] && echo Build CFLAGS: $CFLAGS`
  146. `[ -n "$CC" ] && echo Build CC: $CC`
  147. `[ -n "$BUILD_SHARED" ] && echo Build shared: $BUILD_SHARED`
  148. `[ -n "$BUILD_PROFILE" ] && echo Build profile: $BUILD_PROFILE`
  149. `[ -n "$BUILD_OMITFP" ] && echo Build omitfp: $BUILD_OMITFP`
  150. `[ -n "$STDIO" ] && echo Stdio: $STDIO`
  151.  
  152. >Description:
  153.     $DESCRIPTION_C
  154. >How-To-Repeat:
  155.     $HOW_TO_REPEAT_C
  156. >Fix:
  157.     $FIX_C
  158. EOF
  159.  
  160. chmod u+w $TEMP
  161. cp $TEMP $TEMPx
  162.  
  163. eval $EDIT $TEMP
  164.  
  165. if cmp -s $TEMP $TEMPx; then
  166.     echo "File not changed, no bug report submitted."
  167.     exit 1
  168. fi
  169.  
  170. #
  171. #       Check the enumeration fields
  172.  
  173. # This is a "sed-subroutine" with one keyword parameter
  174. # (with workaround for Sun sed bug)
  175. #
  176. SED_CMD='
  177. /$PATTERN/{
  178. s|||
  179. s|<.*>||
  180. s|^[     ]*||
  181. s|[     ]*$||
  182. p
  183. q
  184. }'
  185.  
  186.  
  187. while :; do
  188.   CNT=0
  189.  
  190.   #
  191.   # 1) Severity
  192.   #
  193.   PATTERN=">Severity:"
  194.   SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
  195.   case "$SEVERITY" in
  196.     ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;;
  197.     *)  echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'."
  198.   esac
  199.   #
  200.   # 2) Priority
  201.   #
  202.   PATTERN=">Priority:"
  203.   PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
  204.   case "$PRIORITY" in
  205.     ""|low|medium|high) CNT=`expr $CNT + 1` ;;
  206.     *)  echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'."
  207.   esac
  208.   #
  209.   # 3) Class
  210.   #
  211.   PATTERN=">Class:"
  212.   CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
  213.   case "$CLASS" in
  214.     ""|sw-bug|doc-bug|change-request|support) CNT=`expr $CNT + 1` ;;
  215.     *)  echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'."
  216.   esac
  217.  
  218.   [ $CNT -lt 3 ] &&
  219.     echo "Errors were found with the problem report."
  220.  
  221.   while :; do
  222.     $ECHON1 "a)bort, e)dit or s)end? $ECHON2"
  223.     read input
  224.     case "$input" in
  225.       a*)
  226.     echo "$COMMAND: problem report saved in $HOME/dead.glibcbug."
  227.     cat $TEMP >> $HOME/dead.glibcbug
  228.         xs=1; exit
  229.         ;;
  230.       e*)
  231.         eval $EDIT $TEMP
  232.         continue 2
  233.         ;;
  234.       s*)
  235.         break 2
  236.         ;;
  237.     esac
  238.   done
  239. done
  240. #
  241. #       Remove comments and send the problem report
  242. #       (we have to use patterns, where the comment contains regex chars)
  243. #
  244. # /^>Originator:/s;$ORIGINATOR;;
  245. sed  -e "
  246. /^SEND-PR:/d
  247. /^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;;
  248. /^>Confidential:/s;<.*>;;
  249. /^>Synopsis:/s;$SYNOPSIS_C;;
  250. /^>Severity:/s;<.*>;;
  251. /^>Priority:/s;<.*>;;
  252. /^>Class:/s;<.*>;;
  253. /^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;;
  254. /^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;;
  255. /^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;;
  256. /^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;;
  257. /^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
  258. " $TEMP > $TEMPx
  259.  
  260. if $MAIL_AGENT < $TEMPx; then
  261.   echo "$COMMAND: problem report sent"
  262.   xs=0; exit
  263. else
  264.   echo "$COMMAND: mysterious mail failure, report not sent."
  265.   echo "$COMMAND: problem report saved in $HOME/dead.glibcbug."
  266.   cat $TEMP >> $HOME/dead.glibcbug
  267. fi
  268.  
  269. exit 0
  270.