chiark / gitweb /
REORG Delete everything that's not innduct or build system or changed for innduct
[inn-innduct.git] / HACKING
diff --git a/HACKING b/HACKING
deleted file mode 100644 (file)
index 87a76e3..0000000
--- a/HACKING
+++ /dev/null
@@ -1,708 +0,0 @@
-Hacking INN
-
-    This file is for people who are interested in making modifications to
-    INN.  Normal users can safely skip reading it.  It is intended primarily
-    as a guide, resource, and accumulation of tips for maintainers and
-    contributors, and secondarily as documentation of some of INN's
-    internals.
-
-    This is $Revision: 7736 $ dated $Date: 2006-04-15 04:52:06 +0200 (Sat,
-    15 Apr 2006) $.
-
-    First of all, if you plan on working on INN source, please start from
-    the current development tree.  There may be significant changes from the
-    previous full release, so starting from development sources will make it
-    considerably easier to integrate your work.  You can get nightly
-    snapshots of the current development source from ftp.isc.org in
-    /isc/inn/snapshots (the snapshots named inn-CURRENT-*.tar.gz), or you
-    can get the current CVS tree by using CVSup (see "Using CVSup").
-
-Configuring and Portability
-
-    All INN code should be written expecting ANSI C and POSIX.  There is no
-    need to attempt to support pre-ANSI compilers, and ANSI-only features
-    such as <stdarg.h>, string concatenation, #elif, and token pasting may
-    be used freely.  So far as possible, INN is written to attempt to be
-    portable to any system new enough that someone is likely to want to run
-    a news server on it, but whenever possible this portability should be
-    provided by checking for standard behavior in configure and supplying
-    replacements for standard functions that are missing.
-
-    When there is a conflict between ANSI C and C99, INN code should be
-    written expecting C99 and autoconf used to patch up the differences.
-
-    Try to avoid using #ifdef and the like in the middle of code as much as
-    possible.  Instead, try to isolate the necessary portability bits and
-    include them in libinn or at least in conditional macros separate from
-    the code.  Trying to read code littered with conditional compilation
-    directives is much more difficult.
-
-    The shell script configure at the top level of the source tree is
-    generated by autoconf from configure.in, and include/config.h.in is
-    generated by autoheader from configure.in and include/acconfig.h.  At
-    configure time, configure generates include/config.h and several other
-    files based on options it was given and what it discovers about the
-    target system.
-
-    All modifications to configure should instead be made to configure.in. 
-    Similarly, modifications to include/config.h.in should instead be made
-    to include/acconfig.h.  The autoconf manual (available using info
-    autoconf if you have autoconf and the GNU info utilities installed on
-    your system) is a valuable reference when making any modifications.
-
-    To regenerate configure, just run "autoconf".  To regenerate
-    include/config.h.in, run:
-
-        autoheader -l include
-
-    to tell it where to find acconfig.h.  Please don't include patches to
-    either configure or include/config.h.in when sending patches to INN;
-    instead, note in your patch that those files must be regenerated.
-
-    The generated files are checked into the CVS repository so that people
-    working on INN don't have to have autoconf on their system, and to make
-    packaging easier.
-
-    At the time of this writing, autoconf 2.13 is required.
-
-    The supporting files for autoconf are in the support subdirectory,
-    including the files config.guess and config.sub to determine the system
-    name and and ltmain.sh for libtool support.  The latter file comes from
-    the libtool distribution; the canonical version of the former two are
-    available from ftp.gnu.org in /gnu/config.  In addition, m4/libtool.m4
-    is just a copy of libtool.m4 from the libtool distribution.  (Using
-    libtool without using automake requires a few odd hacks.)  These files
-    used to be on a separate vendor branch so that we could make local
-    modifications, but local modifications have not been necessary for some
-    time.  Now, new versions can just be checked in like any other file
-    modifications.
-
-    INN should not compile with libtool by default, only when requested,
-    since otherwise normal compilations are quite slow.  (Using libtool is
-    not without some cost.)  Basic compilation with libtool works fine as of
-    this writing, with both static and shared compiles, but the dependencies
-    aren't quite right for make -j using libtool.
-
-Documentation
-
-    INN's documentation is currently somewhat in a state of flux.  The vast
-    majority is still in the form of man pages written directly in nroff. 
-    Some parts of the documentation have been rewritten in POD; that
-    documentation can be found in doc/pod.  The canonical source for README,
-    INSTALL, NEWS, doc/hook-perl, doc/hook-python, and this file are also in
-    POD.
-
-    If you're modifying some part of INN's documentation and see that it has
-    a POD version in doc/pod, it's preferred if you can make the
-    modifications to the POD source and then regenerate the derived files. 
-    For a quick introduction to POD, see the perlpod(1) man page on your
-    system (it should be installed if you have Perl installed).
-
-    When writing new documentation, write in whatever format you care to; if
-    necessary, we can always convert it to POD or whatever else we want to
-    use.  Having the documentation exist in *some* form is more important
-    than what language you write it in.  If you really don't have any
-    particular preference, there's a slight preference currently for POD.
-
-    If you use POD or regenerate POD documentation, please install something
-    close to the latest versions of the POD processing utilities to avoid
-    changes to the documentation depending on who generated it last.  You
-    can find the latest version on CPAN (ftp.perl.org or another mirror) in
-    modules/by-module/Pod.  You'll need PodParser (for versions of Perl
-    before 5.6.1; 5.6.1 and later come with a recent enough version) and the
-    latest version of podlators.  For versions of Perl earlier than 5.005,
-    you'll also need File::Spec in modules/by-module/File.
-
-    podlators 1.25 or later will build INN's documentation without
-    significant changes from the versions that are checked into the
-    repository.
-
-    There are Makefile rules in doc/pod/Makefile to build all of the
-    documentation whose master form is POD; if you add additional
-    documentation, please add a rule there as well.  Documentation should be
-    generated by cd'ing to doc/pod and typing "make file" where "file" is
-    the relative path to the documentation file.  This will get all of the
-    various flags right for pod2text or pod2man.
-
-Error Handling
-
-    INN has a set of generic error handling routines that should be used as
-    much as possible so that the same syntax can be used for reporting
-    errors everywhere in INN.  The four basic functions are warn, syswarn,
-    die, and sysdie; warn prints or logs a warning, and die does the same
-    and then exits the current program.  The sys* versions add a colon, a
-    space, and the value of strerror(errno) to the end of the message, and
-    should be used to report failing system calls.
-
-    All of the actual error reporting is done via error handlers, and a
-    program can register its own handlers in addition to or instead of the
-    default one.  The default error handler (error_log_stderr) prints to
-    stderr, prepending the value of error_program_name if it's set to
-    something other than NULL.  Three other error handlers are available,
-    error_log_syslog_crit, error_log_syslog_err, and
-    error_log_syslog_warning, which log the message to syslog at LOG_CRIT,
-    LOG_ERR, or LOG_WARNING priority, respectively.
-
-    There is a different set of error handlers for warn/syswarn and
-    die/sysdie.  To set them, make calls like:
-
-        warn_set_handlers(2, error_log_stderr, error_log_syslog_warning);
-        die_set_handlers(2, error_log_stderr, error_log_syslog_err);
-
-    The first argument is the number of handlers, and the remaining
-    arguments are pointers to functions taking an int (the length of the
-    formatted message), a const char * (the format), a va_list (the
-    arguments), and an int that's 0 if warn or die was called and equal to
-    the value of errno if syswarn or sysdie was called.  The length of the
-    formatted message is obtained by calling vsnprintf with the provided
-    format and arguments, and therefore is reliable to use as the size of a
-    buffer to malloc to hold the result of formatting the message provided
-    that vsnprintf is used to format it (warning: the system vsprintf may
-    produce more output under some circumstances, so always use vsnprintf).
-
-    The error handler can do anything it wishes; each error handler is
-    called in the sequence given.  Error handlers shouldn't call warn or die
-    unless great caution is taken to prevent infinite recursion.  Also be
-    aware that sysdie is called if malloc fails in xmalloc, so if the error
-    handler needs to allocate memory, it must not use xmalloc or a related
-    function to do so and it shouldn't call die to report failure.  The
-    default syslog handlers report memory allocation failure to stderr and
-    exit.
-
-    Finally, die and sysdie support an additional handler that's called
-    immediate before exiting, takes no arguments, and returns an int which
-    is used as the argument for exit.  It can do any necessary global
-    cleanup, call abort instead to generate a core dump or the like.
-
-    The advantage of using this system everywhere in INN is that library
-    code can use warn and die to report errors and each calling program can
-    set up the error handlers as appropriate to make sure the errors go to
-    the right place.  The default handler is fine for interactive programs;
-    for programs that run from interactive scripts, adding something like:
-
-        error_program_name = "program";
-
-    to the beginning of main (where program is the name of the program) will
-    make it easier to figure out which program the script calls is failing. 
-    For programs that may also be called non-interactively, like inndstart,
-    one may want to set up handlers like:
-
-        warn_set_handlers(2, error_log_stderr, error_log_syslog_warning);
-        die_set_handlers(2, error_log_stderr, error_log_syslog_err);
-
-    Finally, for daemons and other non-interactive programs, one may want to
-    do:
-
-        warn_set_handlers(1, error_log_syslog_warning);
-        die_set_handlers(1, error_log_syslog_err);
-
-    to report errors only via syslog.  (Note that if you use syslog error
-    handlers, the program should call openlog first thing to make sure they
-    are logged with the right facility.)
-
-    For historical reasons, error messages that are fatal to the news
-    subsystem are logged at the LOG_CRIT priority, and therefore die in innd
-    should use error_log_syslog_crit.
-
-Test Suite
-
-    The test suite for INN is located in the tests directory and is just
-    getting started.  The test suite consists of a set of programs listed in
-    tests/TESTS and the scaffolding in the runtests program.
-
-    Adding new tests is very straightforward and very flexible.  Just write
-    a program that tests some part of INN, put it in a directory under tests
-    named after the part of INN it's testing (all the tests so far are in
-    lib because they're testing libinn routines), and have it output first a
-    line containing the count of test cases in that file, and then for each
-    test a line saying "ok n" or "not ok n" where n is the test case number.
-    (If a test is skipped for some reason, such as a test of an optional
-    feature that wasn't compiled into INN, the test program should output
-    "ok n # skip".)  Add any rules necessary to build the test to
-    tests/Makefile (note that for simplicity it doesn't recurse into
-    subdirectories) and make sure it creates an executable ending in .t. 
-    Then add the name of the test to tests/TESTS, without the .t ending.
-
-    One naming convention:  to distinguish more easily between e.g. 
-    lib/error.c (the implementation) and tests/lib/error-t.c (the test
-    suite), we add -t to the end of the test file names.  So
-    tests/lib/error-t.c is the source that compiles into an executable
-    tests/lib/error.t which is run by putting a line in tests/TESTS of just
-    "lib/error".
-
-    Note that tests don't have to be written in C; in fact, lib/xmalloc.t is
-    just a shell script (that calls a supporting C program).  Tests can be
-    written in shell or Perl (but other languages should be avoided because
-    someone who wants to run the test suite may not have it) and just have
-    to follow the above output conventions.
-
-    Additions to the test suite, no matter how simple, are very welcome.
-
-Makefiles
-
-    All INN makefiles include Makefile.global at the top level, and only
-    that makefile is a configure substitution target.  This has the
-    disadvantage that configure's normal support for building in a tree
-    outside of the source tree doesn't work, but it has the significant
-    advantage of making configure run much faster and allowing one to run
-    make in any subdirectory and pick up all the definitions and settings
-    from the top level configuration.
-
-    All INN makefiles should also set $(top) to be the path to the top of
-    the build directory (usually relative).  This path is used to find
-    various programs like fixscript and libtool so that the same macros (set
-    in Makefile.global) can be used all over INN.
-
-    The format of INN's makefiles is mostly standardized; the best examples
-    of the format are probably frontends/Makefile and backends/Makefile, at
-    least for directories with lots of separate programs.  The ALL variable
-    holds all the files that should be generated, EXTRA those additional
-    files that were generated by configure, and SOURCES the C source files
-    for generating tag information.
-
-    There are a set of standard installation commands defined in make
-    variables by Makefile.global, and these should be used for all file
-    installations.  See the comment blocks in Makefile.global.in for
-    information on what commands are available and when they should be used.
-    There are also variables set for each of the installation directories
-    that INN uses, for use in building the list of installed paths to files.
-
-    Each subdirectory makefile should have the targets all (the default),
-    clean, clobber, install, tags, and profiled.  The tags target generates
-    vi tags files, and the profiled target generates a profiling version of
-    the programs (although this hasn't been tested much recently).  These
-    rules should be present and empty in those directories where they don't
-    apply.
-
-    Be sure to test compiling with both static and dynamic libraries and
-    make sure that all the libtool support works correctly.  All linking
-    steps, and the compile steps for all library source, should be done
-    through $(LIBTOOL) (which will be set to empty in Makefile.global if
-    libtool support isn't desired).
-
-Scripts
-
-    INN comes with and installs a large number of different scripts, both
-    Bourne shell and Perl, and also comes with support for Tcl scripts
-    (although it doesn't come with any).  Shell variables containing both
-    configure-time information and configuration information from inn.conf
-    are set by the innshellvars support libraries, so the only
-    system-specific configuration that should have to be done is fixing the
-    right path to the interpretor and adding a line to load the appropriate
-    innshellvars.
-
-    support/fixscript, built by configure, does this.  It takes a .in file
-    and generates the final script (removing the .in) by fixing the path to
-    the interpretor on the first line and replacing the second line,
-    whatever it is, with code to load the innshellvars appropriate for that
-    interpretor.  (If invoked with -i, it just fixes the interpretor path.)
-
-    Scripts should use innshellvars (via fixscript) to get the right path
-    and the right variables whenever possible, rather than having configure
-    substitute values in them.  Any values needed at run-time should instead
-    be available from all of the different innshellvars.
-
-    See the existing scripts for examples of how this is done.
-
-Include Files
-
-    Include files relevant to all of INN, or relevant to the two libraries
-    built as part of INN (the utility libinn library and the libstorage
-    library that contains all storage and overview functions) are found in
-    the include directory; other include files relevant only to a portion of
-    INN are found in the relevant directory.
-
-    Practically all INN source files will start with:
-
-        #include "config.h"
-        #include "clibrary.h"
-
-    The first picks up all defines generated by autoconf and is necessary
-    for types that may not be present on all systems (uid_t, pid_t, size_t,
-    int32_t, and the like).  It therefore should be included before any
-    other headers that use those types, as well as to get general
-    configuration information.
-
-    The second is portably equivalent to:
-
-        #include <sys/types.h>
-        #include <stdarg.h>
-        #include <stdio.h>
-        #include <stdlib.h>
-        #include <stddef.h>
-        #include <stdint.h>
-        #include <string.h>
-        #include <unistd.h>
-
-    except that it doesn't include headers that are missing on a given
-    system, replaces functions not found on the system with the INN
-    equivalents, provides macros that INN assumes are available but which
-    weren't found, and defines some additional portability things.  Even if
-    this is more headers than the source file actually needs, it's generally
-    better to just include clibrary.h rather than trying to duplicate the
-    autoconf-driven hackery that it does to do things portably.  The primary
-    exception is for source files in lib that only define a single function
-    and are used for portability; those may want to include only config.h so
-    that they can be easily used in other projects that use autoconf. 
-    config.h is a fairly standard header name for this purpose.
-
-    clibrary.h does also include config.h, but it's somewhat poor form to
-    rely on this; it's better to explicitly list the header dependencies for
-    the benefit of someone else reading the code.
-
-    There are portable wrappers around several header files that have known
-    portability traps or that need some fixing up on some platforms.  Look
-    in include/portable and familiarize yourself with them and use them
-    where appropriate.
-
-    Another frequently included header file is libinn.h, which among other
-    things defines xmalloc(), xrealloc(), xstrdup(), and xcalloc(), which
-    are checked versions of the standard memory allocation routines that
-    terminate the program if the memory allocation fails.  These should
-    generally always be used instead of the regular C versions.  libinn.h
-    also provides various other utility functions that are frequently used.
-
-    paths.h includes a wide variety of paths determined at configure time,
-    both default paths to various parts of INN and paths to programs.  Don't
-    just use the default paths, though, if they're also configurable in
-    inn.conf; instead, call ReadInnConf() and use the global innconf
-    structure.
-
-    Other files in include are interfaces to particular bits of INN library
-    functionality or are used for other purposes; see the comments in each
-    file.
-
-    Eventually, the header files will be separated into installed header
-    files and uninstalled header files; the latter are those headers that
-    are used only for compiling INN and aren't useful for users of INN's
-    libraries (such as clibrary.h).  All of the installed headers will live
-    in include/inn and be installed in a subdirectory named inn in the
-    configured include directory.  This conversion is still in progress.
-
-    When writing header files, remember that C reserves all identifiers
-    beginning with two underscores and all identifiers beginning with an
-    underscore and a capital letter for the use of the implementation; don't
-    use any identifiers with names like that.  Additionally, any identifier
-    beginning with an underscore and a lower-case letter is reserved in file
-    scope, which means that such identifiers can only be used by INN for the
-    name of structure members or function arguments in function prototypes.
-
-    Try to pay attention to the impact of a header file on the program
-    namespace, particularly for installed header files in include/inn.  All
-    symbols defined by a header file should ideally begin with INN_, inn_,
-    or some other unique prefix indicating the subsystem that symbol is part
-    of, to avoid accidental conflicts with symbols defined by the program
-    that uses that header file.
-
-Coding Style
-
-    INN has quite a variety of coding styles intermixed.  As with all
-    programs, it's preferrable when making minor modifications to keep the
-    coding style of the code you're modifying.  In INN, that will vary by
-    file.  (Over time we're trying to standardize on one coding style, so
-    changing the region you worked on to fit the general coding style is
-    also acceptable).
-
-    If you're writing a substantial new piece of code, the prevailing
-    "standard" INN coding style appears to be something like the following:
-
-    *  Write in regular ANSI C whenever possible.  Use the normal ANSI and
-       POSIX constructs and use autoconf or portability wrappers to fix
-       things up beforehand so that the code itself can read like regular
-       ANSI or POSIX code.  Code should be written so that it works as
-       expected on a modern platform and is fixed up with portability tricks
-       for older platforms, not the other way around.  You may assume an
-       ANSI C compiler.
-
-       Try to use const wherever appropriate.  Don't use register; modern
-       compilers will do as good of a job as you will in choosing what to
-       put into a register.  Don't bother with restrict (at least yet).
-
-    *  Use string handling functions that take counts for the size of the
-       buffer whenever possible.  This means using snprintf in preference to
-       sprintf and using strlcpy and strlcat in preference to strcpy and
-       strcat.  Also, use strlcpy and strlcat instead of strncpy and strncat
-       unless the behavior of the latter is specifically required, as it is
-       much easier to audit uses of the former than the latter.  (strlcpy is
-       like strncpy except that it always nul-terminates and doesn't fill
-       the rest of the buffer with nuls, making it more efficient.  strlcat
-       is like strncat except that it always nul-terminates and it takes the
-       total size of the buffer as its third argument rather than just the
-       amount of space left.)  All of these functions are guaranteed to be
-       available; there are replacements in lib for systems that don't have
-       them.
-
-    *  Avoid #ifdef and friends whenever possible.  Particularly avoid using
-       them in the middle of code blocks.  Try to hide all portability
-       preprocessor magic in header files or in portability code in lib. 
-       When something just has to be done two completely different ways
-       depending on the platform or compile options or the like, try to
-       abstract that functionality out into a generic function and provide
-       two separate implementations using #ifdef; then the main code can
-       just call that function.
-
-       If you do have to use preprocessor defines, note that if you always
-       define them to either 0 or 1 (never use #define without a second
-       argument), you can use the preprocessor define in a regular if
-       statement rather than using #if or #ifdef.  Make use of this instead
-       of #ifdef when possible, since that way the compiler will still
-       syntax-check the other branch for you and it makes it far easier to
-       convert the code to use a run-time check if necessary. 
-       (Unfortunately, this trick can't be used if one branch may call
-       functions unavailable on a particular platform.)
-
-    *  Avoid uses of fixed-width buffers except in performance-critical
-       code, as it's harder to be sure that such code is correct and it
-       tends to be less flexible later on.  If you need a reusable,
-       resizable memory buffer, one is provided in lib/buffer.c.
-
-    *  Avoid uses of static variables whenever possible, particularly in
-       libraries, because it interferes with making the code re-entrant down
-       the road and makes it harder to follow what's going on.  Similarly,
-       avoid using global variables whenever possible, and if they are
-       required, try to wrap them into structures that could later be
-       changed into arguments to the affected functions.
-
-    *  Roughly BSD style but with four-space indents.  This means no space
-       before the parens around function arguments, open brace on the same
-       line as if/while/for, and close and open brace on the same line as
-       else).
-
-    *  Introductory comments for functions or files are generally written
-       as:
-
-           /*
-           **  Introductory comment.
-           */
-
-       Other multiline comments in the source are generally written as:
-
-           /* This is a
-              multiline comment. */
-
-       Comments before functions saying what they do are nice to have.  In
-       general, the RCS/CVS Id tag is on the first line of each source file
-       since it's useful to know when a file was last modified.
-
-    *  Checks for NULL pointers are preferrably written out explicitly; in
-       other words, use:
-
-           if (p != NULL)
-
-       rather than:
-
-           if (p)
-
-       to make it clearer what the code is assuming.
-
-    *  It's better to always put the body of an if statement on a separate
-       line, even if it's only a single line.  In other words, write:
-
-           if (p != NULL)
-               return p;
-
-       and not:
-
-           if (p != NULL) return p;
-
-       This is in part for a practical reason:  some code coverage analysis
-       tools like purecov will count the second example above as a single
-       line and won't notice if the condition always evaluates the same way.
-
-    *  Plain structs make perfectly reasonable abstract data types; it's not
-       necessary to typedef the struct to something else.  Structs are
-       actually very useful for opaque data structures, since you can
-       predeclare them and then manipulate pointers to them without ever
-       having to know what the contents look like.  Please try to avoid
-       typedefs except for function pointers or other extremely confusing
-       data types, or for data types where we really gain some significant
-       data abstraction from hiding the underlying data type.  Also avoid
-       using the _t suffix for any type; all types ending in _t are reserved
-       by POSIX.  For typedefs of function pointer types, a suffix of _func
-       usually works.
-
-       This style point is currently widely violated inside of INN itself;
-       INN originally made extensive use of typedefs.
-
-    *  When noting something that should be improved later, add a comment
-       containing "FIXME:" so that one can easily grep for such comments.
-
-    INN's indentation style roughly corresponds to that produced by GNU
-    indent 2.2.6 with the following options:
-
-        -bad -bap -nsob -fca -lc78 -cd41 -cp1 -br -ce -cdw -cli0 -ss -npcs
-        -ncs -di1 -nbc -psl -brs -i4 -ci4 -lp -ts8 -nut -ip5 -lps -l78 -bbo
-        -hnl
-
-    Unfortunately, indent currently doesn't get everything right (it has
-    problems with spacing around struct pointer arguments in functions,
-    wants to put in a space between a dereference of a function pointer and
-    the arguments to the called function, misidentifies some macro calls as
-    being type declarations, and fouls up long but simple case statements). 
-    It would be excellent if someday we could just run all of INN's code
-    through indent routinely to enforce a consistant coding style, but
-    indent isn't quite ready for that.
-
-    For users of emacs cc-mode, use the "bsd" style but with:
-
-        (setq c-basic-offset 4)
-
-    Finally, if possible, please don't use tabs in source files, since they
-    can expand differently in different environments.  In particular, please
-    try not to use the mix of tabs and spaces that is the default in emacs. 
-    If you use emacs to edit INN code, you may want to put:
-
-        ; Use only spaces when indenting or centering, no tabs.
-        (setq-default indent-tabs-mode nil)
-
-    in your ~/.emacs file.
-
-    Note that this is only a rough guideline and the maintainers aren't
-    style nazis; we're more interested in your code contribution than in how
-    you write it.
-
-Using CVSup
-
-    If you want to get updated INN source more easily or more quickly than
-    by downloading nightly snapshots, or if you want to see the full CVS
-    history, you may want to use CVSup to download the source.  CVSup is a
-    client and server designed for replicating CVS repositories between
-    sites.
-
-    Unfortunately, CVSup is written in Modula-3, so getting a working binary
-    can be somewhat difficult.  Binaries are available in the *BSD ports
-    collection or (for a wide variety of different platforms) available from
-    <ftp://ftp.freebsd.org/pub/FreeBSD/CVSup/binaries/> and its mirrors. 
-    Alternately, you can get a compiler from <http://m3.polymtl.ca/m3/>
-    (this is more actively maintained than the DEC Modula-3 compiler) and
-    the source from <ftp://ftp.freebsd.org/pub/FreeBSD/CVSup/>.
-
-    After you have the CVSup client, you need to have space to download the
-    INN repository and space for CVSup to store its data files.  You also
-    need to write a configuration file (a supfile) for CVSup.  The following
-    supfile will download the latest versions from the mainline source:
-
-        *default host=inn-cvs.isc.org
-        *default base=<data-location>
-        *default prefix=<download-location>
-        *default release=cvs
-        *default tag=.
-        *default delete use-rel-suffix
-        inn
-
-    where <data-location> should be a directory where CVSup can put its data
-    files and <download-location> is where the downloaded source will go (it
-    will be put into a subdirectory named inn).  If you want to pull down
-    the entire CVS repository instead (warning: this is much larger than
-    just the latest versions of the source), delete the "*default tag=."
-    line.  The best way to download the CVS repository is to download it
-    into a portion of a locally-created CVS repository, so that then you can
-    perform standard CVS operations (like cvs log) against the downloaded
-    repository.  Creating your own local CVS repository is outside the scope
-    of this document.
-
-    Note that only multiplexed mode is supported (this mode should be the
-    default).
-
-    For more general information on using CVSup, see the FreeBSD page on it
-    at <http://www.freebsd.org/handbook/mirrors-cvsup.html>.
-
-Making a Release
-
-    This is a checklist that INN maintainers should go through when
-    preparing a new release of INN.
-
-    1.  If making a major release, branch the source tree and create a new
-        STABLE branch tag.  This branch will be used for minor releases
-        based on that major release and can be done a little while before
-        the .0 release of that major release.  At the same time as the
-        branch is cut, tag the trunk with a STABLE-<version>-branch marker
-        tag so that it's easy to refer to the trunk at the time of the
-        branch.
-
-    2.  Update doc/pod/news.pod and regenerate NEWS.  Be more detailed for a
-        minor release than for a major release.  For a major release, also
-        add information on how to upgrade from the last major release,
-        including anything special to be aware of.  (Minor releases
-        shouldn't require any special care when upgrading.)
-
-    3.  Make sure that support/config.sub and support/config.guess are the
-        latest versions (from <ftp://ftp.gnu.org/gnu/config/>).  See the
-        instructions in "Configuring and Portability" for details on how to
-        update these files.
-
-    4.  Make sure that samples/control.ctl is in sync with the master
-        version at <ftp://ftp.isc.org/pub/usenet/CONFIG/control.ctl>.
-
-    5.  Check out a copy of the release branch.  It's currently necessary to
-        run configure to generate Makefile.global.  Then run "make
-        check-manifest".  The only differences should be files that are
-        generated by configure; if there are any other differences, fix the
-        MANIFEST.
-
-    6.  Run "make release".  Note that you need to have a copy of svn2cl
-        from <http://ch.tudelft.nl/~arthur/svn2cl/> to do this; at least
-        version 0.7 is required.  Start the ChangeLog at the time of the
-        previous release.  (Eventually, the script will be smart enough to
-        do this for you.)
-
-    7.  Make the resulting tar file available for testing in a non-listable
-        directory on ftp.isc.org and announce its availability on
-        inn-workers.  Install it on at least one system and make sure that
-        system runs fine for at least a few days.  This is also a good time
-        to send out a draft of the release announcement to inn-workers for
-        proof-reading.
-
-    8.  Generate a diff between this release and the previous release if
-        feasible (always for minor releases, possibly not a good idea due to
-        the length of the diff for major releases).
-
-    9.  Move the release into the public area of the ftp site and update the
-        inn.tar.gz link.  Make an MD5 checksum of the release tarball and
-        put it on the ftp site as well, and update the inn.tar.gz.md5 link. 
-        Put the diff up on the ftp site as well.  Contact the ISC folks to
-        get the release PGP-signed.  Possibly move older releases off into
-        the OLD directory.
-
-    10. Announce the new release on inn-announce and in news.software.nntp.
-
-    11. Tag the checked-out tree that was used for generating the release
-        with a release tag (INN-<version>).
-
-    12. Bump the revision number in Makefile.global.in.
-
-References
-
-    Some additional references that may be hard to find and may be of use to
-    people working on INN:
-
-    <http://www.eyrie.org/~eagle/nntp/>
-        The home page for the IETF NNTP standardization effort, including
-        links to the IETF NNTP working group archives and copies of the
-        latest drafts of the new NNTP standard.  The old archived mailing
-        list traffic contains a lot of interesting discussion of why NNTP is
-        the way it is.
-
-    <http://www.imc.org/ietf-usefor/>
-        The archives for the USEFOR IETF working group, the working group
-        for the RFC 1036 replacement (the format of Usenet articles).  Also
-        contains a lot of references to other relevant work, such as the RFC
-        822 replacement work.
-
-    <http://www.mibsoftware.com/userkt/inn/dev/>
-        Forrest Cavalier provides several tools for following INN
-        development at this page and elsewhere in the Usenet RKT.  Under
-        here is a web-accessible checked-out copy of the current INN source
-        tree and pointers to how to use CVSup.
-
-    <http://www.sas.com/standards/large.file/>
-        The standards for large file support on Unix that are being
-        generally implemented by vendors.  INN sort of partially uses these,
-        but a good full audit of the code to check them should really be
-        done and there are occasional problems.
-
-    <http://v6web.litech.org/ipv6primer/>
-        A primer on IPv6 with pointers to the appropriate places for more
-        technical details as needed, useful when working on IPv6 support in
-        INN.
-