runit

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit b1c4c9d7c204bc5c3a6f20be65582e153b8d31c5
parent 34ead97e601c33575186a62c2eb41be9aee8190d
Author: Gerrit Pape <pape@smarden.org>
Date:   Thu, 24 Apr 2003 11:26:38 +0000

html.

Diffstat:
Mdoc/runit-init.8.html | 8++++----
Mdoc/runit.8.html | 9+++++----
Mdoc/runsv.8.html | 3++-
Mdoc/runsvchdir.8.html | 9+++++----
Mdoc/runsvctrl.8.html | 5+++--
Mdoc/runsvdir.8.html | 9++++++---
Mdoc/runsvstat.8.html | 5+++--
Mdoc/svlogd.8.html | 120+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Mdoc/svwaitdown.8.html | 59+++++++++++++++++++++++++++++++----------------------------
Mdoc/svwaitup.8.html | 4++--
Mdoc/upgrade.html | 12++++++++++++
Mdoc/utmpset.8.html | 10+++++-----
12 files changed, 144 insertions(+), 109 deletions(-)

diff --git a/doc/runit-init.8.html b/doc/runit-init.8.html @@ -39,12 +39,12 @@ execute by owner permission of the files <I>/etc/runit/reboot</I> and <I>/etc/ru <B>runit-init</B> returns 111 on error, 0 in all other cases. <H2><A NAME="sect4">See Also</A></H2> -<I>runit(8)</I>, <I>svwaitdown(8)</I>, -<I>svwaitup(8)</I>, <I>utmpset(8)</I> <P> +<I>runit(8)</I>, <I>runsv(8)</I>, +<I>runsvctrl(8)</I>, <I>runsvstat(8)</I>, <I>runsvdir(8)</I>, <I>runsvchdir(8)</I>, <I>svlogd(8)</I>, <I>utmpset(8)</I> +<P> <I>http://smarden.org/runit/</I> <H2><A NAME="sect5">Author</A></H2> -Gerrit Pape &lt;pape@smarden.org&gt; -<P> +Gerrit Pape &lt;pape@smarden.org&gt; <P> <HR><P> <A NAME="toc"><B>Table of Contents</B></A><P> diff --git a/doc/runit.8.html b/doc/runit.8.html @@ -49,11 +49,12 @@ if <B>runit</B> receives an INT signal, a ctrl-alt-del keyboard request is triggered. <H2><A NAME="sect8">See Also</A></H2> <I>runit-init(8)</I>, <I>runsvdir(8)</I>, -<I>runsv(8)</I>, <I>svwaitdown(8)</I>, <I>svwaitup(8)</I>, <I>utmpset(8)</I> <P> -<I>http://smarden.org/runit/</I> - +<I>runsvchdir(8)</I>, <I>runsv(8)</I>, <I>runsvctrl(8)</I>, <I>runsvstat(8)</I>, <I>svwaitdown(8)</I>, <I>svwaitup(8)</I>, +<I>svlogd(8)</I>, <I>utmpset(8)</I> <P> +<I>http://smarden.org/runit/</I> <H2><A NAME="sect9">Author</A></H2> -Gerrit Pape &lt;pape@smarden.org&gt; <P> +Gerrit Pape &lt;pape@smarden.org&gt; +<P> <HR><P> <A NAME="toc"><B>Table of Contents</B></A><P> diff --git a/doc/runsv.8.html b/doc/runsv.8.html @@ -116,7 +116,8 @@ if another <B>runsv</B> is running in <I>service</I>. <P> <B>runsv</B> exits 0 if it was told to exit. <H2><A NAME="sect6">See Also</A></H2> -<I>runit(8)</I>, <I>runit-init(8)</I>, <I>runsvdir(8)</I>, <I>svc(8)</I>, <I>supervise(8)</I> +<I>runsvctrl(8)</I>, <I>runsvstat(8)</I>, <I>runit(8)</I>, <I>runit-init(8)</I>, <I>runsvdir(8)</I>, +<I>runsvchdir(8)</I>, <I>svlogd(8)</I>, <I>svwaitdown(8)</I>, <I>svwaitup(8)</I>, <I>svc(8)</I>, <I>supervise(8)</I> <P> <I>http://smarden.org/runit/</I><BR> <I>http://cr.yp.to/daemontools.html</I><BR> diff --git a/doc/runsvchdir.8.html b/doc/runsvchdir.8.html @@ -31,11 +31,12 @@ error. <B>runsvchdir</B> exits 0 on success. /etc/runit/runsvdir/current.new<BR> <H2><A NAME="sect5">See Also</A></H2> -<I>runsvdir(8)</I>, <I>runsv(8)</I>, <I>runit(8)</I>, <I>runit-init(8)</I> <P> -<I>http://smarden.org/runit/</I> - +<I>runsvdir(8)</I>, <I>runsv(8)</I>, <I>runsvctrl(8)</I>, <I>runsvstat(8)</I>, <I>runit(8)</I>, <I>runit-init(8)</I>, +<I>svwaitdown(8)</I>, <I>svwaitup(8)</I> <P> +<I>http://smarden.org/runit/</I> <H2><A NAME="sect6">Author</A></H2> -Gerrit Pape &lt;pape@smarden.org&gt; <P> +Gerrit Pape &lt;pape@smarden.org&gt; +<P> <HR><P> <A NAME="toc"><B>Table of Contents</B></A><P> diff --git a/doc/runsvctrl.8.html b/doc/runsvctrl.8.html @@ -90,8 +90,9 @@ process), <B>runsvctrl</B> increases the exit code by one and exits non zero. Th maximum is 100. <P> <B>runsvctrl</B> exits 111 on error. <H2><A NAME="sect5">See Also</A></H2> -<I>runsvstat(8)</I>, <I>runit(8)</I>, -<I>runit-init(8)</I>, <I>runsvdir(8)</I>, <I>runsv(8)</I>, <I>svwaitdown(8)</I>, <I>svwaitup(8)</I> <P> +<I>runsvstat(8)</I>, <I>runsv(8)</I>, +<I>runit(8)</I>, <I>runit-init(8)</I>, <I>runsvdir(8)</I>, <I>runsvchdir(8)</I>, <I>svlogd(8)</I>, <I>svwaitdown(8)</I>, +<I>svwaitup(8)</I> <P> <I>http://smarden.org/runit/</I><BR> <H2><A NAME="sect6">Author</A></H2> diff --git a/doc/runsvdir.8.html b/doc/runsvdir.8.html @@ -36,10 +36,13 @@ Normally <B>runsvdir</B> is started by <B><I>runit</B>(8)</I> in stage 2. <H2><A NAME="sect3">Signals</A></H2> If <B>runsvdir</B> receives a TERM signal, -it sends a TERM signal to each <B><I>runsv</B>(8)</I> process it is monitoring and then -exits with 0. +it exits with 0 immediately. <P> +If <B>runsvdir</B> receives a HUP signal, it sends +a TERM signal to each <B><I>runsv</B>(8)</I> process it is monitoring and then exits +with 111. <H2><A NAME="sect4">See Also</A></H2> -<I>runit(8)</I>, <I>runit-init(8)</I>, <I>runsv(8)</I>, <I>readproctitle(8)</I>, +<I>runsvchdir(8)</I>, <I>runsv(8)</I>, <I>runsvctrl(8)</I>, <I>runsvstat(8)</I>, <I>runit(8)</I>, +<I>runit-init(8)</I>, <I>svlogd(8)</I>, <I>svwaitdown(8)</I>, <I>svwaitup(8)</I>, <I>readproctitle(8)</I>, <I>svscan(8)</I> <P> <I>http://smarden.org/runit/</I><BR> <I>http://cr.yp.to/daemontools.html</I><BR> diff --git a/doc/runsvstat.8.html b/doc/runsvstat.8.html @@ -40,8 +40,9 @@ process), <B>runsvstat</B> increases the exit code by one and exits non zero. Th maximum is 100. <P> <B>runsvstat</B> exits 111 on error. <H2><A NAME="sect5">See Also</A></H2> -<I>runsvctrl(8)</I>, <I>runit(8)</I>, -<I>runit-init(8)</I>, <I>runsvdir(8)</I>, <I>runsv(8)</I>, <I>svwaitdown(8)</I>, <I>svwaitup(8)</I> <P> +<I>runsvctrl(8)</I>, <I>runsv(8)</I>, +<I>runsvdir(8)</I>, <I>runsvchdir(8)</I>, <I>runit(8)</I>, <I>runit-init(8)</I>, <I>svlogd(8)</I>, <I>svwaitdown(8)</I>, +<I>svwaitup(8)</I> <P> <I>http://smarden.org/runit/</I><BR> <H2><A NAME="sect6">Author</A></H2> diff --git a/doc/svlogd.8.html b/doc/svlogd.8.html @@ -70,87 +70,98 @@ long, or starts with a ``#'', it is ignored. A line of the form <DT>s<I>size</I> </DT> <DD>sets the maximum file size of <I>current</I> when <B>svlogd</B> should rotate the current log -file to <I>size</I> bytes. Default is 1000000. </DD> +file to <I>size</I> bytes. Default is 1000000. If <I>size</I> is zero, <B>svlogd</B> doesn't rotate +log files. You should set <I>size</I> to at least (2 * <I>len</I>). </DD> <DT>n<I>num</I> </DT> -<DD>sets the maximum number of old -log files <B>svlogd</B> should maintain to <I>num</I>. If <B>svlogd</B> sees more that <I>num</I> old -log files in <I>log</I> after log file rotation, it deletes the oldest one. Default -is 10. </DD> +<DD>sets the maximum +number of old log files <B>svlogd</B> should maintain to <I>num</I>. If <B>svlogd</B> sees more +that <I>num</I> old log files in <I>log</I> after log file rotation, it deletes the oldest +one. Default is 10. </DD> <DT>!<I>processor</I> </DT> -<DD>tells <B>svlogd</B> to feed each recent log file through <I>processor</I> -(see above) on log file rotation. By default log files are not processed. -</DD> +<DD>tells <B>svlogd</B> to feed each recent log file +through <I>processor</I> (see above) on log file rotation. By default log files +are not processed. </DD> </DL> <P> -If a line starts with a <I>-</I>, <I>+</I>, <I>e</I>, or <I>E</I>, <B>svlogd</B> matches the first <I>len</I> characters -of each log message against <I>pattern</I> and acts accordingly: +If a line starts with a <I>-</I>, <I>+</I>, <I>e</I>, or <I>E</I>, <B>svlogd</B> matches +the first <I>len</I> characters of each log message against <I>pattern</I> and acts accordingly: + <DL> <DT>-<I>pattern</I> </DT> -<DD>the log -message is deselected. </DD> +<DD>the log message is deselected. </DD> <DT>+<I>pattern</I> </DT> -<DD>the log message is selected </DD> +<DD>the log message is selected +</DD> <DT>e<I>pattern</I> </DT> -<DD>log -messages matching <I>pattern</I> are printed to standard error. </DD> +<DD>log messages matching <I>pattern</I> are printed to standard error. </DD> -<DT>E<I>pattern</I> </DT> -<DD>log messages -not matching <I>pattern</I> are printed to standard error. </DD> +<DT>E<I>pattern</I> +</DT> +<DD>log messages not matching <I>pattern</I> are printed to standard error. </DD> </DL> <P> -Initially each line -is selected. Deselected log messages are discarded from <I>log</I>. -<H2><A NAME="sect7">Options</A></H2> +Initially +each line is selected. Deselected log messages are discarded from <I>log</I>. +<H2><A NAME="sect7">Pattern +Matching</A></H2> +<B>svlogd</B> matches a log message against the string <I>pattern</I> as follows: +<P> +<I>pattern</I> is applied to the log message one character by one, starting with +the first. A character not a star (``*'') and not a plus (``+'') matches itself. +A plus matches the next character in <I>pattern</I> in the log message one or +more times. A star before the end of <I>pattern</I> matches any string in the log +message that does not include the next character in <I>pattern</I>. A star at the +end of <I>pattern</I> matches any string. +<H2><A NAME="sect8">Options</A></H2> <DL> <DT><B>-t</B> </DT> -<DD>timestamp. -Prefix each selected line with a precise timestamp (see <B><I>tai64n</B>(8)</I>) when -writing to <I>log</I> or to standard error. </DD> +<DD>timestamp. Prefix each selected +line with a precise timestamp (see <B><I>tai64n</B>(8)</I>) when writing to <I>log</I> or to +standard error. </DD> <DT><B>-r <I>c</B> </I></DT> -<DD>replace. <I>c</I> must be a single character. -Replace non-printable characters in log messages with <I>c</I>. Character are replaced -before pattern matching is applied. </DD> +<DD>replace. <I>c</I> must be a single character. Replace non-printable +characters in log messages with <I>c</I>. Characters are replaced before pattern +matching is applied. </DD> <DT><B>-R <I>abc</B> </I></DT> -<DD>replace characters. Additionally -to non-printable characters, replace all characters found in <I>abc</I> with <I>c</I> -(default ``_''). </DD> +<DD>replace charset. Additionally to non-printable +characters, replace all characters found in <I>abc</I> with <I>c</I> (default ``_''). </DD> -<DT><B>-l <I>len</B> </I></DT> -<DD>line length. Pattern matching applies to the first <I>len</I> -characters of a log message only. Default is 1000. </DD> +<DT><B>-l <I>len</B> +</I></DT> +<DD>line length. Pattern matching applies to the first <I>len</I> characters of a log +message only. Default is 1000. </DD> <DT><B>-b <I>buflen</B> </I></DT> -<DD>buffer size. Set -the size of the buffer <B>svlogd</B> uses when reading from standard input and -writing to <I>logs</I> to <I>buflen</I>. Default is 1024. <I>buflen</I> must be greater than <I>len</I>. -</DD> +<DD>buffer size. Set the size of the buffer +<B>svlogd</B> uses when reading from standard input and writing to <I>logs</I> to <I>buflen</I>. +Default is 1024. <I>buflen</I> must be greater than <I>len</I>. </DD> </DL> -<H2><A NAME="sect8">Signals</A></H2> -If <B>svlogd</B> is sent a HUP signal, it closes and reopens all <I>logs</I>, -and updates their configuration according to <I>log/config</I>. <P> +<H2><A NAME="sect9">Signals</A></H2> If <B>svlogd</B> is sent -a TERM signal, or if it sees end-of-file on standard input, it closes standard -input, waits for all <I>processor</I> subprocesses to finish if any, and exits -0 as soon as possible. <P> -If <B>svlogd</B> is sent an ALRM signal, it tries for all -<I>logs</I> to rotate the current log file, if it is not empty. -<H2><A NAME="sect9">See Also</A></H2> -<I>runsvstat(8)</I>, -<I>runit(8)</I>, <I>runit-init(8)</I>, <I>runsv(8)</I>, <I>runsvstat(8)</I>, <I>runsvctrl(8)</I>, <I>runsvdir(8)</I>, -<I>runsvchdir(8)</I>, <I>svwaitdown(8)</I>, <I>svwaitup(8)</I> <P> +a HUP signal, it closes and reopens all <I>logs</I>, and updates their configuration +according to <I>log/config</I>. <P> +If <B>svlogd</B> is sent a TERM signal, or if it sees +end-of-file on standard input, it stops reading standard input, processes +the data in the buffer, waits for all <I>processor</I> subprocesses to finish +if any, and exits 0 as soon as possible. <P> +If <B>svlogd</B> is sent an ALRM signal, +it forces log file rotation for all <I>logs</I> with a non empty <I>current</I> log file. + +<H2><A NAME="sect10">See Also</A></H2> +<I>runsv(8)</I>, <I>runsvstat(8)</I>, <I>runsvctrl(8)</I>, <I>runsvdir(8)</I>, <I>runsvchdir(8)</I>, +<I>runit(8)</I>, <I>runit-init(8)</I>, <I>multilog(8)</I> <P> <I>http://smarden.org/runit/</I> -<H2><A NAME="sect10">Author</A></H2> +<H2><A NAME="sect11">Author</A></H2> Gerrit Pape &lt;pape@smarden.org&gt; <P> @@ -166,9 +177,10 @@ Pape &lt;pape@smarden.org&gt; <P> <LI><A NAME="toc5" HREF="#sect5">Processor</A></LI> <LI><A NAME="toc6" HREF="#sect6">Config</A></LI> </UL> -<LI><A NAME="toc7" HREF="#sect7">Options</A></LI> -<LI><A NAME="toc8" HREF="#sect8">Signals</A></LI> -<LI><A NAME="toc9" HREF="#sect9">See Also</A></LI> -<LI><A NAME="toc10" HREF="#sect10">Author</A></LI> +<LI><A NAME="toc7" HREF="#sect7">Pattern Matching</A></LI> +<LI><A NAME="toc8" HREF="#sect8">Options</A></LI> +<LI><A NAME="toc9" HREF="#sect9">Signals</A></LI> +<LI><A NAME="toc10" HREF="#sect10">See Also</A></LI> +<LI><A NAME="toc11" HREF="#sect11">Author</A></LI> </UL> </BODY></HTML> diff --git a/doc/svwaitdown.8.html b/doc/svwaitdown.8.html @@ -14,52 +14,55 @@ svwaitdown - waits for services controlled by <I>supervise(8)</I> to be down <H2><A NAME="sect1">Synopsis</A></H2> <B>svwaitdown</B> [ <B>-v</B> ] [ <B>-k</B> ] [ <B>-t</B> <I>sec</I> ] <I>services</I> <H2><A NAME="sect2">Description</A></H2> -<I>services</I> consist +<I>services</I> consists of one or more arguments. Each <I>service</I> directory must start with a slash. <P> -<B>svwaitdown</B> checks each <I>service</I> given at the command line for being down. -The <I>services</I> given at the command line must be controlled by <B><I>supervise</B>(8)</I>. -<P> -<B>svwaitdown</B> blocks, limited by a <I>timeout</I>, until all <I>services</I> are down or -reports errors. +<B>svwaitdown</B> sends each <I>service</I> given at the command line the ``down'' command +if not yet done, and waits for it to become down. The <I>services</I> given at +the command line must be controlled by <B><I>supervise</B>(8)</I>. <P> +<B>svwaitdown</B> blocks, +limited by a <I>timeout</I>, until all <I>services</I> are down or reports errors. <H2><A NAME="sect3">Options</A></H2> <DL> -<DT><B>-v</B> </DT> +<DT><B>-v</B> +</DT> <DD>verbose. Print verbose messages to stderr. </DD> -<DT><B>-t <I>sec</B> -</I></DT> -<DD>Set the timeout for waiting for <I>services</I> to become down to <I>sec</I> seconds. -<I>sec</I> must be between 2 and 6000. Default is 600 (10 minutes). </DD> +<DT><B>-t <I>sec</B> </I></DT> +<DD>Set the timeout for waiting +for <I>services</I> to become down to <I>sec</I> seconds. <I>sec</I> must be between 2 and 6000. +Default is 600 (10 minutes). </DD> <DT><B>-k</B> </DT> -<DD>Kill. If the -timeout is reached before all <I>services</I> are down, tell the <B><I>supervise</B>(8)</I> -processes to send the <I>services</I> a KILL signal. </DD> +<DD>Kill. If the timeout is reached before all +<I>services</I> are down, tell the <B><I>supervise</B>(8)</I> processes to send the <I>services</I> +a KILL signal. </DD> <DT><B>-x</B> </DT> -<DD>Exit. Wait for the corresponding -<B><I>runsv</B>(8)</I> processes to exit instead for the <I>services</I> to be down. This option -should only be used by <B><I>runit</B>(8)</I> in stage 3 when <B><I>runsvdir</B>(8)</I> is already -stopped. <P> +<DD>Exit. Send each <I>service</I> the ``exit'' command additionally to +the ``down'' command, and wait for the corresponding <B><I>runsv</B>(8)</I> processes to +exit instead for the <I>services</I> to be down. This option should only be used +by <B><I>runit</B>(8)</I> in stage 3 when <B><I>runsvdir</B>(8)</I> is already stopped. <P> </DD> </DL> <H2><A NAME="sect4">Exit Codes</A></H2> -<B>svwaitdown</B> returns 0 as soon as all <I>services</I> are down. -<P> -If a <I>service</I> is usually controlled by <B><I>supervise</B>(8)</I>, but no <B><I>supervise</B>(8)</I> -process is currently running, <B>svwaitdown</B> treats this <I>service</I> as if it would -be down. <P> -For each <I>service</I> that causes an error while checking, <B>svwaitdown</B> -increases the exit code by one and exits non zero. The maximum is 100. <P> <B>svwaitdown</B> -returns 111 if the timeout <I>sec</I> was reached. +returns 0 as soon as all <I>services</I> are down. <P> +If a <I>service</I> is usually controlled +by <B><I>supervise</B>(8)</I>, but no <B><I>supervise</B>(8)</I> process is currently running, <B>svwaitdown</B> +treats this <I>service</I> as if it would be down. <P> +For each <I>service</I> that causes +an error while checking, <B>svwaitdown</B> increases the exit code by one and +exits non zero. The maximum is 100. <P> +<B>svwaitdown</B> returns 111 if the timeout +<I>sec</I> was reached. <H2><A NAME="sect5">See Also</A></H2> -<I>svwaitup(8)</I>, <I>runit(8)</I>, -<I>runit-init(8)</I>, <I>runsvdir(8)</I>, <I>runsv(8)</I>, <I>supervise(8)</I>, <I>svscan(8)</I> <P> +<I>svwaitdown(8)</I>, <I>runsv(8)</I>, <I>runsvctrl(8)</I>, <I>runsvstat(8)</I>, +<I>runsvdir(8)</I>, <I>runsvchdir(8)</I>, <I>runit(8)</I>, <I>runit-init(8)</I>, <I>supervise(8)</I>, <I>svscan(8)</I> +<P> <I>http://smarden.org/runit/</I><BR> <I>http://cr.yp.to/daemontools.html</I><BR> diff --git a/doc/svwaitup.8.html b/doc/svwaitup.8.html @@ -50,8 +50,8 @@ and exits non zero. The maximum is 100. <P> <B>svwaitup</B> returns 111 on error. <H2><A NAME="sect5">See Also</A></H2> -<I>svwaitdown(8)</I>, <I>runit(8)</I>, <I>runit-init(8)</I>, <I>runsvdir(8)</I>, <I>runsv(8)</I>, <I>supervise(8)</I>, -<I>svscan(8)</I> <P> +<I>svwaitdown(8)</I>, <I>runsv(8)</I>, <I>runsvctrl(8)</I>, <I>runsvstat(8)</I>, <I>runsvdir(8)</I>, <I>runsvchdir(8)</I>, +<I>runit(8)</I>, <I>runit-init(8)</I>, <I>supervise(8)</I>, <I>svscan(8)</I> <P> <I>http://smarden.org/runit/</I><BR> <I>http://cr.yp.to/daemontools.html</I><BR> diff --git a/doc/upgrade.html b/doc/upgrade.html @@ -10,6 +10,18 @@ <h1>runit - upgrading from previous versions</h1> <hr> +<h3>0.8.0 or 0.8.1 to 0.9.0</h3> +The <a href="svlogd.8.html">svlogd</a> program is new. +<i>svlogd</i> is a service logging daemon designed to be run from +<tt>log/run</tt> files, similar to +<a href="http://cr.yp.to/daemontools/multilog.html">multilog</a>. +The <i>runsvdir</i> program no longer propagates the TERM signal to the +<i>runsv</i> processes if it receives one, but exits immediately, and +<i>runsvdir</i> now supports handling of the HANGUP signal, see the +<a href="runsvdir.8.html">man page</a> for details. +<a href="svwaitdown.8.html">svwaitdown</a> has changed to additionally send +the <tt>down</tt> command to the <i>services</i> it works on, if not yet +done. <h3>0.7.x to 0.8.0 or 0.8.1</h3> With this version <i>runit</i>'s handling of its magic files has changed slightly for better support of read-only root filesystems. diff --git a/doc/utmpset.8.html b/doc/utmpset.8.html @@ -40,12 +40,12 @@ run scripts, e.g.: <P> <B>utmpset</B> returns 111 on error, 1 on wrong usage, 0 in all other cases. <H2><A NAME="sect5">See Also</A></H2> -<I>runit(8)</I>, <I>runit-init(8)</I>, <I>svwaitdown(8)</I>, -<I>svwaitup(8)</I> <P> -<I>http://smarden.org/runit/</I> +<I>runsv(8)</I>, <I>runsvctrl(8)</I>, <I>runsvstat(8)</I>, +<I>runsvdir(8)</I>, <I>runsvchdir(8)</I>, <I>runit(8)</I>, <I>runit-init(8)</I>, <I>getty(8)</I> <P> +<I>http://smarden.org/runit/</I> + <H2><A NAME="sect6">Author</A></H2> -Gerrit Pape &lt;pape@smarden.org&gt; -<P> +Gerrit Pape &lt;pape@smarden.org&gt; <P> <HR><P> <A NAME="toc"><B>Table of Contents</B></A><P>