Date: Thu, 7 Aug 1997 11:10:02 -0700 (PDT) From: David Gilbert <dgilbert@jaywon.pci.on.ca> To: freebsd-bugs Subject: Re: bin/4241: Send-pr fails with emacs Message-ID: <199708071810.LAA20763@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/4241; it has been noted by GNATS. From: David Gilbert <dgilbert@jaywon.pci.on.ca> To: Paul Richards <p.richards@elsevier.co.uk> Cc: dgilbert@velocet.ca, FreeBSD-gnats-submit@FreeBSD.ORG Subject: Re: bin/4241: Send-pr fails with emacs Date: Thu, 7 Aug 1997 14:04:52 -0400 (EDT) >>>>> "Paul" == Paul Richards <p.richards@elsevier.co.uk> writes: Paul> "MR. ROOT" <root@strike.pci.on.ca> writes: >> >Description: >> >> send-pr will print 'Aborted' on the terminal after emacs exits if >> the user causes a signal to be sent to emacs. This problem was >> recently solved in NetBSD from my complaint. They said that emacs >> commonly created a signal that was sent to the terminal group which >> caused send-pr to abort. Paul> Do you have the fix, I don't have access to NetBSD. I'm going to look for it now. I can get a copy of send-pr from the dist... but I can't easily isolate the patch... but if you run a diff, it might help. >> >How-To-Repeat: >> >> A normal emacs editing session will normally trigger this, but >> emacs must be used in terminal mode (not X-windows mode). I >> believe that it's some action similar to CTRL-G that does it. Paul> Isn't this what is meant to happen, hitting CTRL-G in Emacs is Paul> supposed to abort the current task isn't it? As I understand from the fix notice that their gnats system sent to me, the problem was that some combination of emacs actions sends some signal (whose default action is to terminate) to all the processes on the current tty group (or whatever that's called). Paul> If you have the fix and I can understand what it fixes I'll Paul> apply it. I'm not sure what the problem is yet. Paul> -- Dr Paul Richards. IT, Product Application Development. Paul> Email: p.richards@elsevier.co.uk Phone: x3155 Here's the source for their send-pr.sh #!/bin/sh # Submit a problem report to a GNATS site. # Copyright (C) 1993 Free Software Foundation, Inc. # Contributed by Brendan Kehoe (brendan@cygnus.com), based on a # version written by Heinz G. Seidl (hgs@cygnus.com). # # This file is part of GNU GNATS. # # GNU GNATS is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # GNU GNATS is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU GNATS; see the file COPYING. If not, write to # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. # The version of this send-pr. VERSION=xVERSIONx # The submitter-id for your site. SUBMITTER=xSUBMITTERx # Where the GNATS directory lives, if at all. [ -z "$GNATS_ROOT" ] && GNATS_ROOT=xGNATS_ROOTx # The default mail address for PR submissions. GNATS_ADDR=xGNATS_ADDRx # Where the gnats category tree lives. DATADIR=xDATADIRx # If we've been moved around, try using GCC_EXEC_PREFIX. [ ! -d $DATADIR/gnats -a -d "$GCC_EXEC_PREFIX" ] && DATADIR=${GCC_EXEC_PREFIX}../../../lib # The default release for this host. DEFAULT_RELEASE="xDEFAULT_RELEASEx" # The default organization. DEFAULT_ORGANIZATION="xDEFAULT_ORGANIZATIONx" # The default site to look for. GNATS_SITE=xGNATS_SITEx # Newer config information? [ -f ${GNATS_ROOT}/gnats-adm/config ] && . ${GNATS_ROOT}/gnats-adm/config # What mailer to use. This must come after the config file, since it is # host-dependent. MAIL_AGENT="xMAIL_AGENTx" # How to read the passwd database. PASSWD="xPASSWDx" ECHON=xECHONx if [ $ECHON = bsd ] ; then ECHON1="echo -n" ECHON2= elif [ $ECHON = sysv ] ; then ECHON1=echo ECHON2='\c' else ECHON1=echo ECHON2= fi # if [ -z "$TMPDIR" ]; then TMPDIR=/tmp else if [ "`echo $TMPDIR | grep '/$'`" != "" ]; then TMPDIR="`echo $TMPDIR | sed -e 's,/$,,'`" fi fi TEMP=$TMPDIR/p$$ BAD=$TMPDIR/pbad$$ REF=$TMPDIR/pf$$ # find a user name if [ "$LOGNAME" = "" ]; then if [ "$USER" != "" ]; then LOGNAME="$USER" else LOGNAME="UNKNOWN" fi fi FROM="$LOGNAME" if [ -z "$REPLYTO" ]; then REPLYTO="$LOGNAME" fi # 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 ORIGINATOR=`$PASSWD | sed -e /"^${LOGNAME}:"/'{s/^[^:]*:[^:]*:[^:]*:[^:]*:\([^,:;]*\).*$/\1/' -e q -e } -e d` case "$ORIGINATOR" in *'&'*) TEMP=`echo $LOGNAME | tr '[a-z]' '[A-Z]'` TEMP=`echo $TEMP $LOGNAME | sed 's/^\(.\)[^ ]* ./\1/'` ORIGINATOR=`echo "$ORIGINATOR" | sed "s/&/$TEMP/"` ;; esac fi if [ -n "$ORGANIZATION" ]; then if [ -f "$ORGANIZATION" ]; then ORGANIZATION="`cat $ORGANIZATION`" fi else if [ -n "$DEFAULT_ORGANIZATION" ]; then ORGANIZATION="$DEFAULT_ORGANIZATION" elif [ -f $HOME/.organization ]; then ORGANIZATION="`cat $HOME/.organization`" elif [ -f $HOME/.signature ]; then ORGANIZATION="`cat $HOME/.signature`" 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` COMMAND=`echo $0 | sed -e 's,.*/,,'` USAGE="Usage: $COMMAND [-PVL] [-t address] [-f filename] [--request-id] [--version]" REMOVE= BATCH= while [ $# -gt 0 ]; do case "$1" in -r) ;; # Ignore for backward compat. -t | --to) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi shift ; GNATS_ADDR="$1" EXPLICIT_GNATS_ADDR=true ;; -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi shift ; IN_FILE="$1" if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then echo "$COMMAND: cannot read $IN_FILE" exit 1 fi ;; -b | --batch) BATCH=true ;; -p | -P | --print) PRINT=true ;; -L | --list) FORMAT=norm ;; -l | -CL | --lisp) FORMAT=lisp ;; --request-id) REQUEST_ID=true ;; -h | --help) echo "$USAGE"; exit 0 ;; -V | --version) echo "$VERSION"; exit 0 ;; -*) echo "$USAGE" ; exit 1 ;; *) if [ -z "$USER_GNATS_SITE" ]; then if [ ! -r "$DATADIR/gnats/$1" ]; then echo "$COMMAND: the GNATS site $1 does not have a categories list." exit 1 else # The site name is the alias they'll have to have created. USER_GNATS_SITE=$1 fi else echo "$USAGE" ; exit 1 fi ;; esac shift done if [ -n "$USER_GNATS_SITE" ] && [ "$USER_GNATS_SITE" != "$GNATS_SITE" ]; then GNATS_SITE=$USER_GNATS_SITE GNATS_ADDR=$USER_GNATS_SITE-gnats fi if [ "$SUBMITTER" = "unknown" -a -z "$REQUEST_ID" -a -z "$IN_FILE" ]; then cat << '__EOF__' It seems that send-pr is not installed with your unique submitter-id. You need to run install-sid YOUR-SID where YOUR-SID is the identification code you received with `send-pr'. `send-pr' will automatically insert this value into the template field `>Submitter-Id'. If you've downloaded `send-pr' from the Net, use `net' for this value. If you do not know your id, run `send-pr --request-id' to get one from your support site. __EOF__ exit 1 fi if [ -r "$DATADIR/gnats/$GNATS_SITE" ]; then CATEGORIES=`grep -v '^#' $DATADIR/gnats/$GNATS_SITE | sort` else echo "$COMMAND: could not read $DATADIR/gnats/$GNATS_SITE for categories list." exit 1 fi if [ -z "$CATEGORIES" ]; then echo "$COMMAND: the categories list for $GNATS_SITE was empty!" exit 1 fi case "$FORMAT" in lisp) echo "$CATEGORIES" | \ awk 'BEGIN {printf "( "} {printf "(\"%s\") ",$0} END {printf ")\n"}' exit 0 ;; norm) l=`echo "$CATEGORIES" | \ awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } } END {print max + 1;}'` c=`expr 70 / $l` if [ $c -eq 0 ]; then c=1; fi echo "$CATEGORIES" | \ awk 'BEGIN {print "Known categories:"; i = 0 } { printf ("%-'$l'.'$l's", $0); if ((++i % '$c') == 0) { print "" } } END { print ""; }' exit 0 ;; esac ORIGINATOR_C='<name of the PR author (one line)>' ORGANIZATION_C='<organization of PR author (multiple lines)>' CONFIDENTIAL_C='<[ yes | no ] (one line)>' SYNOPSIS_C='<synopsis of the problem (one line)>' SEVERITY_C='<[ non-critical | serious | critical ] (one line)>' PRIORITY_C='<[ low | medium | high ] (one line)>' CATEGORY_C='<name of the product (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)>' # Catch some signals. ($xs kludge needed by Sun /bin/sh) xs=0 TRAP_EXIT_ACTION='rm -f $REF $TEMP; exit $xs' TRAP_IGNORE_ACTION='' TRAP_ABORT_ACTION='echo "$COMMAND: Aborting ..."; rm -f $REF $TEMP; xs=1; exit' TRAP_ABORTSAVE_ACTION=' echo "$COMMAND: Aborting ..."; if cmp -s $REF $TEMP ; then rm $REF else echo "$COMMAND: the problem report remains in $BAD and is not sent." mv $REF $BAD fi rm -f $TEMP; xs=1; exit' trap "$TRAP_EXIT_ACTION" 0 trap "$TRAP_ABORT_ACTION" 1 2 3 13 15 # If they told us to use a specific file, then do so. if [ -n "$IN_FILE" ]; then if [ "$IN_FILE" = "-" ]; then # The PR is coming from the standard input. if [ -n "$EXPLICIT_GNATS_ADDR" ]; then sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" > $TEMP else cat > $TEMP fi else # Use the file they named. if [ -n "$EXPLICIT_GNATS_ADDR" ]; then sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" $IN_FILE > $TEMP else cat $IN_FILE > $TEMP fi fi else if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then # If their PR_FORM points to a bogus entry, then bail. if [ ! -f "$PR_FORM" -o ! -r "$PR_FORM" -o ! -s "$PR_FORM" ]; then echo "$COMMAND: can't seem to read your template file (\`$PR_FORM'), ignoring PR_FORM" sleep 1 PRINT_INTERN=bad_prform fi fi if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then cp $PR_FORM $TEMP || ( echo "$COMMAND: could not copy $PR_FORM" ; xs=1; exit ) else for file in $TEMP $REF ; do cat > $file << '__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: SEND-PR: Please consult the send-pr man page `send-pr(1)' or the Texinfo SEND-PR: manual if you are not sure how to fill out a problem report. SEND-PR: SEND-PR: Choose from the following categories: SEND-PR: __EOF__ # Format the categories so they fit onto lines. l=`echo "$CATEGORIES" | \ awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } } END {print max + 1;}'` c=`expr 61 / $l` if [ $c -eq 0 ]; then c=1; fi echo "$CATEGORIES" | \ awk 'BEGIN {printf "SEND-PR: "; i = 0 } { printf ("%-'$l'.'$l's", $0); if ((++i % '$c') == 0) { printf "\nSEND-PR: " } } END { printf "\nSEND-PR:\n"; }' >> $file cat >> $file << __EOF__ To: $GNATS_ADDR Subject: From: $FROM Reply-To: $REPLYTO X-send-pr-version: $VERSION >Submitter-Id: $SUBMITTER >Originator: $ORIGINATOR >Organization: ${ORGANIZATION- $ORGANIZATION_C} >Confidential: $CONFIDENTIAL_C >Synopsis: $SYNOPSIS_C >Severity: $SEVERITY_C >Priority: $PRIORITY_C >Category: $CATEGORY_C >Class: $CLASS_C >Release: ${DEFAULT_RELEASE-$RELEASE_C} >Environment: $ENVIRONMENT_C `[ -n "$SYSTEM" ] && echo System: $SYSTEM` `[ -n "$ARCH" ] && echo Architecture: $ARCH` `[ -n "$MACHINE" ] && echo Machine: $MACHINE` >Description: $DESCRIPTION_C >How-To-Repeat: $HOW_TO_REPEAT_C >Fix: $FIX_C __EOF__ done fi if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then cat $TEMP xs=0; exit fi chmod u+w $TEMP if [ -z "$REQUEST_ID" ]; then trap "$TRAP_IGNORE_ACTION" 2 3 eval $EDIT $TEMP trap "$TRAP_ABORTSAVE_ACTION" 2 3 else ed -s $TEMP << '__EOF__' /^Subject/s/^Subject:.*/Subject: request for a customer id/ /^>Category/s/^>Category:.*/>Category: send-pr/ w q __EOF__ fi if cmp -s $REF $TEMP ; then echo "$COMMAND: problem report not filled out, therefore not sent" xs=1; exit fi 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 [ -z "$REQUEST_ID" ]; do CNT=0 # 1) Confidential # PATTERN=">Confidential:" CONFIDENTIAL=`eval sed -n -e "\"$SED_CMD\"" $TEMP` case "$CONFIDENTIAL" in ""|yes|no) CNT=`expr $CNT + 1` ;; *) echo "$COMMAND: \`$CONFIDENTIAL' is not a valid value for \`Confidential'." ;; esac # # 2) 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 # # 3) 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 # # 4) Category # PATTERN=">Category:" CATEGORY=`eval sed -n -e "\"$SED_CMD\"" $TEMP` FOUND= for C in $CATEGORIES do if [ "$C" = "$CATEGORY" ]; then FOUND=true ; break ; fi done if [ -n "$FOUND" ]; then CNT=`expr $CNT + 1` else if [ -z "$CATEGORY" ]; then echo "$COMMAND: you must include a Category: field in your report." else echo "$COMMAND: \`$CATEGORY' is not a known category." fi fi # # 5) 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 # # 6) Release # PATTERN=">Release:" RELEASE=`eval sed -n -e "\"$SED_CMD\"" $TEMP` if [ -z "$RELEASE" ]; then echo "$COMMAND: you must include a Release: field in your report." else CNT=`expr $CNT + 1` fi [ $CNT -lt 6 -a -z "$BATCH" ] && echo "Errors were found with the problem report." while true; do if [ -z "$BATCH" ]; then $ECHON1 "a)bort, e)dit or s)end? $ECHON2" read input else if [ $CNT -eq 6 ]; then input=s else input=a fi fi case "$input" in a*) if [ -z "$BATCH" ]; then echo "$COMMAND: the problem report remains in $BAD and is not sent." mv $TEMP $BAD else echo "$COMMAND: the problem report is not sent." fi xs=1; exit ;; e*) trap "$TRAP_IGNORE_ACTION" 2 3 eval $EDIT $TEMP trap "$TRAP_ABORTSAVE_ACTION" 2 3 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;<.*>;; /^>Category:/s;$CATEGORY_C;; /^>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 > $REF if $MAIL_AGENT < $REF; then echo "$COMMAND: problem report sent" xs=0; exit else echo "$COMMAND: mysterious mail failure." if [ -z "$BATCH" ]; then echo "$COMMAND: the problem report remains in $BAD and is not sent." mv $REF $BAD else echo "$COMMAND: the problem report is not sent." fi xs=1; exit fi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199708071810.LAA20763>