From 9b6021c69f50c1c7ccdceda9cd3dad3f6f291948 Mon Sep 17 00:00:00 2001 From: jtc Date: Fri, 19 Nov 1993 19:22:26 +0000 Subject: [PATCH] Send-pr, so people can send us bug reports. --- gnu/usr.bin/send-pr/COPYING | 339 +++++++++++++ gnu/usr.bin/send-pr/Makefile | 42 ++ gnu/usr.bin/send-pr/categories | 4 + gnu/usr.bin/send-pr/install-sid.sh | 82 ++++ gnu/usr.bin/send-pr/send-pr-el.in | 739 +++++++++++++++++++++++++++++ gnu/usr.bin/send-pr/send-pr.man | 312 ++++++++++++ gnu/usr.bin/send-pr/send-pr.sh | 510 ++++++++++++++++++++ 7 files changed, 2028 insertions(+) create mode 100644 gnu/usr.bin/send-pr/COPYING create mode 100644 gnu/usr.bin/send-pr/Makefile create mode 100644 gnu/usr.bin/send-pr/categories create mode 100644 gnu/usr.bin/send-pr/install-sid.sh create mode 100644 gnu/usr.bin/send-pr/send-pr-el.in create mode 100644 gnu/usr.bin/send-pr/send-pr.man create mode 100644 gnu/usr.bin/send-pr/send-pr.sh diff --git a/gnu/usr.bin/send-pr/COPYING b/gnu/usr.bin/send-pr/COPYING new file mode 100644 index 000000000000..515b6d333429 --- /dev/null +++ b/gnu/usr.bin/send-pr/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +he GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program 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 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/gnu/usr.bin/send-pr/Makefile b/gnu/usr.bin/send-pr/Makefile new file mode 100644 index 000000000000..1eda304ab531 --- /dev/null +++ b/gnu/usr.bin/send-pr/Makefile @@ -0,0 +1,42 @@ +# +# Makefile for building a standalone send-pr. +# + +VERSION=3.01.6 +RELEASE=NetBSD-current +GNATS_HOST=sun-lamp + +BINDIR= /usr/bin +LIBDIR= /usr/lib + +NOPROG= +MAN1= send-pr.0 + +CLEANFILES= send-pr install-sid + +all: send-pr install-sid send-pr.1 + +send-pr: send-pr.sh + sed -e 's/@VERSION@/$(VERSION)/g' \ + -e 's/@DEFAULT_RELEASE@/$(RELEASE)/g' \ + ${.CURDIR}/send-pr.sh > send-pr + +send-pr.1: send-pr.man + sed -e 's/@VERSION@/$((VERSION)/g' \ + ${.CURDIR}/send-pr.man > send-pr.1 + +install-sid: install-sid.sh + sed -e 's/@VERSION@/$(VERSION)/g' \ + ${.CURDIR}/install-sid.sh > install-sid + +beforeinstall: + install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} send-pr \ + ${DESTDIR}${BINDIR} + install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} install-sid \ + ${DESTDIR}${BINDIR} + + install -d -o root -g wheel -m 755 ${DESTDIR}${LIBDIR}/gnats + install -o ${BINOWN} -g ${BINGRP} -m 444 categories \ + ${DESTDIR}${LIBDIR}/gnats/${GNATS_HOST} + +.include diff --git a/gnu/usr.bin/send-pr/categories b/gnu/usr.bin/send-pr/categories new file mode 100644 index 000000000000..696368b74725 --- /dev/null +++ b/gnu/usr.bin/send-pr/categories @@ -0,0 +1,4 @@ +kern +lib +bin +misc diff --git a/gnu/usr.bin/send-pr/install-sid.sh b/gnu/usr.bin/send-pr/install-sid.sh new file mode 100644 index 000000000000..cff74353fb62 --- /dev/null +++ b/gnu/usr.bin/send-pr/install-sid.sh @@ -0,0 +1,82 @@ +#!/bin/sh +# Drop in the SUBMITTER id into a site's installed send-pr script. +# Copyright (C) 1993 Free Software Foundation, Inc. +# Contributed by Brendan Kehoe (brendan@cygnus.com), based on a +# version written by Heinz G. Seidl (hgs@ide.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. + +COMMAND=`echo $0 | sed -e 's,.*/,,g'` +USAGE="Usage: $COMMAND [--install-dir=prefix] [--help] [--version] submitter-id" + +VERSION=3.01.6 + +BINDIR=/usr/bin + +SUBMITTER= +TEMP=/tmp/sp$$ + +if [ $# -eq 0 ]; then + echo "$USAGE" + exit 1 +fi + +while [ $# -gt 0 ]; do + case "$1" in + -install-dir=*|--install-dir=*|--install-di=*|--install-d=*|--install-=*|--install=*|--instal=*|--insta=*|--inst=*|--ins=*|--in=*|--i=*) + I=`echo "$1" | sed 's/-*i[a-z\-]*=//'` + BINDIR=$I/bin ;; + --version) echo $COMMAND version $VERSION ; exit 1 ;; + -*) echo "$USAGE" ; exit 1 ;; + *) SUBMITTER=$1 ;; + esac + shift +done + +path=`echo $0 | sed -e "s;${COMMAND};;"` + +[ -z "$path" ] && path=. + +if [ -f $BINDIR/send-pr ]; then + SPPATH=$BINDIR/send-pr +elif [ -f $path/send-pr ]; then + SPPATH=$path/send-pr +else + echo "$COMMAND: cannot find \`$BINDIR/send-pr' or \`$path/send-pr'" >&2 + exit 1 +fi + +trap 'rm -f $TEMP ; exit 0' 0 +trap 'echo "$COM: Aborting ..."; rm -f $TEMP ; exit 1' 1 2 3 13 15 + +sed -e "s/^SUBMITTER=.*/SUBMITTER=${SUBMITTER}/" $SPPATH > $TEMP + +if grep $SUBMITTER $TEMP > /dev/null; then + cp $SPPATH $SPPATH.orig && + rm -f $SPPATH && + cp $TEMP $SPPATH && + chmod a+rx $SPPATH && + rm -f $TEMP $SPPATH.orig || + { echo "$COMMAND: unable to replace send-pr" >&2 ; exit 1; } +else + echo "$COMMAND: something went wrong when sed-ing the submitter into send-pr" >&2 + exit 1 +fi + +echo "$COMMAND: \`$SUBMITTER' is now the default submitter ID for send-pr" + +exit 0 diff --git a/gnu/usr.bin/send-pr/send-pr-el.in b/gnu/usr.bin/send-pr/send-pr-el.in new file mode 100644 index 000000000000..add07bfa9839 --- /dev/null +++ b/gnu/usr.bin/send-pr/send-pr-el.in @@ -0,0 +1,739 @@ +;;;; -*-emacs-lisp-*- +;;;;--------------------------------------------------------------------------- +;;;; EMACS interface for send-pr (by Heinz G. Seidl, hgs@cygnus.com) +;;;; Slightly hacked by Brendan Kehoe (brendan@cygnus.com). +;;;; +;;;; This file is part of the Problem Report Management System (GNATS) +;;;; Copyright 1992, 1993 Cygnus Support +;;;; +;;;; This program 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 of the License, or (at your option) any later version. +;;;; +;;;; This program 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 Library General Public +;;;; License along with this program; if not, write to the Free +;;;; Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +;;;; +;;;;--------------------------------------------------------------------------- +;;;; +;;;; This file contains the EMACS interface to the Problem Report Management +;;;; System (GNATS): +;;;; +;;;; - The `send-pr' command and the `send-pr-mode' for sending +;;;; Problem Reports (PRs). +;;;; +;;;; For more information about how to send a PR see send-pr(1). +;;;; +;;;;--------------------------------------------------------------------------- +;;;; +;;;; Configuration: the symbol `DEFAULT-RELEASE' can be replaced by +;;;; site/release specific strings during the configuration/installation +;;;; process. +;;;; +;;;; Install this file in your EMACS library directory. +;;;; +;;;;--------------------------------------------------------------------------- + +(provide 'send-pr) + +;;;;--------------------------------------------------------------------------- +;;;; Customization: put the following forms into your default.el file +;;;; (or into your .emacs) +;;;;--------------------------------------------------------------------------- + +;(autoload 'send-pr-mode "send-pr" +; "Major mode for sending problem reports." t) + +;(autoload 'send-pr "send-pr" +; "Command to create and send a problem report." t) + +;;;;--------------------------------------------------------------------------- +;;;; End of Customization Section +;;;;--------------------------------------------------------------------------- + +(autoload 'server-buffer-done "server") +(defvar server-buffer-clients nil) +(defvar mail-self-blind nil) +(defvar mail-default-reply-to nil) + +(defconst send-pr::version "3.01.6") + +(defvar gnats:root "/b/gnats" + "*The top of the tree containing the GNATS database.") + +;;;;--------------------------------------------------------------------------- +;;;; hooks +;;;;--------------------------------------------------------------------------- + +(defvar text-mode-hook nil) ; we define it here in case it's not defined +(defvar send-pr-mode-hook text-mode-hook "Called when send-pr is invoked.") + +;;;;--------------------------------------------------------------------------- +;;;; Domains and default values for (some of) the Problem Report fields; +;;;; constants and definitions. +;;;;--------------------------------------------------------------------------- + +(defconst gnats::emacs-19p (not (string-lessp emacs-version "19")) + "Is this emacs v19?") + +;;; These may be changed during configuration/installation or by the individual +;;; user in his/her .emacs file. +;;; +(defun gnats::get-config (var) + (let ((shell-file-name "/bin/sh") + (buf (generate-new-buffer " *GNATS config*")) + ret) + (save-excursion + (set-buffer buf) + (shell-command (concat ". " gnats:root "/gnats-adm/config; echo $" var ) + t) + (if (looking-at "/bin/sh:\\|\n") + (setq ret nil) + (setq ret (buffer-substring (point-min) (- (point-max) 1))))) + (kill-buffer buf) + ret)) + +;; const because it must match the script's value +(defconst send-pr:datadir (or (gnats::get-config "DATADIR") "/usr/local/lib") + "*Where the `gnats' subdirectory containing category lists lives.") + +(defvar send-pr::sites nil + "List of GNATS support sites; computed at runtime.") +(defvar send-pr:default-site + (or (gnats::get-config "GNATS_SITE") "sun-lamp") + "Default site to send bugs to.") +(defvar send-pr:::site send-pr:default-site + "The site to which a problem report is currently being submitted, or NIL +if using the default site (buffer local).") + +(defvar send-pr:::categories nil + "Buffer local list of available categories, derived at runtime from +send-pr:::site and send-pr::category-alist.") +(defvar send-pr::category-alist nil + "Alist of GNATS support sites and the categories supported at each; computed +at runtime.") + +;;; Ideally we would get all the following values from a central database +;;; during runtime instead of having them here in the code. +;;; +(defconst send-pr::fields + (` (("Category" send-pr::set-categories + (, (or (gnats::get-config "DEFAULT_CATEGORY") nil)) enum) + ("Class" (("sw-bug") ("doc-bug") ("change-request") ("support")) + (, (or (gnats::get-config "DEFAULT_CONFIDENTIAL") 0)) enum) + ("Confidential" (("yes") ("no")) + (, (or (gnats::get-config "DEFAULT_CONFIDENTIAL") 1)) enum) + ("Severity" (("non-critical") ("serious") ("critical")) + (, (or (gnats::get-config "DEFAULT_SEVERITY") 1)) enum) + ("Priority" (("low") ("medium") ("high")) + (, (or (gnats::get-config "DEFAULT_PRIORITY") 1)) enum) + ("Release" nil + (, (or (gnats::get-config "DEFAULT_RELEASE") "@DEFAULT_RELEASE@")) + text) + ("Submitter-Id" nil + (, (or (gnats::get-config "DEFAULT_SUBMITTER") "@DEFAULT_SUBMITTER@")) + text) + ("Synopsis" nil nil text + (lambda (a b c) (gnats::set-mail-field "Subject" c))))) + "AList, keyed on the name of the field, of: +1) The field name. +2) The list of completions. This can be a list, a function to call, or nil. +3) The default value. +4) The type of the field. +5) A sub-function to call when changed.") + +(defvar gnats::fields nil) + +(defmacro gnats::push (i l) + (` (setq (, l) (cons (,@ (list i l)))))) + +(defun send-pr::set-categories (&optional arg) + "Get the list of categories for the current site out of +send-pr::category-alist if there or from send-pr if not. With arg, force +update." + ;; + (let ((entry (assoc send-pr:::site send-pr::category-alist))) + (or (and entry (null arg)) + (let ((oldpr (getenv "GNATS_ROOT")) cats) + (send-pr::set-sites arg) + (setenv "GNATS_ROOT" gnats:root) + (setq cats (gnats::get-value-from-shell + "send-pr" "-CL" send-pr:::site)) + (setenv "GNATS_ROOT" oldpr) + (if entry (setcdr entry cats) + (setq entry (cons send-pr:::site cats)) + (gnats::push entry send-pr::category-alist)))) + (setq send-pr:::categories (cdr entry)))) + +(defun send-pr::set-sites (&optional arg) + "Get the list of sites (by listing the contents of DATADIR/gnats) and assign +it to send-pr::sites. With arg, force update." + (or (and (null arg) send-pr::sites) + (progn + (setq send-pr::sites nil) + (mapcar + (function + (lambda (file) + (or (memq t (mapcar (function (lambda (x) (string= x file))) + '("." ".." "pr-edit" "pr-addr"))) + (not (file-readable-p file)) + (gnats::push (list (file-name-nondirectory file)) + send-pr::sites)))) + (directory-files (format "%s/gnats" send-pr:datadir) t)) + (setq send-pr::sites (reverse send-pr::sites))))) + +(defconst send-pr::pr-buffer-name "*send-pr*" + "Name of the temporary buffer, where the problem report gets composed.") + +(defconst send-pr::err-buffer-name "*send-pr-error*" + "Name of the temporary buffer, where send-pr error messages appear.") + +(defvar send-pr:::err-buffer nil + "The error buffer used by the current PR buffer.") + +(defconst gnats::indent 17 "Indent for formatting the value.") + +;;;;--------------------------------------------------------------------------- +;;;; `send-pr' - command for creating and sending of problem reports +;;;;--------------------------------------------------------------------------- + +(fset 'send-pr 'send-pr:send-pr) +(defun send-pr:send-pr (&optional site) + "Create a buffer and read in the result of `send-pr -P'. +When finished with editing the problem report use \\[send-pr:submit-pr] +to send the PR with `send-pr -b -f -'." + ;; + (interactive + (if current-prefix-arg + (list (completing-read "Site: " (send-pr::set-sites 'recheck) nil t + send-pr:default-site)))) + (or site (setq site send-pr:default-site)) + (let ((buf (get-buffer send-pr::pr-buffer-name))) + (if (or (not buf) + (and (switch-to-buffer buf) + (or (not (buffer-modified-p buf)) + (y-or-n-p "Erase previous problem report? ")) + (or (erase-buffer) t))) + (send-pr::start-up site)))) + +(defun send-pr::start-up (site) + (switch-to-buffer (get-buffer-create send-pr::pr-buffer-name)) + (setq default-directory (expand-file-name "~/")) + (auto-save-mode auto-save-default) + (let ((oldpr (getenv "GNATS_ROOT")) + (case-fold-search nil)) + (setenv "GNATS_ROOT" gnats:root) + (shell-command (concat "send-pr -P " site) t) + (setenv "GNATS_ROOT" oldpr) + (if (looking-at "send-pr:") + (cond ((looking-at "send-pr: .* does not have a categories list") + (setq send-pr::sites nil) + (error "send-pr: the GNATS site %s does not have a categories list" site)) + (t (error (buffer-substring (point-min) (point-max))))) + (save-excursion + ;; Clear cruft inserted by bdamaged .cshrcs + (re-search-forward "^SEND-PR:") + (delete-region 1 (match-beginning 0))))) + (set-buffer-modified-p nil) + (send-pr:send-pr-mode) + (setq send-pr:::site site) + (send-pr::set-categories) + (if (null send-pr:::categories) + (progn + (and send-pr:::err-buffer (kill-buffer send-pr:::err-buffer)) + (kill-buffer nil) + (message "send-pr: no categories found")) + (and mail-default-reply-to + (gnats::set-mail-field "Reply-To" mail-default-reply-to)) + (and mail-self-blind + (gnats::set-mail-field "BCC" (user-login-name))) + (mapcar 'send-pr::maybe-change-field send-pr::fields) + (gnats::position-on-field "Description") + (message (substitute-command-keys + "To send the problem report use: \\[send-pr:submit-pr]")))) + +(fset 'do-send-pr 'send-pr:submit-pr) ;backward compat +(defun send-pr:submit-pr () + "Pipe the contents of the buffer *send-pr* to `send-pr -f -.' unless this +buffer was loaded with emacsclient, in which case save the buffer and exit." + ;; + (interactive) + (cond + ((and (boundp 'server-buffer-clients) + server-buffer-clients) + (let ((buffer (current-buffer)) + (version-control nil) (buffer-backed-up nil)) + (save-buffer buffer) + (kill-buffer buffer) + (server-buffer-done buffer))) + (t + (or (and send-pr:::err-buffer + (buffer-name send-pr:::err-buffer)) + (setq send-pr:::err-buffer + (get-buffer-create send-pr::err-buffer-name))) + (let ((err-buffer send-pr:::err-buffer) mesg ok) + (save-excursion (set-buffer err-buffer) (erase-buffer)) + (message "running send-pr...") + (let ((oldpr (getenv "GNATS_ROOT"))) + (setenv "GNATS_ROOT" gnats:root) + ;; FIXME -r flag is obsolete; remove for 3.3 release + (call-process-region (point-min) (point-max) "send-pr" + nil err-buffer nil "-b" "-r" "-f" "-") + (setenv "GNATS_ROOT" oldpr)) + (message "running send-pr...done") + ;; stupidly we cannot check the return value in EMACS 18.57, thus we need + ;; this kluge to find out whether send-pr succeeded. + (if (save-excursion + (set-buffer err-buffer) + (goto-char (point-min)) + (setq mesg (buffer-substring (point-min) (- (point-max) 1))) + (search-forward "problem report sent" nil t)) + (progn (message mesg) + (kill-buffer err-buffer) + (delete-auto-save-file-if-necessary) + (set-buffer-modified-p nil) + (bury-buffer)) + (pop-to-buffer err-buffer)) + )))) + +;;;;--------------------------------------------------------------------------- +;;;; send-pr:send-pr-mode mode +;;;;--------------------------------------------------------------------------- + +(defvar send-pr-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "\C-c\C-c" 'send-pr:submit-pr) + (define-key map "\C-c\C-f" 'gnats:change-field) + (define-key map "\M-n" 'gnats:next-field) + (define-key map "\M-p" 'gnats:previous-field) + (define-key map "\C-\M-f" 'gnats:forward-field) + (define-key map "\C-\M-b" 'gnats:backward-field) + map) + "Keymap for send-pr mode.") + +(defconst gnats::keyword "^>\\([-a-zA-Z]+\\):") +(defconst gnats::before-keyword "[ \t\n\f]*[\n\f]+>\\([-a-zA-Z]+\\):") +(defconst gnats::after-keyword "^>\\([-a-zA-Z]+\\):[ \t\n\f]+") + +(fset 'send-pr-mode 'send-pr:send-pr-mode) +(defun send-pr:send-pr-mode () + "Major mode for submitting problem reports. +For information about the form see gnats(1) and send-pr(1). +Special commands: \\{send-pr-mode-map} +Turning on send-pr-mode calls the value of the variable send-pr-mode-hook, +if it is not nil." + (interactive) + (gnats::patch-exec-path) + (put 'send-pr:send-pr-mode 'mode-class 'special) + (kill-all-local-variables) + (setq major-mode 'send-pr:send-pr-mode) + (setq mode-name "send-pr") + (use-local-map send-pr-mode-map) + (set-syntax-table text-mode-syntax-table) + (setq local-abbrev-table text-mode-abbrev-table) + (setq buffer-offer-save t) + (make-local-variable 'send-pr:::site) + (make-local-variable 'send-pr:::categories) + (make-local-variable 'send-pr:::err-buffer) + (make-local-variable 'paragraph-separate) + (setq paragraph-separate (concat (default-value 'paragraph-separate) + "\\|" gnats::keyword "[ \t\n\f]*$")) + (make-local-variable 'paragraph-start) + (setq paragraph-start (concat (default-value 'paragraph-start) + "\\|" gnats::keyword)) + (run-hooks 'send-pr-mode-hook) + t) + +;;;;--------------------------------------------------------------------------- +;;;; Functions to read and replace field values. +;;;;--------------------------------------------------------------------------- + +(defun gnats::position-on-field (field) + (goto-char (point-min)) + (if (not (re-search-forward (concat "^>" field ":") nil t)) + (error "Field `>%s:' not found." field) + (re-search-forward "[ \t\n\f]*") + (if (looking-at gnats::keyword) + (backward-char 1)) + t)) + +(defun gnats::mail-position-on-field (field) + (let (end + (case-fold-search t)) + (goto-char (point-min)) + (re-search-forward "^$") + (setq end (match-beginning 0)) + (goto-char (point-min)) + (if (not (re-search-forward (concat "^" field ":") end 'go-to-end)) + (insert field ": \n") + (re-search-forward "[ \t\n\f]*")) + (skip-chars-backward "\n") + t)) + +(defun gnats::field-contents (field &optional elem move) + (let (pos) + (unwind-protect + (save-excursion + (if (not (gnats::position-on-field field)) + nil + (setq pos (point-marker)) + (if (or (looking-at "<.*>$") (eolp)) + t + (looking-at ".*$") ; to set match-{beginning,end} + (gnats::nth-word + (buffer-substring (match-beginning 0) (match-end 0)) + elem)))) + (and move pos (goto-char pos))))) + +(defun gnats::functionp (thing) + (or (and (symbolp thing) (fboundp thing)) + (and (listp thing) (eq (car thing) 'lambda)))) + +(defun gnats::field-values (field) + "Return the possible (known) values for field FIELD." + (let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields + send-pr::fields)) + (thing (elt (assoc field fields) 1))) + (cond ((gnats::functionp thing) (funcall thing)) + ((listp thing) thing) + (t (error "ACK"))))) + +(defun gnats::field-default (field) + "Return the default value for field FIELD." + (let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields + send-pr::fields)) + (thing (elt (assoc field fields) 2))) + (cond ((stringp thing) thing) + ((null thing) "") + ((numberp thing) (car (elt (gnats::field-values field) thing))) + ((gnats::functionp thing) + (funcall thing (gnats::field-contents field))) + ((eq thing t) (gnats::field-contents field)) + (t (error "ACK"))))) + +(defun gnats::field-type (field) + "Return the type of field FIELD." + (let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields + send-pr::fields)) + (thing (elt (assoc field fields) 3))) + thing)) + +(defun gnats::field-action (field) + "Return the extra handling function for field FIELD." + (let* ((fields (if (eq major-mode 'gnats:gnats-mode) gnats::fields + send-pr::fields)) + (thing (elt (assoc field fields) 4))) + (cond ((null thing) 'ignore) + ((gnats::functionp thing) thing) + (t (error "ACK"))))) + +;;;;--------------------------------------------------------------------------- +;;;; Point movement functions +;;;;--------------------------------------------------------------------------- + +(or (fboundp 'defsubst) (fset 'defsubst 'defun)) + +(defun send-pr::maybe-change-field (field) + (setq field (car field)) + (let ((thing (gnats::field-contents field))) + (and thing (eq t thing) + (not (eq 'multi-text (gnats::field-type field))) + (gnats:change-field field)))) + +(defun gnats:change-field (&optional field default) + "Change the value of the field containing the cursor. With arg, ask the +user for the field to change. From a program, the function takes optional +arguments of the field to change and the default value to use." + (interactive + (if current-prefix-arg + (list (completing-read + "Field: " (if (eq major-mode 'gnats:gnats-mode) gnats::fields + send-pr::fields) + nil t)))) + (or field + (setq field (gnats::current-field))) + (gnats::position-on-field field) + (sit-for 0) + (let* ((old (gnats::field-contents field)) + new) + (if (null old) + (error "ACK") + (let ((prompt (concat ">" field ": ")) + (domain (gnats::field-values field)) + (type (gnats::field-type field)) + (action (gnats::field-action field))) + (or default (setq default (gnats::field-default field))) + (setq new (if (eq type 'enum) + (completing-read prompt domain nil t + (if gnats::emacs-19p (cons default 0) + default)) + (read-string prompt (if gnats::emacs-19p (cons default 1) + default)))) + (gnats::set-field field new) + (funcall action field old new) + new)))) + +(defun gnats::set-field (field value) + (gnats::position-on-field field) + (delete-horizontal-space) + (looking-at ".*$") + (replace-match + (concat (make-string (- gnats::indent (length field) 2) ?\40 ) value) t)) + +(defun gnats::set-mail-field (field value) + (gnats::mail-position-on-field field) + (delete-horizontal-space) + (looking-at ".*$") + (replace-match (concat " " value) t)) + +(defun gnats::before-keyword (&optional where) + "Returns t if point is in some white space before a keyword. +If where is nil, then point is not changed; if where is t then point is moved +to the beginning of the keyword, otherwise it is moved to the beginning +of the white space it was in." + ;; + (if (looking-at gnats::before-keyword) + (prog1 t + (cond ((eq where t) + (re-search-forward "^>") (backward-char)) + ((not (eq where nil)) + (re-search-backward "[^ \t\n\f]") (forward-char)))) + nil)) + +(defun gnats::after-keyword (&optional where) + "Returns t if point is in some white space after a keyword. +If where is nil, then point is not changed; if where is t then point is moved +to the beginning of the keyword, otherwise it is moved to the end of the white +space it was in." + ;; + (if (gnats::looking-after gnats::after-keyword) + (prog1 t + (cond ((eq where t) + (re-search-backward "^>")) + ((not (eq where nil)) + (re-search-forward "[^ \t\n\f]") (backward-char)))) + nil)) + +(defun gnats::in-keyword (&optional where) + "Returns t if point is within a keyword. +If where is nil, then point is not changed; if where is t then point is moved +to the beginning of the keyword." + ;; + (let ((old-point (point-marker))) + (beginning-of-line) + (cond ((and (looking-at gnats::keyword) + (< old-point (match-end 0))) + (prog1 t + (if (eq where t) + t + (goto-char old-point)))) + (t (goto-char old-point) + nil)))) + +(defun gnats::forward-bofield () + "Moves point to the beginning of a field. Assumes that point is in the +keyword." + ;; + (if (re-search-forward "[ \t\n\f]+[^ \t\n\f]" (point-max) '-) + (backward-char) + t)) + +(defun gnats::backward-eofield () + "Moves point to the end of a field. Assumes point is in the keyword." + ;; + (if (re-search-backward "[^ \t\n\f][ \t\n\f]+" (point-min) '-) + (forward-char) + t)) + +(defun gnats::forward-eofield () + "Moves point to the end of a field. Assumes that point is in the field." + ;; + ;; look for the next field + (if (re-search-forward gnats::keyword (point-max) '-) + (progn (beginning-of-line) (gnats::backward-eofield)) + (re-search-backward "[^ \t\n\f][ \t\n\f]*" (point-min) '-) + (forward-char))) + +(defun gnats::backward-bofield () + "Moves point to the beginning of a field. Assumes that point is in the +field." + ;; + ;;look for previous field + (if (re-search-backward gnats::keyword (point-min) '-) + (gnats::forward-bofield) + t)) + + +(defun gnats:forward-field () + "Move point forward to the end of the field or to the beginning of the next +field." + ;; + (interactive) + (if (or (gnats::before-keyword t) (gnats::in-keyword t) + (gnats::after-keyword t)) + (gnats::forward-bofield) + (gnats::forward-eofield))) + +(defun gnats:backward-field () + "Move point backward to the beginning/end of a field." + ;; + (interactive) + (backward-char) + (if (or (gnats::before-keyword t) (gnats::in-keyword t) + (gnats::after-keyword t)) + (gnats::backward-eofield) + (gnats::backward-bofield))) + +(defun gnats:next-field () + "Move point to the beginning of the next field." + ;; + (interactive) + (if (or (gnats::before-keyword t) (gnats::in-keyword t) + (gnats::after-keyword t)) + (gnats::forward-bofield) + (if (re-search-forward gnats::keyword (point-max) '-) + (gnats::forward-bofield) + t))) + +(defun gnats:previous-field () + "Move point to the beginning of the previous field." + ;; + (interactive) + (backward-char) + (if (or (gnats::after-keyword t) (gnats::in-keyword t) + (gnats::before-keyword t)) + (progn (re-search-backward gnats::keyword (point-min) '-) + (gnats::forward-bofield)) + (gnats::backward-bofield))) + +(defun gnats:beginning-of-field () + "Move point to the beginning of the current field." + (interactive) + (cond ((gnats::in-keyword t) + (gnats::forward-bofield)) + ((gnats::after-keyword 0)) + (t + (gnats::backward-bofield)))) + +(defun gnats::current-field () + (save-excursion + (cond ((or (gnats::in-keyword t) (gnats::after-keyword t)) + (looking-at gnats::keyword)) + ((re-search-backward gnats::keyword nil t)) + (t + nil)) + (buffer-substring (match-beginning 1) (match-end 1)))) + +;;;;--------------------------------------------------------------------------- +;;;; Support functions +;;;;--------------------------------------------------------------------------- + +(defun gnats::looking-after (regex) + "Returns t if point is after regex." + ;; + (let* ((old-point (point)) + (start (if (eobp) + old-point + (forward-char) (point)))) + (cond ((re-search-backward regex (point-min) t) + (goto-char old-point) + (cond ((eq (match-end 0) start) + t)))))) + +(defun gnats::nth-word (string &optional elem) + "Returns the elem-th word of the string. +If elem is nil, then the first wort is returned, if elem is 0 then +the whole string is returned." + ;; + (if (integerp elem) + (cond ((eq elem 0) string) + ((eq elem 1) (gnats::first-word string)) + ((equal string "") "") + ((>= elem 2) + (let ((i 0) (value "")) + (setq string ; strip leading blanks + (substring string (or (string-match "[^ \t]" string) 0))) + (while (< i elem) + (setq value + (substring string 0 + (string-match "[ \t]*$\\|[ \t]+" string))) + (setq string + (substring string (match-end 0))) + (setq i (+ i 1))) + value))) + (gnats::first-word string))) + +(defun gnats::first-word (string) + (setq string + (substring string (or (string-match "[^ \t]" string) 0))) + (substring string 0 (string-match "[ \t]*$\\|[ \t]+" string))) + +;;;;--------------------------------------------------------------------------- + +(defun gnats::patch-exec-path () + ;; + "Replaces `//' by `/' in `exec-path'." + ;; + ;(make-local-variable 'exec-path) + (let ((err-buffer (get-buffer-create " *gnats::patch-exec-path*")) + (ret)) + (setq exec-path (save-excursion (set-buffer err-buffer) + (prin1 exec-path err-buffer) + (goto-char (point-min)) + (replace-string "//" "/") + (goto-char (point-min)) + (setq ret (read err-buffer)) + (kill-buffer err-buffer) + ret + )))) + +(defun gnats::get-value-from-shell (&rest command) + "Execute shell command to get a list of valid values for `variable'." + ;; + (let ((err-buffer (get-buffer-create " *gnats::get-value-from-shell*"))) + (save-excursion + (set-buffer err-buffer) + (unwind-protect + (condition-case var + (progn + (apply 'call-process + (car command) nil err-buffer nil (cdr command)) + (goto-char (point-min)) + (if (looking-at "[-a-z]+: ") + (error (buffer-substring (point-min) (point-max)))) + (read err-buffer)) + (error nil)) + (kill-buffer err-buffer))))) + +(or (fboundp 'setenv) + (defun setenv (variable &optional value) + "Set the value of the environment variable named VARIABLE to VALUE. +VARIABLE should be a string. VALUE is optional; if not provided or is +`nil', the environment variable VARIABLE will be removed. +This function works by modifying `process-environment'." + (interactive "sSet environment variable: \nsSet %s to value: ") + (if (string-match "=" variable) + (error "Environment variable name `%s' contains `='" variable) + (let ((pattern (concat "\\`" (regexp-quote (concat variable "=")))) + (case-fold-search nil) + (scan process-environment)) + (while scan + (cond + ((string-match pattern (car scan)) + (if (eq nil value) + (setq process-environment (delq (car scan) + process-environment)) + (setcar scan (concat variable "=" value))) + (setq scan nil)) + ((null (setq scan (cdr scan))) + (setq process-environment + (cons (concat variable "=" value) + process-environment))))))))) + +;;;; end of send-pr.el diff --git a/gnu/usr.bin/send-pr/send-pr.man b/gnu/usr.bin/send-pr/send-pr.man new file mode 100644 index 000000000000..75e3c6c4294b --- /dev/null +++ b/gnu/usr.bin/send-pr/send-pr.man @@ -0,0 +1,312 @@ +.\" -*- nroff -*- +.\" --------------------------------------------------------------------------- +.\" man page for send-pr (by Heinz G. Seidl, hgs@cygnus.com) +.\" updated Feb 1993 for GNATS 3.00 by Jeffrey Osier, jeffrey@cygnus.com +.\" +.\" This file is part of the Problem Report Management System (GNATS) +.\" Copyright 1992 Cygnus Support +.\" +.\" This program 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 of the License, or (at your option) any later version. +.\" +.\" This program 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 Library General Public +.\" License along with this program; if not, write to the Free +.\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA +.\" +.\" --------------------------------------------------------------------------- +.nh +.TH SEND-PR 1 @VERSION@ "February 1993" +.SH NAME +send-pr \- send problem report (PR) to a central support site +.SH SYNOPSIS +.B send-pr +[ +.I site +] +[ +.B \-f +.I problem-report +] +[ +.B \-t +.I mail-address +] +.br +.in +0.8i +[ +.B \-p +] +[ +.B \-P +] +[ +.B \-L +] +[ +.B \-\-request-id +] +[ +.B \-v +] +.SH DESCRIPTION +.B send-pr +is a tool used to submit +.I problem reports +.\" SITE ADMINISTRATORS - change this if you use a local default +(PRs) to a central support site. In most cases the correct +.I site +will be the default. This argument indicates the support site which +is responsible for the category of problem involved. Some sites may +use a local address as a default. +.I site +values are defined by using the +.BR aliases (5). +.LP +.B send-pr +invokes an editor on a problem report template (after trying to fill +in some fields with reasonable default values). When you exit the +editor, +.B send-pr +sends the completed form to the +.I Problem Report Management System +(\fBGNATS\fR) at a central support site. At the support site, the PR +is assigned a unique number and is stored in the \fBGNATS\fR database +according to its category and submitter-id. \fBGNATS\fR automatically +replies with an acknowledgement, citing the category and the PR +number. +.LP +To ensure that a PR is handled promptly, it should contain your (unique) +\fIsubmitter-id\fR and one of the available \fIcategories\fR to identify the +problem area. (Use +.B `send-pr -L' +to see a list of categories.) +.LP +The +.B send-pr +template at your site should already be customized with your +submitter-id (running `\|\fBinstall-sid\fP \fIsubmitter-id\fP\|' to +accomplish this is part of the installation procedures for +.BR send-pr ). +If this hasn't been done, see your system administrator for your +submitter-id, or request one from your support site by invoking +.B `send-pr \-\-request\-id'. +If your site does not distinguish between different user sites, or if +you are not affiliated with the support site, use +.B `net' +for this field. +.LP +The more precise your problem description and the more complete your +information, the faster your support team can solve your problems. +.SH OPTIONS +.TP +.BI \-f " problem-report" +specify a file (\fIproblem-report\fR) which already contains a +complete problem report. +.B send-pr +sends the contents of the file without invoking the editor. If +the value for +.I problem-report +is +.BR `\|\-\|' , +then +.B send-pr +reads from standard input. +.TP +.BI \-t " mail-address" +Change mail address at the support site for problem reports. The +default +.I mail-address +is the address used for the default +.IR site . +Use the +.I site +argument rather than this option in nearly all cases. +.TP +.B \-p +Print the standard blank template on standard output. No mail is sent. +.TP +.B \-P +print the form specified by the environment variable +.B PR_FORM +on standard output. No mail is sent. +.TP +.BI \-s " mail-agent" +Use +.I mail-agent +instead of the default mailer, +.BR sendmail (8). +.TP +.B -L +print the list of available categories. No mail is sent. +.TP +.B \-\-request\-id +sends mail to the default support site, or +.I site +if specified, with a request for your +.IR submitter-id . +If you are +not affiliated with +.IR site , +use a +.I submitter-id +of +.BR net \|'. +.TP +.B \-v +Display the +.B send-pr +version number. +.LP +Note: use +.B send-pr +to submit problem reports rather than mailing them directly. Using +both the template and +.B send-pr +itself will help ensure all necessary information will reach the +support site. +.SH ENVIRONMENT +The environment variable +.B EDITOR +specifies the editor to invoke on the template. +.br +default: +.B vi +.sp +If the environment variable +.B PR_FORM +is set, then its value is used as the file name of the template for +your problem-report editing session. You can use this to start with a +partially completed form (for example, a form with the identification +fields already completed). +.SH "HOW TO FILL OUT A PROBLEM REPORT" +Problem reports have to be in a particular form so that a program can +easily manage them. Please remember the following guidelines: +.IP \(bu 3m +describe only +.B one problem +with each problem report. +.IP \(bu 3m +For follow-up mail, use the same subject line as the one in the automatic +acknowledgent. It consists of category, PR number and the original synopsis +line. This allows the support site to relate several mail messages to a +particular PR and to record them automatically. +.IP \(bu 3m +Please try to be as accurate as possible in the subject and/or synopsis line. +.IP \(bu 3m +The subject and the synopsis line are not confidential. This is +because open-bugs lists are compiled from them. Avoid confidential +information there. +.LP +See the GNU +.B Info +file +.B send-pr.info +or the document \fIReporting Problems With send-pr\fR\ for detailed +information on reporting problems +.SH "HOW TO SUBMIT TEST CASES, CODE, ETC." +Submit small code samples with the PR. Contact the support site for +instructions on submitting larger test cases and problematic source +code. +.SH FILES +.ta \w'/tmp/pbad$$ 'u +/tmp/p$$ copy of PR used in editing session +.br +/tmp/pf$$ copy of empty PR form, for testing purposes +.br +/tmp/pbad$$ file for rejected PRs +.if !\n(PR==1 \{. +.SH SEE ALSO +.BR gnats.texi +and +.BR send-pr.texi, +which are also installed as GNU +.B Info +files +.BR gnats.info +and +.BR send-pr.info; +.LP +.BR gnats (l), +.BR query-pr (1), +.BR edit-pr (1), +.BR gnats (8), +.BR queue-pr (8), +.BR at-pr (8), +.BR mkcat (8), +.BR mkdist (8). +.SH EMACS USER INTERFACE +An Emacs user interface for +.B send-pr +with completion of field values is part of the +.B send-pr +distribution (invoked with +.BR "M-x send-pr" ). +See the file +.B send-pr.info +or the ASCII file +.B INSTALL +in the top level directory of the distribution for configuration and +installation information. The Emacs LISP template file is +.B send-pr-el.in +and is installed as +.BR send-pr.el . + +.SH INSTALLATION AND CONFIGURATION +See +.B send-pr.info +or +.B INSTALL +for installation instructions. +.LP +There are many ways in which +.B send-pr +can be customized to meet specific needs. As mentioned above, at +least the +.I submitter-id +should be set before using +.BR send-pr . +You can change the +.I submitter-id +used by an already installed +.B send-pr +script, by running an auxiliary script: `\|\c +.B install_sid +.IR submitter-id \|'. +.LP +The file +.B send-pr.el +is automatically installed when the distribution is built. It is not, +however, automatically loaded every time Emacs starts up. See +.B send-pr.info +or +.B INSTALL +for instructions on how to load +.B send-pr +automatically into Emacs. +.SH AUTHORS +Jeffrey Osier, Brendan Kehoe, Heinz G. Seidl (Cygnus Support) +.SH COPYING +Copyright (c) 1992, 1993 Free Software Foundation, Inc. +.PP +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. +.PP +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. +.PP +Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that this permission notice may be included in +translations approved by the Free Software Foundation instead of in +the original English. + diff --git a/gnu/usr.bin/send-pr/send-pr.sh b/gnu/usr.bin/send-pr/send-pr.sh new file mode 100644 index 000000000000..5a468f27e5cc --- /dev/null +++ b/gnu/usr.bin/send-pr/send-pr.sh @@ -0,0 +1,510 @@ +#!/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@ide.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=3.01.6 + +# The submitter-id for your site. +SUBMITTER=net + +# Where the GNATS directory lives, if at all. +[ -z "$GNATS_ROOT" ] && +GNATS_ROOT=/b/gnats + +# The default mail address for PR submissions. +GNATS_ADDR=gnats-bugs@sun-lamp.cs.berkeley.edu + +# Where the gnats category tree lives. +DATADIR=/usr/lib/gnats + +# If we've been moved around, try using GCC_EXEC_PREFIX. +[ ! -d $DATADIR/gnats -a -d "$GCC_EXEC_PREFIX" ] && DATADIR=${GCC_EXEC_PREFIX}.. + +# The default release for this host. +DEFAULT_RELEASE="" + +# The default organization. +DEFAULT_ORGANIZATION="" + +# The default site to look for. +GNATS_SITE=sun-lamp + +# 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="/usr/sbin/sendmail -oi -t" + +# + +[ -z "$TMPDIR" ] && TMPDIR=/tmp + +TEMP=$TMPDIR/p$$ +BAD=$TMPDIR/pbad$$ +REF=$TMPDIR/pf$$ + +if [ -z "$HOSTNAME" ]; then + if [ -f /bin/hostname ] ; then HOSTNAME=`/bin/hostname` + elif [ -f /usr/bin/hostname ] ; then HOSTNAME=`/usr/bin/hostname` + # Solaris et al. + elif [ -f /usr/ucb/hostname ] ; then HOSTNAME=`/usr/ucb/hostname` + # Irix + elif [ -f /usr/bsd/hostname ] ; then HOSTNAME=`/usr/bsd/hostname` + else echo "$COMMAND: HOSTNAME not set and hostname not found"; exit 1 + fi +fi + +if [ -z "$LOGNAME" -a -n "$USER" ]; then + LOGNAME=$USER +fi +if [ -z "$LOGNAME" ]; then + FROM= + REPLY_TO= +else + FROM="$LOGNAME@$HOSTNAME" + REPLY_TO="$LOGNAME@$HOSTNAME" +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`" +elif [ -f /bin/domainname ]; then + if [ "`/bin/domainname`" != "" -a -f /usr/bin/ypcat ]; then + # Must use temp file due to incompatibilities in quoting behavior + # and to protect shell metacharacters in the expansion of $LOGNAME + /usr/bin/ypcat passwd 2>/dev/null | cat - /etc/passwd | grep "^$LOGNAME:" | + cut -f5 -d':' | sed -e 's/,.*//' > $TEMP + ORIGINATOR="`cat $TEMP`" + rm -f $TEMP + fi +fi + +if [ "$ORIGINATOR" = "" ]; then + grep "^$LOGNAME:" /etc/passwd | cut -f5 -d':' | sed -e 's/,.*//' > $TEMP + ORIGINATOR="`cat $TEMP`" + rm -f $TEMP +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 | -p) ;; # 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 | --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" ]; 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) echo "$CATEGORIES" | \ + awk 'BEGIN {print "Known categories:"; i = 1 } + { printf ("%-12.12s", $0); if ((++i % 5) == 0) { print "" } } + END { print ""; }' + exit 0 + ;; +esac + +ORIGINATOR_C='' +ORGANIZATION_C='' +CONFIDENTIAL_C='<[ yes | no ] (one line)>' +SYNOPSIS_C='' +SEVERITY_C='<[ non-critical | serious | critical ] (one line)>' +PRIORITY_C='<[ low | medium | high ] (one line)>' +CATEGORY_C='' +CLASS_C='<[ sw-bug | doc-bug | change-request | support ] (one line)>' +RELEASE_C='' +ENVIRONMENT_C='' +DESCRIPTION_C='' +HOW_TO_REPEAT_C='' +FIX_C='' + +# Catch some signals. ($xs kludge needed by Sun /bin/sh) +xs=0 +trap 'rm -f $REF $TEMP; exit $xs' 0 +trap 'echo "$COMMAND: Aborting ..."; rm -f $REF $TEMP; xs=1; exit' 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. + echo "$CATEGORIES" | awk ' + BEGIN { printf "SEND-PR: "; i = 1 } + { printf ("%-12.12s", $0) ; + if ((++i % 5) == 0) { printf "\nSEND-PR: "}} + END { printf "\nSEND-PR:\n" }' >> $file + + cat >> $file << __EOF__ +To: $GNATS_ADDR +Subject: +From: $FROM +Reply-To: $REPLY_TO +X-send-pr-version: $VERSION + +>Submitter-Id: $SUBMITTER +>Originator: $ORIGINATOR +>Organization: +` + if [ -n "$ORGANIZATION" ]; then + echo "$ORGANIZATION" + else + echo " $ORGANIZATION_C" ; + fi ; +` +>Confidential: $CONFIDENTIAL_C +>Synopsis: $SYNOPSIS_C +>Severity: $SEVERITY_C +>Priority: $PRIORITY_C +>Category: $CATEGORY_C +>Class: $CLASS_C +>Release: `if [ -n "$DEFAULT_RELEASE" ]; then + echo "$DEFAULT_RELEASE" + else + echo " $RELEASE_C" + fi; ` +>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 + eval $EDIT $TEMP + 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 + + [ $CNT -lt 5 -a -z "$BATCH" ] && + echo "Errors were found with the problem report." + + while true; do + if [ -z "$BATCH" ]; then + echo -n "a)bort, e)dit or s)end? " + read input + else + if [ $CNT -eq 5 ]; 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*) + 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;<.*>;; +/^>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