diff -crN ../ezmlm-0.53/BIN ./BIN *** ../ezmlm-0.53/BIN Sun Jun 29 22:11:54 1997 --- ./BIN Fri Dec 21 12:17:35 2001 *************** *** 1,11 **** --- 1,31 ---- d:::755::: + c:::755:/:ezmlm-accept: + c:::755:/:ezmlm-archive: + c:::755:/:ezmlm-issubn: + c:::755:/:ezmlm-glconf: c:::755:/:ezmlm-make: + c:::755:/:ezmlm-mktab: c:::755:/:ezmlm-manage: c:::755:/:ezmlm-send: + c:::755:/:ezmlm-request: c:::755:/:ezmlm-reject: c:::755:/:ezmlm-return: c:::755:/:ezmlm-warn: c:::755:/:ezmlm-weed: c:::755:/:ezmlm-list: + c:::755:/:ezmlm-clean: + c:::755:/:ezmlm-cron: + c:::755:/:ezmlm-limit: + c:::755:/:ezmlm-store: + c:::755:/:ezmlm-split: + c:::755:/:ezmlm-moderate: c:::755:/:ezmlm-sub: c:::755:/:ezmlm-unsub: + c:::644:/:ezmlmrc: + c:::644:/:ezmlmglrc: + c:::644:/:ezmlmsubrc: + c:::755:/:ezmlm-idx: + c:::755:/:ezmlm-check: + c:::755:/:ezmlm-gate: + c:::755:/:ezmlm-tstdig: + c:::755:/:ezmlm-get: diff -crN ../ezmlm-0.53/CHANGES.idx ./CHANGES.idx *** ../ezmlm-0.53/CHANGES.idx Wed Dec 31 18:00:00 1969 --- ./CHANGES.idx Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,842 ---- + $Id: CHANGES.idx,v 1.66 1999/12/24 04:33:03 lindberg Exp $ + $Name: ezmlm-idx-040 $ + + BUGS: -ezmlm-idx does not implement a full rfc822 parser. Comments can be + inserted to defeat the MIME parsing mechanism, such as: + Content-Type: (comment) test/plain + This type of comment, while legal, does not occur in normal messages. + Guiding info past ezmlm-idx MIME parsing is easier done by enclosing + a message within a message. The mechanism isn't intended as a + "secure" way of preventing e.g. "application/ms-tnef" from being + disseminated. + If you think this is a problem, E-mail lindberg@id.wustl.edu. + Mimeremove/reject work only at the outer MIME layer. + -ezmlm-request requires addresses to be user@host. While rfc822 + compliant, addresses like ``"the man" @ host'' are not accepted. + -ezmlm-cgi doesn't deal optimally with holes in the archive. + -ezmlm-cgi seems not to work with Chinese. The problem has been to + find someone willing/able to participate in debugging. + + TODO: + -ezmlm-cgi to run directly under tcpserver. + + Acknowledgements, some are missing. Please write lindberg@id.wustl.edu + if you're missing. + + Some ezmlmrc are not updated and won't work right: + cn_GB,cs,pl,ru,da,pt_BR,pt + + If you fix them, please send them to lindberg@id.wustl.edu for inclusion + in the next version. + + ezmlm-idx-0.40, 19991220 + ======================== + -Fixed bug in sub_mysql/issub.c that caused return of undef pointer for + non-subs. Security problem for sender checks, but not for moderation. Of + course only mysql version affected. + -Updated ezmlmrc translations. Thanks all who worked on this. + -added ezmlmrc.es. Thanks Vicent Mas/Francesc Alted/Sonia Lorente/Cyndy DePoy. + -added ezmlmrc.cn_GB. Thanks HG. + -ezmlm-weed: Groupwise garbage filter added. Thanks, SA. + -mysql: include files now don't have a dir. This is so that one can have + them in e.g. /usr/include. conf-sqlcc adjusted. + -Removed utils/. Not updated - add when done. + -Full PostgresSQL support. Thanks, MS. + -Corrected ordering of searchlog output for MySQL version to match default. + Thanks, MS. + -ezmlm-moderate/store: Fork /bin/sh ... instead of sh for people with unset + PATH. Thanks, TM. + -ezmlm-manage: rfc2369 headers added where possible also to admin + messages. Main finesse is that the WELCOME message has a custom + List-Unsubscribe header. -U/-S logic deconvoluted. -nN added. + -ezmlm-store: -B to send only header of message to moderate, rather than + the entire message. Used for send-only list with very large posts. + -ezmlm-reject: -b to reject messages with body or subject starting with + ``subscribe'' or ``unsubscribe''. + -support for List-ID (draft). Added to all list messages if DIR/listid is + present. The first line of that file is added after "List-ID: ". + -ezmlmrc: Added List-Subscribe header. Rewrite some texts, move some info + from bottom to help. Add ezmlm-archive (-i), add some switches to make + announcement lists easier. + -ezmlm-make: Modifed to make -I default since -i now controls ezmlm-archive + with all lists configured with ezmlm-get. Also, ezmlm-make will not overwrite + files tagged with #E in ezmlmrc when in edit mode (-+ or -e). This preserves + manual customization. The behavior can be overridden with -++ or -ee to + reset the list texts (old behavior). Added version check for ezmlmrc Tx, SA. + -ezmlm-archive and ezmlm-cgi added: Very easy to set up WWW access to list + archive. Support for various charsets incl iso-2022-*. For Russian, + one would need to do substitutions when making entries in archive/n/index. + This is not supported yet, so summary view entries may be incorrect if + the messages use Russian text in a charset different from the one the list + uses. Probably doesn't work for Chinese - lack of willing/able testers. + -qmail-qmqp support via idx.h and DIR/qmqpservers. If your bandwidth is + limited, look at this (see ezmlm-send(1)/ezmlm-get(1)/ezmlm(5)). If you + have large lists, sublist them locally and specify different QMQP servers + for each sublist via DIR/qmqpservers. Added qmail-qmqpc.tar.gz patch to + allow specifying QMQP server on command line. With this, DIR/qmqpservers can + be used to specify different servers for different lists for busy servers. + -ezmlm-gate: added -q file. Each line in "file" is processed as per + dot-qmail(5). 111 => temp_err, 99 => post, 100 => moderate, 0 => check sub. + Any other exit code will result in a bounce. + NOTE: This changes the behavior of ezmlm-gate used with only one DIR + argument (not used in any std listsetup for previous versions). Before, + this tested for subscriber status, now messages will + be moderated. This use is not set up by any ezmlm-make option and should + be _extremely_ rate. To obtain the old behavior, simply specify the + list directory twice. + -Made conf-sqlcc and conf-sqlld to support both phases of the build. Adjusted + mysql includes to not assume they're in a "mysql" subdir. + + + ezmlm-idx-0.324, 19990905 (PostgresSQL) + ======================================= + -Minor typo in ezmlmrc.fr fixed. + -Added [partial] PostgresSQL interface by Magnus Stalaker. See INSTALL.idx. + -Added ezmlm-store Cc: docs mistakenly missed in 0.323. + -Fixed problem with "it/itall" target (Thanks MW). + + + ezmlm-idx-0.323, 19990815 (bug fix) + =================================== + -ezmlm-store: Cc: list-accept-subscribe remote admin conf added to mod + requests. For lists using ezmlm-gate, this allows adding poster as allowed + alias. Thanks RVI for suggesting. + -Added qmail-verh.tar.gz (0.03). This is the 0.02 qmail patch and a patch + to change ezmlmrc to take advantage of it. See docs inside. + -conf-sqlcc/conf-sqlld instead of conf-sql to allow include file additions + (conf-cc) and libraries (conf-ld) for RDBMS interfaces. + -Added ezmlmrc.id and ezmlmrc.it. Thanks APN and RDC. + -ezmlm-manage: Mime boundary was missing for subscribe notifications for + moderated lists using QP/base64 encoding. Thanks TF. + -ezmlm-get: Logic to prevent digest triggering from list-@host. + -ezmlm-get: Digest parts have file names list_msgnum.txt instead of + list.msgnum to work around a MS Outlook bug. Thanks, MH. + -ezmlm-request: Support for multipart MIME when used as a majordomo emulator. + Thanks, Johannes Ehrfeldt for reporting the bug. + -ezmlm-send: trailer was added to mutipart/non-alternative. Problems with + multipart/signed. Now, trailer for multipart is added only to mixed, + digest, and parallel. Thanks BPF. + -ezmlm-reject.1: typo. + -ezmlm-test.sh multiple minor changes to work on more platforms. Still, if + it doesn't work, the problem is most likely here, and not in ezmlm(idx) + itself. Thanks RM DM and others. + -ezmlm-moderate: added missing newline at beginning of MIME reject message. + Thanks, XXX. + -idx.h fixed ALT_XX alternative command names which erroneously started '-'. + Looks bad, but was of no consequence. + + + ezmlm-idx-0.322, 19990505 (bug fix) + =================================== + -ezmlmrc.*: Added x-confirm-reading-to and x-pmrqc. Thanks JK. + -ezmlmrc.ru: Added Russian version contributed by RVI. Thanks. + -ezmlmrc: Czech version of ezmlmrc is ezmlmrc.cz. Should be ezmlmrc.cs. Fixed. + -searchlog.c: Made the MySQL version also match in address field to make + the records returned the same as for std version. + -ezmlm-store: -allow-subscribe confirm address in Cc: header to make it easier + for the moderator to add the poster to the allow database. (Thanks, RVI.) + -ezmlm-manage: -query from remote admin for subscriber failed due to use of + static storage within issub(). Fixed. + -ezmlm-manage: Made remote admin unsub failure return error. For sub it's + important to be silent for multi-moderator setups, but since unsub is never + moderated, it's ok to return negative feedback, since it may be needed by + remote admins. As a consequence it was trivial to add -Q[Q] not quiet to + provide [un]subscribe feedback to the owner. + -ezmlm-send/reject: "boundary" in Content-type can be delimited by ';'. + Without, some messages could be erroneously rejected when using mimeremove. + New error text added to errtxt.h. + + + ezmlm-idx-0.321, 19990322 (bug fix) + =================================== + -added ezmlm-limit to limit list traffic. As this is a bug fix release, + ezmlm-limit should be considered experimental and is not built/installed + by default. (Thanks, TM for suggesting.) + -subscribe.c: in some cases a ``T'' was incorrectly added before the address + in the DIR/Log subscription log. Corrected (Thanks, PH.). + -ezmlm-test: reordered some tests to avoid timing problems on some + platforms. Tested hostname output since it may return a non-FQDN host name. + Added tests for most of the fixed bugs. + -ezmlm-tstdig: improved DEFAULT logic. Failed with existing incorrect inlocal + in virtual domains. + -ezmlm-manage bug: deny access control fixed. + -ezmlm-request/ezmlm-tstdig: qmail>=1.02 doesn't set DEFAULT when there is + nothing matching. Unable to detect qmail version here. Changed logic to + always be correct with qmail>=1.02 and virtually always for earlier versions. + Missing inlocal is taken as meaning qmail>=1.02. + -ezmlm-request: mdomo emulator: Corrected address listed for WHICH. + -ezmlm-request: Silent exit on bounces (NULL sender). Fake SENDER spam to the + majordomo address otherwise causes double bounces to postmaster who has + better things to do. + -ezmlmrc: corrected missing ezmlm-return in bouncer for normal (^6W) lists. + (Thanks Matt McGlynn.) + -opensql.c: psql needs to be destroyed for ezmlm-reqest WHICH which may open + connections to several servers. + -searchlog.c: made inbuf/ssin static. Was incorrect and generated linker + warning on some systems, but had no functional consequences. Thanks, SOH. + -ezmlm-test: converted "export ENVIRON=value" to "ENVIRON=value; export ENVIRON" + to work with Solaris sh. Also, moved final ezmlm-warn section to the end + to avoid timing issue on some systems. "ps" test for qmail made non-fatal, + as differing options on different ps make it more likely that ps use is + the problem than that qmail is not running. (Thanks, SOH.) + + + ezmlm-idx-0.32, 19990222 + ======================== + -updated ezmlm-test. It tests most functions, and for important new features + or bugs discovered we'll add new tests in future. Thanks ME for patient + testing, suggestions, and "de-bashing". + -added a rfc2369 headers for list-help, list-post, and list-unsubscribe. + It takes little space, and may promote support in MUAs. + -ezmlm-get: list-get.9999999_x now always returns at least HISTGET messages + (default 30) provided that "9999999" is larger that the latest message number. + This allows embedding of an address for new subscribers to get at least what + has transpired since the latest digest and usually 30 messages before that, + to quickly see what's going on. + -ezmlm-get: list-get for non-digested lists now returns the latest HISTGET + (default 30) messages instead of the latest message. To get the latest message, + mail list-get-9999999, where "9999999" is larger than the latest message + number. + -Added ezmlm-manage/get -B switch to suppress text/bottom + request addition to + ezmlm-manage messages (except of course -help). + -ezmlm-send uses copy() for trailer and headeradd. <#h#>, <#l#>, and <#n#> + in these texts are substituted with outhost, outlocal, and message number, + respectively. Now you can add ``To receive this thread, mail + <#l#>-get.<#n#>@<#h#>'' to the trailer. Removed dir/sequence feature, since + this can now be done with headeradd. copy() modified to suppress blank + lines when copying headers. extern decl in copy.h fixed. A consequence + is that headeradd isn't added to the archive copy which is good. <#n#> + for ezmlm-get is the latest message processed, except for the digest, where + it is the first message in the digest (which is also the digest msg #). + -Added ezmlm-split (previously separate). Modified to use the same split + mechanisms as the SQL routines. -D switch to support easier reorganisation, + with extensive docs in man page. Interconversion between ezmlm-split and SQL + use is now relatively easy. + -Reorganized files. The subscriber db sources are now in sub_std/ for the + standard ezmlm db, sub_mysql/ for the mysql version. Normally, there are + symlinks to the std version. ``make mysql'' changes the symlinks to sub_mysql + and ``make std'' can be used to set them back. + -Replaced ezmlm-glmake with ``ezmlm-make -Cezmlmglrc''. See ezmlmglrc.5. + -Added status.pl for status monitoring of ``list trees'' via httpd. In utils/. + -Added feedback logging support with ezmlm-receipt and ezmlm-make -w. ezmlm-send + and ezmlm-get for the SQL version log info to the db. + -Added support for setting up a minimal (SQL-enabled) sublist: + ezmlm-make -Cezmlmsubrc. See ezmlmsubrc.5. + -Added ezmlm-make -w to remove ezmlm-warn invocation and if used with -6 to + configure ezmlm-receipt in place of ezmlm-return. Used for main list in + SQL-enabled list clusters for feedback and bounce logging. + -Added MySQL support. ezmlm-make -6. This is a _major_ change and makes it + trivial to do sublisting and dynamically redistribute load. see ezmlm.5. + -Modified ezmlm-return to add -dD switches. Previous design decision to have + ezmlm-return autodetect digest vs normal bounces cause problems when + sublisting a digest list. -dD force non-digest vs digest function and we'll + set uyp new lists with that, but keep autodetection for compatibility with + existing lists. ezmlmrc files modified appropriately. German version + updated and improved by Frank Tegtmeyer. Thanks! + -Modified ezmlm-warn/return bounce handling. DIR/bounce now has a ``h'' + subdir, further subdivided a-p for storage of h... files, where the first + character of the hash is used for the subdir, and a ``d'' subdir, containing + subdirs, each holding bounce (d... files) for a 10,000 s interval. This way, + only ``ripe'' bounce files are processed by ezmlm-warn. Also, ``lastd'' to + prevent unnecessary reparsing of bounces and ``lasth'' to keep track for + ``h'' subdir cleaning of remaining files older than 3x time out. + -Modified all programs to use DEFAULT if available. With qmail>=1.02, this + allows one to ignore inhost/inlocal so that special adjustment for virtual + domain lists is no longer required. Works the old way with qmail<1.02. + -DIR/extra and DIR/blacklist for extra allowed SENDERs and SENDER blacklisting + have been renamed DIR/allow and DIR/deny. This is used sparingly and the old + nomenclature was confusing. ``mkdir DIR/allow; mv DIR/extra/* DIR/allow'' + and the corresponding move for DIR/deny will take care of it. + -Extended the remote admin -log command. Now, -log.xxx will return only + Log lines matching 'xxx'. '.' matches '.' and '_' matches any character. + -The ``From:'' line of subscribers confirmation message will be logged to + ``Log''. This allows the administrator to use the Log to by name locate the + subscription address of a user. + + + ezmlm-idx-0.316, 19990815 (bug fixes only) + ========================================== + -Migrated back fixes for 0.322 -> 0.323 that are applicable to 0.31x: + -ezmlm-get: Made filename extension constant for digest parts to work around + Outlook bug. + -ezmlm-manage: Mime boundary added for mod-sub-ok message when QP/base64 is + used. + -ezmlm-manage.1: Typo. + -ezmlm-moderate: Missing newline for non-MIME reject message. + -ezmlm-request: Support by global interface of multipart/alternative messages. + -ezmlm-send: Trailer only for some types of multipart messages. + -ezmlm-reject.1: Typo. + + + ezmlm-idx-0.315, 19990505 (bug fixes only) + ========================================== + -Bug fixes fed back from up to 0.322. + -ezmlm-send/reject: "boundary" in Content-type can be delimited by ';'. + Without, some messages could be erroneously rejected when using mimeremove. + New error text added to errtxt.h. + -ezmlm-manage: -query from remote admin for subscriber failed due to use of + static storage within issub(). Fixed. + -ezmlm-manage bug: deny access control fixed. + + + ezmlm-idx-0.314, 19990216 (bug fixes only) + ========================================== + -Added ezmlm-test, a script that tests [most] ezmlm + idx program functions. + -added ezmlmrc.cz (Thanks, Jan Kasprzak). + -ezmlm-make -e failed if DIR/config didn't exist. Fixed. (Thanks, SOH.) + -ezmlm-make man page bug for virtual domain (Thanks, XX). + -ezmlm-get segfaulted when run from the command line with LOCAL undefined. + Fixed. (Thanks, ME.) + + ezmlm-idx-0.313, 19981121 (bug fixes almost only) + ================================================= + -ezmlm-get returns 0 for success in editor and command line use, rather than + 99. No impact on current lists, but makes more sense. + -ezmlm-warn tests >= for timeout rather than >. No impact other than easier + use with future test script. + -ezmlm-manage -get function was broken - fixed. Needed for backwards compat + with ezmlm-0.53. (Thanks, KS.) + -Reorganized INSTALL.idx, UPGRADE.idx, README.idx and introduced FILES.idx + to simplify. Made corrections to FAQ.idx, but no additions. + -ezmlm-send no longer adds trailer to multipart/mixed messages. Also, multipart + messages consisting of only "mimeremove" parts will be bounced. (Thanks, BE.) + The trailer is suppressed for base64-encoded messages. In both cases, + trailer addition might corrupt the message. Default charset is added if none + specified (was left empty). + -The US version of ezmlmrc is now ``ezmlmrc.en_US'' and ``make'' by default + copies it to ezmlmrc. Added support to Makefile and docs to copy in other + versions via e.g. ``make jp''. Target ezmlmrc is there to not overwrite with + ezmlmrc.en_US on ``make setup''. + -Changed ezmlmrc so that headeradd/headerremove/sub-ok/mod-sub are not rewritten + when editing lists. (Thanks, GS.) + -In ezmlm-idx and ezmlm-send, made dirs without trailing slash (mkdir with + it bombs on Ultrix). (Thanks, BW.) + -added check for NULL sender is zapnosub() in ezmlm-get. Fixed NULL pointer + use when the command is -dig- and no digest code was given on the command + line. + -added 'x' to FORMATS in idx.h. (Thanks, MMcL.) + -ezmlm-reject changed to honor subject continuation lines. Eudora likes to + break right after "Subject:" which caused rejection for empty subject. + (Thanks, SOH.) Same for To:. Also deals with quoted content types. Error + message now always states the offending MIME type. + -Added "(null)", "(none)", and "(no subject)" to rejected subjects. What are + these MUA authors thinking?? + -ezmlm-reject bug fixed to reject commands in subjects. (Thanks, JH.) + -ezmlm-request bug fixed to allow correct processing of complete command + addresses in the subject, even for virtual domains. (Thanks, EC.) + -ezmlmrc.de corrected (Thanks, FT). + -Made local check in ezmlm-tstdig case-insensitive (Thanks, Rick Myers). + -Fixed ezmlm-glconf to work with 'sh', not only 'bash' (missing ';' before '}') + (Thanks, MS). + -ezmlm-manage: text/bottom added also when moderated subscription is + completed (Thanks, SOH). Added -log command to ezmlm-manage. Allows remote + admins to retrieve Log if -l switch is set. Added -log into to mod-help via + ezmlmrc. + -Made character defines sun4 cc compliant in decode{Q|B}.c and unfoldHDR.c. + -Added support for "Sv:" and "Rv:" reply indicators (Nordic, Spanish). + -Improved/expanded ezmlm-check. + -Added -+ switch to ezmlm-make. Makes letter switches sticky (not -cC). + <#F#> is all letter switches, not only the ones set. (Thanks, SOH). Also, + added virtual domain info to ezmlm-make.1. + + ezmlm-idx-0.312, 19980805 (bug fixes only and support scripts added) + ==================================================================== + -Fixed declaration of char16table[] in decodeQ.c to get clean mips64 compile + (Thanks, MF). + -Fixed ezmlm-request so that <#l#> and <#h#> are substituted correctly. + -Added ezmlm-glmake to create a global list setup. Left ezdomo.tar.gz since that + is what's documented in the FAQ. + -Fixed inconsistencies/errors in the ezdomo.tar.gz example files (Thanks, PN). + -Changed ezmlm-return.c to understand qmail preVERP error messages even if + qmail is patched to use MIME error messages. + -Added ezmlm-glconf and man page to the package. The program creates a config + file for the "majordomo-style" interface from a user's existing lists. + -Updated ezmlmrc and translations to not overwrite text/faq|info when editing + the list and add a note on -faq/-info to text/bottom and on -list/-edit + to text/mod-help. Thanks to the "usual suspects" for the translations! + -Corrected small bug in ezmlmrc.de and ezmlmrc.da. + -Corrected small bug in ezmlm-check -s switch handling (Thanks, DS). + -Fixed bug in unfoldHDR.c affecting handling of subject prefixes without + message number (Thanks, LL). + + ezmlm-idx-0.311, 19980701 (bug fix only) + ======================================== + -Restored the mistakenly amputated ezmlmrc (English only, others were ok). + -Fixed ezmlm-gate to tolerate unset $SENDER (Thanks, AP). + + ezmlm-idx-0.31, 19980630 + ======================== + -Added ezmlm-manage -m switch for moderated unsubscription, pre request. + (Thanks, FT). + -made cookie for accept/reject the same: ezmlm-moderate/ezmlm-store. + -ezmlmrc.da (Thanks, TF). Other ezmlmrc updated (Thanks: see README.idx). + -copy.c modified to allow NUL, multiple tags per line, and <#h#> => outhost. + (Thanks, TM). + -ezmlm-manage sends replies to "-help" from "list-return-@". This will break + all autoresponder loops for admin messages after 1 round. Otherwise, + ezmlm-warn and a broken responder can start an endless manage<->responder + exchange. (Thanks, MM.) + -Simplified tosubs(). Slightly less efficient with qmail, but avoids a lot + of problems. + -Added umask(022) to ezmlm-unsub.c and ezmlm-sub.c, in case they + are the ones to create dir/lock. + -ezmlm-moderate and ezmlm-gate changed to pass on switches for exec'd + programs. ezmlm-moderate sets sender for ezmlm-send so that -C switch + works also for moderated lists. + -ezmlm-accept now autoconfigured with ezmlm bin path and installed. + -ezmlm-manage allows remote access to the ``extra'' db (-allow-subscribe) + with same restrictions as for the main list. Access to the ``blacklist'' + db for remote admins only (-deny-subscribe). + -ezmlmrc changed to skip ezmlm-reject in editor of sublists. + -ezmlm-reject now rejects messages that do not contain the list + address in To:/Cc: (Thanks, DJB). ezmlmrc modified, since it requires + the ezmlm-reject line to have the list dir on the command line. Not full + rfc822 parser (see BUGS in ezmlm-reject.1!). + -made missing file in copy.c a permanent error. This way, it's discovered + sooner, as the list owner may not have access to maillog. + -docs updates, including adding terminal '/' to directories to make them + clearly distinct from files. + -Safer storage of return-path by ezmlm-store. + -ezmlm-send now adds a "Return-Path:" header to the archive copy. This way, + listowners without maillog access can get all the info (together with + "received:" and "delivered-to: lines). + -ezmlm-send -R switch to remove "Received:" headers that cause bounces to users + (due to too low sendmail hopcount) that can subscribe and are reached by + probes just fine. "received:" headers still go to the archive (Thanks, TM). + -Fixed minor bug in "reply-indicator" trimming (unfoldHDR.c). + -Make default behavior of -get command to send the messages that have arrived + since the last digest (up to MAXGET) if there has ever been a digest (only + last message otherwise). + -"prefix" number substitution changed to LAST '#'. Support for rfc2047 encoded + prefix. With iso-2022-* this will work only if characters after '#' are + ascii only, due to the removal of redundant ESC sequences from subjects before + comparison, and the need for any line to end in ascii. Improved robustness + of unfoldHDR.c (could be crashed with some illegal encoded words). + -Make reject messages come From: list-owner@listhost in ezmlm-moderate. A + "Reply-To: address" is added if "-t address" is on the command + line (Thanks, YG). + -ezmlm-get digesting now orders headers only for rfc1153 (mandated), otherwise + displays them as they come. The default headers included are the same, but + this can be overridden with dir/digheaders containing a list of the headers + to include. + -ezmlm-request takes the first line starting with a letter and interprets it + as a command, if the subject is empty or does not start with a letter. + Only one line is interpreted. + -ezmlm-request if used with "-f config" interprets "config" as a config file + of lists and list info. When used with this switch, it ignores the subject and + expects a command on the first body line. This is to service e.g. the + majordomo@host address. See man page. + -ezmlm-request understands a number of command synonyms to make it easier for + users familiar to other MLMs. These are just translated into regular ezmlm + commands for use with the list. + -ezmlm-manage services -faq, -info, and -query commands (see man page). Stubs + for faq/info added to ezmlmrc and to edit-list via ezmlmrc. + -ezmlm-check fixes for grep not understanding '-q' and a ezmlm-check -S switch + to avoid subscriber listing (Thanks, TEE). + + ezmlm-idx-0.302, 19980617 (bug fixes only) + ========================================== + -Removed args from copy_insertsubject() call in ezmlm-send.c + -made ezmlm-make enforce absolute "dot". + -Fixed MIME newline bug in ezmlm-moderate/store/clean. (Thanks, JS). + -Fixed missing arg in postmsg() call from previous fix (Thanks, MF). + + ezmlm-idx-0.301, 19980508 (bug fixes only) + ========================================== + -Digest format is multipart/digest again. The new format MIXED/'x' is + identical, except that it is multipart/mixed. The former works well for + most MUA. The latter is better for Pine when ezmlm texts are content- + transfer-encoded. + -RFC1153 format ignores content-transfer-encoding. This works fine with + us-ascii. For non-us-ascii it works if the mail path is 8-bit clean. RFC1153 + is really a us-ascii format, since the messages are dependent on the + encoding of the main message. This way is as good as it can get. + -Added many content-types to mimeremove in ezmlmrc (Thanks, SP). + -Removed most of the -x stuff in ezmlmrc. Now, -x only adds MIME content-type + stripping (extensive) and limits message body size to 2-40000 bytes. If you + want "Reply-To:" munging, edit ezmlmrc. The "mailto:" stuff was bad, and + the references to list-owner@host for intractable problems are now standard. + -Changed ezmlmrc extensions to iso 639: SV - Swedish. + -Added ezmlmrc files for DE, PL (Thanks, FT, SP). + -Fixed ezmlm-get: -index reply lacked MIME end boundary (Thanks, KI). + -Fixed bug in ezmlm-get: outformat error when using digest trigger messages + in dir/editor. (Thanks YG). + -Fixed bug in ezmlm-clean: cp_setlocal wasn't called. + -Improved ezmlmrc files so that digest links and dirs are not created for + on-digested lists. Decreases number of .qmail files. + -Fixed bug in ezmlm-get: Headers from trigger message are no longer copied + to digest (but are still copied to -index/-get/-thread reply). (Thanks STH.) + -Fixed ezmlm-0.53 bug in ezmlm-return. The "d..." file was the same for all + addresses of a pre-VERP bounce, resulting in only the first one being + processed correctly (sent to DJB). + -Changed ezmlm-get to include dir/headeradd headers for digest. (Thanks PH.) + -Changed ezmlm-get to send digest "To: list@list" from "list-digest@host". + This way, the list address is one of the "reply-to-all" addresses, just + as for list messages. (Thanks PH.) + -Corrected ezmlmrc: in some places "d" was used for "n" switch resuling in + missing dir/text files for editing if editing was enabled and digest + were not. (Thanks JS.) + -Corrected ezmlmrc/se/jp to add terminal ';' to list in ezmlm-issubn + lines. Caused trouble with strict /bin/sh as on FreeBSD. (Thanks STH.) + -Corrected ezmlm-make man page to show that "digestcode" is optional. + + + ezmlm-idx-0.30, 19980325 + ======================== + -Fixed bug in continuation line handling for digest. In some circumstances, + continuations ended up with the wrong header. (Thanks SA). + -Changed digest format to multipart/mixed as pine has trouble with an + encoded text/plain part first in multipart/digest (although this is + rfc2046-ok). (Thanks SA). + -Updated FAQ, *.idx, and man pages for new functionality. + -Changed subdb.a folding qputsubs.c into putsubs.c and passing a pointer + to the write function. Better and necessary to allow QP/base64 output by + the ezmlm-manage -list command. + -Added ezmlm-warn -t switch to modify bounce time-out as well as moved the + compile-time default to idx.h (Thanks Mark Delany). + -Added note on "make clean" to INSTALL/UPGRADE.idx (Thanks Peter Hunter). + -Added support for message numbers in the prefix. This violates mail standards, + but is very popular in Japan. (Thanks KI for inspiring this.) ezmlm-idx-0.30 + does prefix differently, so that it modifies the subject as little as possible + for compliance with IETF recs and rfcs. ezmlm-idx-0.23 when prefix was used, + used a processed and unfolded subject, which was less correct, and could cause + problems with very long subjects. + -Changed MAXEDIT to 10k. This should accomodate all reasonable dir/text files. + A limit _is_ required (see FAQ: SECURITY). + -Made any _user-generated_ commands case-insensitive throughout (ezmlm-get, + -manage, -request). Note: ezmlm-generated ones, such as "list-accept" are + still case-sensitive. (Thanks GS for reminding me.) + -Separated ezmlm-make switches for SENDER checks. -u for posts, -g for archive. + Also changed names of other switches. -n for text file editing, -d for + digest list. ezmlm-manage edit is now -eE, but the old -dD is still accepted. + -Modified most programs to service requests for both list and digest list, + depending on LOCAL. For ezmlm-warn a command line -d switch is used to + process digest bounces. Created copy.h/c as a general routine that + does encoding and on-the-fly substitution of <#l#> to the name of the list + being serviced. ezmlmrc modified to set up list appropriately and create + a digest list for switch -d. The very rudimentary digest list is always + called 'list-digest' for the list 'list' and lives as a subscriber and a + bounce dir in dir/digest. log.c modified to take the dir as an argument. + copy.c introduced. Can deal with encoding and substitution for <#l#>, + <#B#>, <#R#>. + -Made dir/extra standard. All subscriber restriction (ezmlm-make -u) is + to accept addresses that are subscribers of either list or in dir/extra. + -Added REMOVE as a forbidden subject in ezmlm-reject. + -Added support for rejection based on message and message part MIME + Content-type. ezmlm-send can from composite MIME messages filter out + body parts based on content-type. Trailers are added as MIME parts + to composite MIME messages and in the Content-transfer-encoding of the + message for single body messages. + -min and max message size restrictions moved from ezmlm-send/store to + ezmlm-reject. + -Added support for optional base64 and quoted-printable encoding of trailer + and all outgoing ezmlm messages. The same encodings are accepted as input + for moderator comments and edited text files. + -Added hash for threading due to inconsistent/incorrect handling of LWSP + by iso-2022-jp MUAs. Now threading works for rfc2047 encoded subjects. + -Added support for rfc2047 encoded From: lines and continuation for From: + lines. + -Moved relevant parts of idxsub.c into ezmlm-send and ezmlm-idx. + -Added MIME en/decoding routines to support rfc2047 encoded subject lines. + Also, added code to remove redundant ESC sequences when unfolding headers + in iso-2022-jp* and iso-2022-cn* and iso-2022-kr. Only iso-2022-jp has been + tested. + -Added ezmlm-idx -d switch to use date from 'Date:' header instead of the + qmail received line. For old archives processed through ezmlm-send to + re-archive. Remove (GMT), (PST), and DOW, and make 2-digit years xx where + xx >= 70 19xx and others 20xx. + + + ezmlm-idx-0.231, 19980302 + ========================= + -ezmlm-check.sh elsif -> elif. + -Allowed ezmlm-make -a switch (was missing; Thanks MF). + -Removed subject truncation for index: for prefixed lists it is used and + rfc2047-encoded subjects are often longer. + -Fixed idxsub.c bug (subject continuation lines skipped by ezmlm-idx if + 'Subject:' is after 'From:'). (Thanks, SOH.) + + + ezmlm-idx-0.23, 19980120 + ======================== + -ezmlm-check fixed to remove bash-specific pattern matching. (Thanks, VV). + -ezmlm-both now makes completely functional list & digest list with digest + creation from dir/editor. If address is given, it becomes the owner, remote + admin, and a subscriber of both lists. By default, the remote admin is allowed + to get a subscriber list. + -updated ezmlmrc.fr. + -ezmlm commands now have alternates defined via idx.h, allowing aliases, rather + than replacement of command names in non-English domain. + -Modified ezmlm-tstdig to run easily from within dir/editor and dir/manager. + Had to add dir/tstdig timestamp when run from dir/editor, to prevent triggering + a new digest while one is being made. Now no new request is issued within one + hour after the last one. + Changed ezmlmrc to make this default for digested lists. + -New switches for ezmlm-make. + -Added ezmlm-get -f and -t switches for easier use on the command line and + in dir/editor. Made it "context-sensitive" by testing LOCAL. + -Via ezmlmrc added -q switch for processing commands to list-request, + a -3 hrs switch to configure ezmlm-tstdig in dir/manager, and some cleanup + in texts. + -Modified ezmlm-make to fall back to system ezmlmrc files (with warning) + if the -c switch is used by no custom ezmlmrc file is found. This makes + it possible for a GUI to rely more on ezmlm-make. + -Added ezmlm-request to redirect 'Subject:' line requests. + -Added ezmlm-cron, a very restrictive crond interface enabling users + without direct cron access to generate digest trigger messages. Suitable + to be run from scripts for non-shell users as well. See ezmlm-cron.1. + -modified ezmlmrc to set up sublists (-0 sublist@subhost), directories in + dir/modpost|modsub|remote with -789, and SENDER restriction on posts and + archive retrieval (-6 digest_dir). Doc'd in ezmlm-make.1. + -modified ezmlm-make to allow meaning -5 not defined/empty. + -ezmlm-issubn -n[egate] switch to make 'blacklisting' of SENDERs easier. + -ezmlm-get TOC loop starts at first message with the given subject, rather + than first message in range. + -Added time and author to the subject index. The TOC now has author info. + Changes made so that the programs run fine with old or mixed old/new subject + index files. + -removed == n == from rfc1153 digest messages. + -Allowed for -dig.code[range]-targetlocal=targethost in ezmlm-get. Makes + it easier to trigger digests since SENDER "faking" is no longer required. + -ezmlmrc changed to add 'Precedence: bulk' to dir/headeradd. For "vacation". + -Added ezmlm-manage -edit and -edit.file actions. If the -d switch is + used, they allow remote admins to edit dir/text files. + -Modified ezmlm-send to use the main list message number if the message + sender has the correct format and if the list is a non-archived sublist. + -Added tosubs.c, putsubs.c, qputsubs.c for subscriber address output, + modified issub.c and subscribe.c, and put all into subdb.a. subscribe.h + modified to become the general header file for subscriber database interface. + issub() returns (char *)matching_address for compatibility with later packages. + Modified all programs interfacing with subscriber databases to use these + routines. In all a consistent interface. Using ezmlm with a different + subscriber database manager requires changes to these routines only. + -Modified ezmlm-make and ezmlmrc to store all config info in dir/config, and + also read it from there if ezmlm-make is invoked in edit mode with the + 'dir' argument only. + -Fixed ezmlm-manage to make all output MIME using dir/charset (Thanks, SK). + + + ezmlm-idx-0.221, 19980101 + ========================= + -Fixed ezmlm-send bug causing problems with undefined SENDER. + (Thanks, Sadhu, TR). + -Fixed ezmlm-make lock file name bug (Thanks, SOH). + + + ezmlm-idx-0.22, 19971210 + ======================== + -Added 'make clean' and TARGETS. (Thanks, TF). + -man page and FAQ updates. Some of FAQ info moved into a 'USAGE' section + of the man pages. + -Bug fixed: caused ezmlm-make to ignore the -c switch. + -Added -34567890 switches to ezmlm-make. They take a command line argument + and substitute it for <#3#>, <#4#>, etc, in ezmlmrc. + -Added code to ezmlm-gate to enable it to pass switches to both ezmlm-send + and ezmlm-store (which have and need to keep non-overlapping switches). + -Added multi-moddir capability to ezmlm-gate, which now becomes the + standard tool for SENDER-restricting posts. ezmlm-store does this the + slightly more involved but much more secure way. + -Added -C no copy to sender switch to ezmlm-send. Useful for small lists. + -Added -d digdir switch to ezmlm-get. When specified, SENDER is accepted + for -get/thread/index only if a subscriber of the main list or the list + based in digdir. + -ezmlm-manage sends help in reply to a specific list-help request, even if + the list is not public. + -Added ezmlm-send -cC switches controlling post to self (Thanks TF, JS). + -Modified ezmlmrc to add a few switches: -t (trailer), -f (prefix), + -l (subscriber list to remote admins, if any). + -Added ezmlm-tstdig which tests if a specified number of messages, message + body bytes, or time have passed since the last digest creation. Added + support for this in ezmlm-send and ezmlm-get. + -Added ezmlm-issub, and ezmlm-issubn (tests if SENDER is in any of a number + of subscriber databases). Thanks Mark Delany for the original ezmlm-issub. + -Modified issub.c and subscribe.c to make subscriber database storage + and comparisons case-insensitive (backwards compatible). + -Removed ezmlm-warn from ezmlmrc setup of DIR/bouncer. This helps big + lists with lots of bounces. + -Added locking of list dir to ezmlm-make when used in -e [edit] mode. + -Bug: ezmlm-send would make all subjects 'Re: something' even if they were + not replies for non-indexed lists with a subject prefix. Thanks, Ximenes + Zalteca (ximenes@mythic.net) for reporting this. + + + ezmlm-idx-0.21, 19971115 + ======================== + -Slightly improved ezmlm-both (now works even for non-remote admin setups). + It's still very pedestrian. + -Added a few rfc1893 error codes. + -Added -rR option to ezmlm-clean to control sender notification of time-out. + -Bug: in ezmlm-idx missing message->continue (was break). Caused abort if + archive messages are missing (uncommon, but possible if user decides to + delete a few). (Tanks MF). + -More strict on Re[...]: in idxsub: '...' has to be digits and ']' is + required. ':' is optional for broken MUAs. Swedish 'Ang:' accommodated. + -Added 'Content-Disposition:' header to digest messages from ezmlm-get per + rfc2183 (Thanks, SK). Removed Content-Type: message/rfc822 txt, since it + is the default. + -Updated man pages and FAQ for new features. + -ezmlm-send no longer requires DIR/num. If it's not there, it's assumed to + be zero and created. This helps ezmlm-make -e. + -Added ezmlm-make '-e' 'edit' switch. Modified ezmlmrc accordingly. + -Added ezmlm-check script to help diagnose ezmlm list setup errors. Need to + add checks for DIR/text messages. + -ezmlm-store now pipes the message to ezmlm-send if DIR/modpost is not present. + Removing DIR/modpost will make a message moderated list non-moderated. + -Added ezmlm-gate which pipes to ezmlm-send/ezmlm-mode depending on membership + in an address database. This is now a installed C program. + -ezmlm-get no longer requires index to be executable. Also, improved handling + of missing index files in indexed archive (no FATAL error, except for master + subject in 'thread' and that should be fixable ...). Added new format specifier + 'n' for 'not threaded'. Affects -get and -dig. + -Bug: Fixed ezmlm-idx to create index via temp file (indexn) and chmod to 700. + (Thanks Toshinori Maeno). + -Removed charset from multipart/digest header (Thanks SK). + -Bug: Added <#D#> to ezmlm-warn line under in ezmlmrc. + + + ezmlm-idx-0.20, 19971030 + ======================== + -Requests to ezmlm-moderate to accept/reject already processed messages + returns an error ONLY if the requested action is different from the actual + fate of the message. Keeps moderators happier in multi-moderator lists, + without info loss, with less traffic. + -A moderator's (un)subscribe CONFIRM reply results in target notification, + only if the target's status changed. Multiple moderators confirming no + longer yields multiple messages to target. + -ezmlm-manage copy() takes 2 arguments, the file name and a fall-back file + name in case the first file does not exist. CONFIRM requests to moderators + use text/mod-(un)sub-confirm (fall back: text/(un)sub-confirm). ezmlmrc + changed to set these up. + -Added MIME header to ezmlm-get -index response (to get DIR/charset effect). + -Updated docs and FAQ.idx. + -Pre-release compile testing on several platforms. (Thanks YG, ARB, MF, SK). + -Added DIR/msgsize. If it exists and is not 0, ezmlm-send and ezmlm-store will + bounce posts in excess of 'msgsize' bytes body size. + -Fixed ezmlm-clean to that when multiple messages time out, the message-id:s + are different. + -ezmlm-clean and ezmlm-moderate now by default return the post as a + MIME attachment. Use '-M' for old format. + -Rewrote ezmlm-make to work from the ezmlmrc template file for better + and easier customization. Changed moderator rejection comment tag to '%%%' + from '###' to support '#' as a comment character in ezmlmrc. '###' still + works. + -Added DIR/sequence for optional message number header, and DIR/charset for + character set. Thanks, SK. Default Compiled is now US-ASCII, as per rfc2046. + -Added TEST.idx, SECURITY.idx. + -ezmlm-get allows remote admins archive access even for non-public lists. The + ezmlm-get -pP switches override DIR/public effects. + -ezmlm-manage still does moderator-initiated (un)sub when DIR/public is absent. + -Fixed bug: Updated MIME to rfc2046. With this the ezmlm-get 'm' format is no + longer rfc1153-like. 'r' still gives rfc1153. Moderation attachments are now + message/rfc822. Hopefully, the pine attachment viewer will catch up. + Thanks, YG [and Mutt developers] for teaching me the errors of my ways. Also, + see ezmlm-get.1(BUGS). + -ezmlm-manage gives moderator help and does list if target is moderator, + rather than sender. Allows moderator to access from secondary account (to + which mail sent to the primary account is forwarded). + -ezmlm-store checks DIR/modpost for leading '/' and if found assumes that the + first line is the base directory for message moderators. + -ezmlm-manage checks DIR/modsub and DIR/remote contents for a leading '/'. + If found, it is assumed to be the base-dir for moderators. NB: if both + DIR/modsub and DIR/remote have entries, only DIR/modsub is used, i.e. it + is not possible to have different dbs for remote admin and (un)sub mods. + -Modified ezmlm-manage to add separate moderator confirm commands (tc/vc) + to allow also subscription moderator via forwarded mail. This is essentially + a total rewrite of ezmlm-manage. Also, the -S and -U switches were added to + allow optional omission of the user confirm phase for (un)subscribe. + USE OF THESE SWITCHES DRASTICALLY DECREASES SECURITY, except for + moderated lists. Since there have been many request for this (and it + seems reasonable in some circumstances) these options have been added. + Make sure you understand the consequences if you use them. + -Fixed bug: Added exit code to ezmlm-moderate. Thanks BG. + -Added include for sys/types.h to ezmlm-clean.c and ezmlm-store.c, changed + ulong/uint to unsigned long/int, removed void from empty parameter lists for + two functions, all to compile on BSDI 2.1 and Sun. Thanks, ARB and TE. + -Combined ezmlm-mod with ezmlm-idx and fused mod.h into idx.h. + + ezmlm-idx-0.12, 19970910 + ======================== + -Cleanups to allow compile on SGI. Thanks MF. + + ezmlm-idx-0.11, 19970907 + ======================== + -Fixed bug: ezmlm-idx failed to check for error return from issub.c. + -Fixed bug: ezmlm-idx would crash on empty subjects. + -Moved out command names and lengths to idx.h making changing to other + languages easier. Please use this only for totally local lists. + -Added -cC switches to ezmlm-get to disable all but -dig. Useful for secret + lists that are archived and digested. + -Fixed bug: -dig would give "nothing to digest" with only 1 new message. Now + it sends that message out (previously, this message would have been in the + next digest as soon as more messages had arrived). + -Added DIR/prefix. If it exists, it is prefixed to outgoing subjects. Not + added to archive/index. ezmlm-idx deals with it. 'Re: ' is prefixed for + replies, since we use reply-parsed subject in ezmlm-send. A lot of pain for + little gain, but for some reason this seems to be a 'must'. + -Changed idxsub routines to return 1 if reply indicators were fund, 0 else. + -Changed idxthread routines from int to void (don't return anything). + -Split out errtxt.h from idx.h in anticipation of ezmlm-mod. + -changed ezmlm-send to honor 'mailing-list' in headerremove. + -fixed ezmlm-make to deal with non-archived and non-indexed lists and to + point out that -index works in sets of 100. + -ezmlm-get error msg on non-sub -thread request fixed. + -Added DIR/text/trailer. If it exists, it is added to all messages, as + suggested by Fred B. Ringel. It is not copied to the archive. + -ezmlm-make changed to adapt text/bottom to archived/indexed status of list. + -Fixed usage text for ezmlm-send. + -'Reply-To:' header from messages is included in standard MIME digests + (after reading Dan's comments on Reply-To munging). rfc1153 doesn't allow it. + -Changed ezmlm-get.c default to NOT restrict get/index/thread to subscribers. + -Fixed ezmlm-get.1 to correctly reflect effect of -s/-S switches. + -Fixed FAQ and added more info. + + ezmlm-idx-0.10, 19970801 + ======================== + -Added several items to FAQ. + -Made digestcode case-insensitive. + -Fixed format bugs causing trouble with PINE (Thanks Fred B. Ringel). + -Improved handling of missing index file in indexed archives. + -Added info on -get and -index restrictions to text/bottom. + -Added FAQ.idx (a little silly at the moment ;-). + -Added CHANGES.idx. + Updated README.idx, UPDATE.idx, ezmlm.5 and other man pages. + -Added text/digest to allow standard info to be added to the list. A place + holder is put in by ezmlm-manage, since the exact info depends on the + digest list. + -Moved all error messages into defines in idx.h to support alternative + languages. + -folded subject indexing into ezmlm-send. + -ezmlm-get.c: Added -s (default) restricting -get, -index, -thread to + subscribers. -S on the command line removes this restriction. + -Added support for the horrid German 'Aw:' and 'Aw[..]:' replies. + -All linear white space is converted to a single ' ' in subject indexing. + Existing archives should be re-indexed using the new ezmlm-idx. Probably rarely + needed, but it's more correct. + -Added support for subject continuation lines (rfc822). Probably very rarely + needed. + -Limited '-thread' to +/- 2000 messages (defines in ezmlm-get.c) from the + "master message" to limit resource use on large archives. + -Changed limit for '-get' to 50 messages, '-index' to 20 sets (2000 subjects). + -Added digestcode support to ezmlm-make as a 5th argument. Default=blank. + -Added arguments to digest option. If one is given, digesting starts with that + message and dignum/digissue are used/updated. If both are given, dignum and + digissue are not updated and the issue number is the number of the first + message in the archive. + -Added digest support. Enabled by specifying a 'digestcode'last on the + ezmlm-get command line. + -Removed the now redundant -fF (filter) and -qQ (quote) options. + -Changed message format for returned messages allowing rfc1153, MIME + multipart/digest, or MIME multipart/digest ordering and retaining only headers + as per rfc1153, with the addition of 'Content-Type:' to better support + alternative character sets. The latter format is the default. + -Fixed bug in -thread: search for messages was set to start at the beginning + of the index containing the "master message", rather than at the beginning of + the archive. + -Fixed bug: A few stralloc* were incorrectly stdio* in sindex.c. + + ezmlm-idx-0.02, 19970702 + ======================== + -Adapted to changes in ezmlm-0.52 => ezmlm-0.53. + + ezmlm-idx-0.01, 19970615 + ======================== diff -crN ../ezmlm-0.53/DOWNGRADE.idx ./DOWNGRADE.idx *** ../ezmlm-0.53/DOWNGRADE.idx Wed Dec 31 18:00:00 1969 --- ./DOWNGRADE.idx Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,36 ---- + $Id: DOWNGRADE.idx,v 1.3 1997/12/30 21:30:56 lindberg Exp $ + $Name: ezmlm-idx-040 $ + + MODIFYING ezmlm-idx lists to work with "virgin" ezmlm-0.53 + + With ezmlm-idx-0.22, the routines issub.c and subscribe.c are modified to + store subscriber addresses using a hash based on the lower case address, + rather than a case sensitive hash. This was done to avoid the many problems + with subscribers using mixed case addresses (User@host and user@host) without + realizing that these are different. + + These changes have no impact on lower case-only addresses. For mixed case + addresses, the case in the local part is retained. If not found, a second + lookup is done with a hash based on the mixed case address. This results in + backwards compatibility with ezmlm-0.53 subscriber list. + + In the unlikely event that you use ezmlm-idx and then decide to go back to + ezmlm-0.53 alone, mixed case addresses stored in the new location + (case-insensitive hash) will not be found by the old ezmlm-0.53 programs. + To place them in the ezmlm-0.53 position, do the following with your lists + after installing the "virgin" ezmlm-0.53 binaries and backing up everything + under DIR/subscribers: + + % ezmlm-list DIR >tmp.tmp + % rm -rf DIR/subscribers/* + % xargs ezmlm-sub DIR + + +o + + +o + + +o + + +o + + +o + + +o + + +o + + TThhee llaatteesstt vveerrssiioonn ooff eezzmmllmm--iiddxx + ezmlm-idx releases are numbered ``ezmlm-idx-0.xy[z]''. Versions + with the same ``x'' are backwards compatible. A change in ``x'' + signifies major changes, some of which _m_a_y require list changes + (see UPGRADE.idx). However, backwards compatibility with + ezmlm-0.53 list will be maintained. Thus, this is an issue only + if you are already using an older version of ezmlm-idx. + + Addition of ``z'' are bug fixes only. Thus, ezmlm-idx-0.301 is + ezmlm-idx-0.30 with known bugs fixed (but no other significant + changes). When available, patches are named + ``filename-0.xy[z].diff'', where ``0.xy[z]'' corresponds to the + release to which they apply. When a number of bugs (or a + significant bug) are found a bug-fix release is made + incorporating all the patches for the previous version. + + To get the latest features, look for the highest number (``e.g. + ezmlm-idx-0.40''). Any bugs in versions with new features are + expected to be limited to the new features. + + To get the most solid version, get the highest 3-digit number, + i.e. a bug fix. If you already run a version in that series and + a new bug fix is released, see CHANGES.idx to determine if it is + worthwhile to upgrade. Most bugs so far have been relevant only + when using lists in very unusual ways or with rarely used + options. + + + +o + + +o ftp + mirror in Austria. + + +o http + access to the same mirror. + + +o ftp + mirror in Japan. + + eezzmmllmmrrcc((55)) ffiilleess ffoorr ddiiffffeerreenntt llaanngguuaaggeess + The latest versions at the time of release of a package are + included in that package. Thus, this directory will have a file + labeled with the current ezmlm-idx version number only if it has + been updated later than the package. ezmlmrc(5) files are + updated and new ones are added all the time, also with bug fix + releases. Therefore, always look at the latest package. Please + note that ezmlmrc may change significantly between versions. + Thus, do not expect the ezmlm-idx-0.324 ezmlmrc.es to work with + ezmlm-idx-0.40. + + ezmlmrc(5) files contain some release-specific configurations. + Do not use a later file (other than from bug fix releases) with + an earlier version of the programs. It is usually OK to use a + version from an earlier package (see UPGRADE.idx), but some new + functionality may nor be available. + + To contribute an ezmlmrc(5) file in a new language, start with + the en_US version from the latest package, and send the gzipped + file to lindberg@id.wustl.edu. Please leave comments intact and + in English and do not change the order of items in the file. + This will facilitate maintenance. + + + +o + + +o + + +o + + +o + + eezzmmllmm--iissssuubb--00..0055 + + +o . Use + ezmlm-issub only if you do not use ezmlm-idx. The same + functionality is available in ezmlm-idx and the packages are not + compatible. + + +o Also via mirrors mentioned above. + + + RRPPMMss aanndd SSRRPPMMSS ooff qqmmaaiill,, eezzmmllmm aanndd eezzmmllmm--iiddxx + + +o + + +o + + + 11..66.. WWhheerree ccaann II ffiinndd ddooccuummeennttaattiioonn ffoorr eezzmmllmm aanndd ppaattcchheess?? + + + mmaann ppaaggeess + All ezmlm component programs come with their own man pages. + Thus, for info on _e_z_m_l_m_-_s_e_n_d, type: + + + + % man ezmlm-send + + + + + or if you have unpacked ezmlm, but not made it or installed it: + + + + % cd ezmlm-0.53 + % man ./ezmlm-send.1 + + + + + + eezzmmllmm((55)) + General info on ezmlm and list directories is in eezzmmllmm..55: + + + + % man ezmlm + + + + + or + + + + % cd ezmlm-0.53 + % man ./ezmlm.5 + + + + + _N_O_T_E_: Installation of the ezmlm-idx package updates some existing + man pages to reflect changes made by the patch (e.g. ezmlm- + send(1), ezmlm(5)). + + + TTeexxtt ffiilleess iinn tthhee ddiissttrriibbuuttiioonn + ezmlm comes with a RREEAADDMMEE file with general instructions, an + IINNSSTTAALLLL file with installation instructions, an UUPPGGRRAADDEE file for + upgrading from a previous version and a CCHHAANNGGEESS file with + information on changes from previous versions. ezmlm-idx comes + with similar files suffixed with ``..iiddxx''. Most other patches or + add-ons contain similar files and man pages and should contain + identifying suffixes (.iss for ezmlm-issub, for example). For a + discussion of the authors' understanding of ezmlm security, see + ``Ezmlm-idx security''. + + + ````EEzzmmaann'''',, aann eezzmmllmm//iiddxx mmaannuuaall + The ezmlm manual is a brief manual that is meant for list + subscribers, list moderators and remote administrators, and as + an introduction for list owners. It is useful even if you do not + use ezmlm-idx. Features requiring ezmlm-idx are marked as such. + The manual is available as a set of html files, as a text file, + and in a ``letter'' and ``A4'' postscript version: + + +o ezman for download + + +o An on-line html version + + + TThhiiss FFAAQQ + This FAQ is built from a sgml source. It is available in the + following formats: + + +o A text file + + +o An on-line html version + + +o Html for download + + + +o A postscript (letter) version + + + +o A postscript (A4) version + + + +o Via mirrors mentioned for the ezmlm-idx package. + + +o An up-to-date text version,FFAAQQ..iiddxx, included with the ezmlm-idx + package. + + + WWWWWW rreessoouurrcceess + + AAnn oonn--lliinnee vveerrssiioonn ooff tthhiiss FFAAQQ + The main site with an up-to-date + mirror list. German mirror. + Polish mirror. + Japanese mirror. + Portuguese mirror. + Austrian mirror. + Canadian mirror. + + GGeenneerraall qqmmaaiill aanndd eezzmmllmm iinnffoo + + +o Dan J. Bernstein's qmail page + + + +o Dan J. Bernstein's ezmlm page + + + +o Russell Nelson's qmail page + + +o Mirrors of www.qmail.org . + Substitute your two-letter country abbreviation for ``ISO''. + + TThhee qqmmaaiill mmaaiilliinngg lliisstt aarrcchhiivvee + + + +o + + TThhee eezzmmllmm mmaaiilliinngg lliisstt aarrcchhiivvee + + +o + This archive of the ezmlm + list is searchable from 11/97-present. ezmlm-cgi(1) is used + to allow direct access to the sublist archive. + + MMaaiilliinngg lliissttss + Please read other documentation and mailing list archives before + posting questions to the lists. It's also useful to ``lurk'' on + the list for a few days, (i.e. to subscribe and read without + posting) before asking your questions on the list. + + To subscribe, send mail to the E-mail addresses listed: + + +o Dan Bernstein's ezmlm list: ezmlm-subscribe@list.cr.yp.to + + +o A digest version of the ezmlm list fredr-ezmlm-digest- + subscribe@rivertown.net + + +o Dan Bernstein's qmail list: qmail-subscribe@list.cr.yp.to + + +o The Japanese ezmlm list: ezmlm-subscribe@jp.qmail.org + + +o The Japanese qmail list: qmail-subscribe@jp.qmail.org + + +o A ezmlm/idx digest list of djb-qmail: qmail-digest- + subscribe@id.wustl.edu + + +o A ezmlm/idx sublist of djb-qmail (you can test ezmlm-idx + commands): qmail-index@id.wustl.edu + + + 11..77.. WWhheerree ddoo II sseenndd ccoommmmeennttss oonn tthhiiss ddooccuummeenntt?? + + To the authors via E-mail: + + +o Fred Lindberg, lindberg@id.wustl.edu + + +o Fred B. Ringel, fredr@rivertown.net + + + 11..88.. HHooww ttoo eexxppeerriimmeenntt wwiitthh nneeww vveerrssiioonnss ooff eezzmmllmm--iiddxx.. + + ezmlm-idx>=0.23 writes DDIIRR//ccoonnffiigg in a standard format. If ezmlm- + make(1) is invoked with the ``-e'' or ``-+'' switch and the ``DIR'' + argument only, ezmlm-make(1) will read other arguments from this file. + The difference between the switches is that with ``-e'' the options + used are the ones specified on the command line, whereas with ``-+'' + they are the ones currently active for the list, as overridden by any + command line options. Thus, with just: + + + % ezmlm-make -+ DIR + + + + + you can rebuild the list, without affecting any archives, list state + variables, etc. You will _l_o_s_e _m_a_n_u_a_l _c_u_s_t_o_m_i_z_a_t_i_o_n_s _t_o _s_o_m_e _o_f _y_o_u_r + _f_i_l_e_s. However, text files and DDIIRR//hheeaaddeerraadddd are protected against + being overwritten, so that your manual customizations of these files + are retained. To override this protection, simply specify the used + edit switch twice, e.g. ``-ee'' and ``-++'', respectively. This is a + feature introduced in ezmlm-idx-0.40. + + To test a new version of ezmlm-idx or to run several version, make the + new version as per IINNSSTTAALLLL..iiddxx (if you haven't used ezmlm-idx before) + or UUPPGGRRAADDEE..iiddxx (if you've got a previous version of ezmlm-idx + installed), setting ccoonnff--bbiinn to a new directory. You can use either + the current directory or any other directory. If not using the current + dir, you also have to: + + + % make setup + + + + + If you now edit the list using the new ezmlm-make program, the list + will automatically be configured to use the new binaries. To change + back to the ``default'' installation, just edit the list again, this + time with the old ezmlm-make(1). + + If your system has an //eettcc//eezzmmllmmrrcc file, you may need to temporarily + place the eezzmmllmmrrcc((55)) file for the ezmlm version you want to test in + ddoottddiirr of the list and use the ezmlm-make(1) ``-c'' switch (see + ``Terminology: dotdir''). + + ezmlm-idx>=0.314 comes with ezmlm-test(1), a program that tests most + functions of ezmlm+idx and can be used before installation. + + + 22.. QQuuiicckk ssttaarrtt + + + 1. Create a use ``eztest'' for testing. If you use another name, add + the switch ``-u another_name'' to the ezmlm-test(1) line below. + (The space between the switch and the argument is required.) + + 2. Unpack the ezmlm-0.53 distribution. + + 3. Unpack the ezmlm-idx distribution. + + 4. Move the ezmlm-idx files to the ezmlm-0.53 directory. + + 5. Edit ccoonnff--bbiinn and ccoonnff--mmaann to reflect the target directories. + + 6. build and install: + + + % cd ezmlm-0.53 + % patch < idx.patch + % make; make man + % su + # su eztest + % ./ezmlm-test + % exit + # make setup + # exit + + + + + 7. Make a list and digest list + + + + + + % ezmlm-make -rdugm -5 me@host ~/list ~/.qmail-list me-list host + % ezmlm-sub ~/list me@host + % ezmlm-sub ~/list/digest me@host + % ezmlm-sub ~/list/mod me@host + + + + + where ``me'' is your user name and ``host'' the host your list is on. + + Now, you are the owner, remote administrator, and subscriber of both + list@host and the accompanying digest list list-digest@host. Only + subscribers are allowed to access the archive and to post. To post to + the list, mail to list@host. For a user to subscribe, s/he should mail + to list-subscribe@host and for help to list-help@host. + + When a non-subscriber posts, you will be asked to approve, reject, or + ignore the request. If you want to subscriber joe@joehost.dom, mail + list-subscribe-joe=joehost.dom@host. + + Digests are generated about every two days, when 30 messages have + arrived since the last digest, or when more than 64 kbytes of message + body has arrived. To manage the digest list, use the same commands as + the main list, but replace ``list'' with ``list-digest''. + + The sender restriction on posting used in this setup works, but is not + secure. For more info, read the man pages (start with ezmlm(5) and + ezmlm-make(1)), this FAQ (FFAAQQ..iiddxx in the distribution), + RREEAADDMMEE//RREEAADDMMEE..iiddxx, IINNSSTTAALLLL//IINNSSTTAALLLL..iiddxx, and UUPPGGRRAADDEE..iiddxx. + + + 33.. OOvveerrvviieeww ooff mmaaiilliinngg lliisstt mmaannaaggeemmeenntt aanndd mmaaiilliinngg lliisstt mmaannaaggeerrss + + (To be written. Until then, please consult the + manual for ezmlm and ezmlm-idx related + material.) + + + 44.. OOvveerrvviieeww ooff eezzmmllmm ffuunnccttiioonn + + + 44..11.. TThhee bbaassiicc sseettuupp.. + + In designing ezmlm, _D_a_n _J_. _B_e_r_n_s_t_e_i_n has used the unix philosophy of + small component programs with limited and well defined functions. + Requests for specific functions can then be met by the addition of new + programs. + + Thanks to the program execution mechanism Dan built into qmail, it is + easy to execute several small programs per delivery in a defined + sequence. It is also very easy to add shell scripts for further + customization. + + + 44..22.. IInnvveennttiioonnss iinn eezzmmllmm.. + + Dan J. Bernstein has written ezmlm in C. It is written for speed and + reliability even in the face of power loss and NFS. These features + are augmented to a large extent by the ruggedness of the qmail (also + by Dan) delivery mechanism (see qmail-command(8)). + + ezmlm uses some routines and techniques that still are not frequently + seen in many mailing list managers. For example, subscriber E-mail + addresses are stored in a hash so that searches require reading only, + at most, 2% of the E-mail addresses. ezmlm has a optional message + archive, where messages are stored 100 per directory, again to allow + more efficient storage and retrieval. Important files are written + under a new name and, only when safely written, moved in place, to + assure that crashes do not leave the list in an undefined state. + + In addition, ezmlm has a number of new inventions. One of these is + bounce detection, which generates an automatic warning containing + information identifying the messages which have bounced, followed by a + probe message to the E-mail addresses for which mail has bounced. If + the probe bounces, the address is unsubscribed. Thus, the system won't + remove E-mail addresses due to temporary bounces: it takes 12 days + after the first bounce before a warning is sent, and another 12 days + of bounces after the warning bounce before the probe message is set. + + Another Dan J. Bernstein invention is the use of cryptographic cookies + based on a timestamp, address, and action. These are used to assure + that the user sending a request to subscribe or unsubscribe really + controls the target address. It is also used to prevent forgery of + warning or probe messages to make it exceedingly difficult to subvert + the bounce detection mechanism to unsubscribe another user. + + + 44..33.. TThhee qqmmaaiill ddeelliivveerryy mmeecchhaanniissmm.. + + See qmail(7), qmail-local(8), qmail-command(8), envelopes(5), and dot- + qmail(5). Briefly, qmail having resolved the delivery address + delivers it via the ..qqmmaaiill file that most completely matches the + address. This file may be a link to another file, as is the case in + ezmlm lists. qmail then delivers the message according to successive + lines in this file forwarding it to an address, storing it, or piping + it to a program. In the latter case, the program is expected to exit 0 + leading delivery to proceed to the next line in the ..qqmmaaiill file, or 99 + leading to success without delivery to succeeding lines. An exit code + of 100 is a permanent error leading to an error message to the SENDER. + An exit code of 111 is used for temporary errors, leading to re- + delivery until successful or until the queue lifetime of the message + has been exceeded. + + Delivery granularity is the ..qqmmaaiill file and re-deliveries start at the + top. Thus, if the message fails temporarily at a later line, the + delivery according to an earlier line will be repeated. Similarly, + qmail may have made deliveries successfully according to most of the + ..qqmmaaiill file and then fail permanently. The SENDER is informed that the + delivery failed, but not about at which point. + + ezmlm takes advantage of these basic mechanisms to build a fast, + efficient, and very configurable mailing list manager from a set of + small independent programs. + + + 44..44.. WWhhaatt tthhee ddiiffffeerreenntt pprrooggrraammss ddoo.. + + See ezmlm(5) and the man pages for the different programs (listed in + ezmlm(5)). + + + 44..55.. WWhhaatt tthhee ddiiffffeerreenntt ffiilleess iinn tthhee lliisstt ddiirreeccttoorryy ddoo.. + + See ezmlm(5). + + + 44..66.. TThhee ppaappeerr ppaatthh ffoorr ppoossttss.. + + Messages to the list are delivered to a ..qqmmaaiill file, usually ~~//..qqmmaaiill-- + lliissttnnaammee which is linked to DDIIRR//eeddiittoorr. Here, the message is first + delivered to ezmlm-reject(1) which can reject messages based on + subject line contents, MIME content-type, and message body length. It + also by default rejects all messages that do not have the list address + in the ``To:'' or ``Cc:'' header. This eliminates most bulk spam. If + the list is set up for restrictions based on envelope SENDER, the next + delivery is to one or more instances of ezmlm-issubn(1). If the + messages passed this check, it is usually delivered to ezmlm-send(1) + for distribution. If the list is message moderated, it is instead + delivered to ezmlm-store(1) which queues the message and sends out a + moderation request. ezmlm-gate(1) is used by some other setups. It + will for message moderated lists invoke ezmlm-send(1) directly if the + message is from a specific set of SENDERs, and in other cases ezmlm- + store(1) to send the message out for moderation. + + You can specify a separate ..qqmmaaiill-like file for ezmlm-gate(1). The + lines will be executed and the return codes determine if the message + is rejected, sent to the list, or sent to the moderator. See man page + for details. + + If the list is configured for digests, DDIIRR//eeddiittoorr also contains an + ezmlm-tstdig(1) line followed by an ezmlm-get(1) line. If ezmlm- + tstdig(1) determines that the criteria are met for digest generation, + it exits with an exit code of 0, causing the ezmlm-get(1) line to be + executed leading to a digest mailing. Otherwise, ezmlm-tstdig(1) exits + 99, resulting in the remainder of the DDIIRR//eeddiittoorr file to be ignored + too long. The digest is not related to the message being delivered, + but the delivery is used to trigger execution of the relevant + programs. + + + In addition, DDIIRR//eeddiittoorr contains a number of house-keeping functions. + These are invocations of ezmlm-warn(1) to send out bounce warnings and + and (if the list is moderated) ezmlm-clean(1) to clean the moderation + queue of messages that have been ignored. Again, these functions are + not related to the specific message delivered, but the delivery itself + is used as a convenient ``trigger'' for processing. + + + 44..77.. TThhee eezzmmllmm ppaatthh ffoorr mmooddeerraattiioonn mmeessssaaggeess.. + + Replies to moderation requests are channeled to DDIIRR//mmooddeerraattoorr. This + file contains an invocation of ezmlm-moderate(1) which invokes ezmlm- + send(1) for accepted messages and sends out a rejection notice for + rejected messages. It also sends error messages if the message is not + found or already accepted/rejected _c_o_n_t_r_a_r_y to the moderation message. + Thus, if you accept a message already accepted, no error message is + sent. ezmlm-clean(1) is also invoked from DDIIRR//mmooddeerraattoorr for house + keeping. + + + 44..88.. TThhee eezzmmllmm ppaatthh ffoorr aaddmmiinniissttrraattiivvee mmeessssaaggeess.. + + Administrative requests for both list and digest lists are captured by + ~~//..qqmmaaiill--lliissttnnaammee--ddeeffaauulltt linked to DDIIRR//mmaannaaggeerr. Here they are + delivered first to ezmlm-get(1) which processed archive retrieval + requests, exiting 99 after successful completion which causes the rest + of the delivery lines to be ignored. If the request is not for ezmlm- + get(1) it rapidly exits 0. This leads to invocation of ezmlm-manage(1) + which handles subscriber database functions, help messages, and (if + configured) editing of DDIIRR//tteexxtt// files. Again, ezmlm-warn(1) lines are + included for bounce directory processing. + + If configured, an ezmlm-request(1) line is present. This program + constructs valid ezmlm requests from command in the subject lines of + messages sent to listname-request@host and exits 99. These requests + are mailed and will then return to be processed by one of the other + programs. + + 44..99.. TThhee eezzmmllmm ppaatthh ffoorr bboouunncceess.. + + Bounces to the list are handled by DDIIRR//bboouunncceerr. For the digest list + this is DDIIRR//ddiiggeesstt//bboouunncceerr. The two were combined in previous + versions, which is still supported. As this leads to problems with + list names ending in ``digest'', the functions are separate with lists + set up or edited with ezmlm-idx>=0.32. The bounce is first delivery is + to ezmlm-weed(1) which removes delivery delay notification and other + junk. The second to ezmlm-return(1) which analyzes valid bounces + storing the information in DDIIRR//bboouunnccee// for the list and + DDIIRR//ddiiggeesstt//bboouunnccee// for the digest. This is the information that + ezmlm-warn(1) (invoked from DDIIRR//eeddiittoorr and DDIIRR//mmaannaaggeerr) uses and + processes for automatic bounce handling. ezmlm-return(1) will also + unsubscribe a subscriber from whom a probe message has bounced. + + + 44..1100.. MMeessssaaggeess ttoo lliisstt--oowwnneerr aanndd lliisstt--ddiiggeesstt--oowwnneerr.. + + These are processed by DDIIRR//oowwnneerr and delivered to DDIIRR//mmaaiillbbooxx by + default. It is better to put the real owner address in this location. + This can be done manually, via editing of eezzmmllmmrrcc((55)), or via the + ezmlm-make(1) -5 switch. Again, some house-keeping functions are also + executed. + + + 44..1111.. SSttrruuccttuurree ooff ssuubbssccrriibbeerr ddaattaabbaasseess.. + + ezmlm subscriber E-mail addresses are stored within DDIIRR//ssuubbssccrriibbeerrss// + as a hashed set of 53 files. The hash calculated from the address + determines which of the 53 files and address is stored in. Thus, to + find out if an address is a subscriber, ezmlm has to read at most + about 2% of the E-mail addresses. The hash function insures that E- + mail addresses are reasonably evenly distributed among the 53 files. + + Addresses in the files in DDIIRR//ssuubbssccrriibbeerrss// are stored as strings + starting with ``T'', followed by the address, followed by a zero byte. + This is the same format as taken by qmail-queue(8) on file descriptor + 1. Thus, subscriber lists can be directly copied to qmail without any + further processing. + + With ezmlm-idx>=0.32 you can use an SQL server for the subscriber + databases. Please see the SQL section (``ezmlm support for SQL + datbases''). + + + 44..1122.. LLooccaall ccaassee iinn EE--mmaaiill aaddddrreesssseess.. + + rfc822 states that the host part of an address is case insensitive, + but that case of the local part should be respected and the + interpretation of it is the prerogative of the machine where the + mailbox exists. Thus, ezmlm preserves the case of the local part, but + converts the host part to lower case. ezmlm proper also bases the hash + on the case of the local part, so that USER@host and user@host are not + (usually) stored in the same file. + + Locally, deliveries are most often case insensitive, i.e. mail to + USER@host and user@host are delivered to the same mail box. A + consequence of this is that many users use E-mail addresses with + different case interchangeably. The problem is that when USER@host is + subscribed, ezmlm will not find that address in response to an + unsubscribe request from user@host. This is even more problematic when + E-mail addresses have been added by hand to e.g. moderator lists. + + ezmlm-idx>=0.22 changes address storage to make comparisons case + insensitive and store E-mail addresses based on the hash of the all + lower case address. Case is maintained for the local part. Thus, if + USER@host is subscribed, mail is set to USER@host, but user@host is + recognized as a subscriber and an unsubscribe request from user@host + will remove USER@host from the subscriber list. + + To maintain backwards compatibility with old subscriber lists, a + second lookup is made for partially upper case E-mail addresses in + some cases. This will find USER@host subscribed with a case sensitive + hash as well. + + If may be useful to move all old mixed case E-mail addresses to the + ``new'' positions. Without this, USER@host subscribed with the old + system will be able to unsubscribe as USER@host, but not as user@host. + After the repositioning, s/he will be successfully able to use any + case in an unsubscribe request, e.g. UsEr@host. To do this: + + + + % ezmlm-list DIR | grep -G '[A-Z]' > tmp.tmp + % xargs ezmlm-sub DIR < tmp.tmp + + + + + This works, because subscribing an address, even if it already exists, + will assure that it is stored with a case insensitive hash. On some + systems, the grep ``-G'' switch need/should not be used. + + + 44..1133.. TTeessttiinngg SSEENNDDEERR ttoo aallllooww ppoossttss oonnllyy ffrroomm lliisstt ssuubbssccrriibbeerrss.. + + This mode of operation is automatically set up if you specify the + ezmlm-make(1) ``-u'' switch. Since there may be some addresses that + should be allowed to post, but are not subscribers of list or list- + digest, ezmlm-make(1) sets up an additional address database in + DDIIRR//aallllooww//. Use ezmlm-sub(1), ezmlm-unsub(1), and ezmlm-list(1) to + manipulate these addresses. If the list is configured for remote + administration (see ``How remote administration works''), you can + add/remove addresses from the DDIIRR//aallllooww// database by mailing list- + allow-subscribe@listhost and list-allow-unsubscribe@listhost, + respectively. Other commands that access subscriber databases work in + the same manner. + + To similarly restrict archive access, use the ezmlm-make(1) ``-g'' + switch. + + Since SENDER is under the control of a potential attacker, it is not + secure to use tests of SENDER for anything important. However, when + replies are always sent to SENDER (such as for archive access), a + check of SENDER can prevent the sending of information to E-mail + addresses not in the database. + + To test sender, use the program ezmlm-issubn(1). It will return 0 + (true for the shell, success for qmail deliveries) if SENDER is in at + least one of a set of subscriber databases. If not, it will return 99 + (false for the shell: success, but skip remainder of ..qqmmaaiill file for + qmail deliveries). The basedirs of the subscriber lists (i.e. the + directories in which the ``subscriber'' dirs are located) are given as + arguments. ezmlm-issubn(1) can take any number of arguments. + + Thus, to permit an action if SENDER is a subscriber to the list in any + of DDIIRR//, DDIIRR//ddiiggeesstt//, or DDIIRR//aallllooww// and exit silently, put the + following into the relevant ..qqmmaaiill file: + + + + + |/usr/local/bin/ezmlm/ezmlm-issubn DIR DIR/digest DIR/allow [...] + |/path/action_program + + + + + Restricting your list to posts from your subscribers is as easy as + that. If your ezmlm binaries are in a different directory, you may + have to modify the ezmlm-issubn(1) path. + + ezmlm-issubn(1) has a ``-n'' switch which ``negates/reverses'' the + exit code. To do an action if SENDER is _N_O_T a subscriber of any of + the lists: + + + + |/usr/local/bin/ezmlm/ezmlm-issubn -n DIR/deny [dir2 ...] + |/path/other_program + + + + + To automatically configure the list with a blacklist address database + in DDIIRR//ddeennyy, use the ezmlm-make(1) ``-k'' switch. If the list is + configured for remote administration (see ``How remote administration + works'') and if you are a remote administrator, you can manipulate the + ``deny'' database remotely by sending mail to list-deny-subscribe- + user=userhost@listhost, etc. + + + 44..1144.. HHooww ccooookkiieess wwoorrkk.. + + Each ezmlm list has it's own ``key'' created by ezmlm-make at setup + time. This key is stored in DDIIRR//kkeeyy, and you can improve it by adding + garbage of your own to it. However, changing the key will make all + outstanding cookies invalid, so this should be done when the list is + established. + + When ezmlm receives an action request, such as ``subscribe'', it + constructs a cookie as a function of: + + +o the request, + + +o the time, + + +o and the target address. + + The cookie and these items are then assembled into a address that + is sent out as the ``Reply-To:'' address in the confirmation + request sent to the subscriber. When the subscriber replies, ezmlm + first checks if the timestamp is more than 1,000,000 seconds old + (approx 11.6 days) and rejects the request if it is. Next, ezmlm + recalculates the cookie from the items. If the cookies match, the + request is valid and will be completed. Depending on the + circumstances, ezmlm generates an error message or a new cookie + based on the current time and sends the target a new confirmation + request. + + Dan has based these cookies on cryptographic functions that make it + very unlikely that a change in any part of the cookie or the items + will result in a valid combination. Thus, it is virtually impossible + to forge a request even for someone who has a number of valid requests + to analyze. Since the algorithm ezmlm uses is available, the security + rests on the key (and the correctness of the algorithm). Anyone who + knows the key for your lists can easily construct valid requests. + + As ezmlm-make(1) doesn't use a truly random process to generate the + key, it is theoretically possible that someone with sufficient + knowledge about your system can guess your key. In practice, this is + very unlikely, and the safety of the system is orders of magnitude + higher than that of other mechanisms that you may rely on in your list + management and mail transport (exclusive of strong encryption, such as + _P_G_P). + + + 44..1155.. HHooww mmooddeerraattoorr EE--mmaaiill aaddddrreesssseess aarree ssttoorreedd.. + + Moderator E-mail addresses are stored just like ezmlm subscriber + addresses, in a set of up to 53 files within the ssuubbssccrriibbeerrss + subdirectory of the list's bbaasseeddiirr//. For subscribers, the bbaasseeddiirr// is + the list directory itself, i.e. DDIIRR//. For moderators, the default is + DDIIRR//mmoodd//, which can be overridden by placing a bbaasseeddiirr name (starting + with a ``/'') in DDIIRR//mmooddssuubb, DDIIRR//rreemmoottee, or DDIIRR//mmooddppoosstt for + subscription moderation, remote administration, and message + moderation, respectively. This permits the use of one moderator + database for multiple lists. _N_o_t_e_: _S_u_b_s_c_r_i_p_t_i_o_n _m_o_d_e_r_a_t_o_r_s _a_n_d _r_e_m_o_t_e + _a_d_m_i_n_i_s_t_r_a_t_o_r_s _a_r_e _a_l_w_a_y_s _t_h_e _s_a_m_e _a_d_d_r_e_s_s_e_s_. _I_f _b_o_t_h DDIIRR//mmooddssuubb and + DDIIRR//rreemmoottee contain paths, only the DDIIRR//mmooddssuubb path is used. + + + 44..1166.. HHooww ssuubbssccrriippttiioonn mmooddeerraattiioonn wwoorrkkss.. + + Subscription moderation is a simple extension of the ezmlm subscribe + mechanism. Once the user has confirmed the subscribe request, a new + request is constructed with a _d_i_f_f_e_r_e_n_t _a_c_t_i_o_n _c_o_d_e. This is sent out + to the moderator(s). When a moderator replies with a valid request and + cookie combination, the user is subscribed. The user is then also + welcomed to the list. Other moderators won't know that the request has + already been approved. If other moderators reply to the request, no + notification of the duplicate action is sent to the subscriber of the + duplicate action. Ezmlm knows that this is a repeat request since the + target address is already a subscriber. + + The moderators are not informed about the result, unless there was an + error (subscribing a target that is already a subscriber is not + considered an error). This cuts down the number of messages a + moderator receives. Any list moderator knows (or _s_h_o_u_l_d know) the + qmail/ezmlm/unix paradigm: _i_f _y_o_u_'_r_e _n_o_t _t_o_l_d _o_t_h_e_r_w_i_s_e_, _y_o_u_r _c_o_m_m_a_n_d + _w_a_s _c_a_r_r_i_e_d _o_u_t _s_u_c_c_e_s_s_f_u_l_l_y. This may be counterintuitive to those + used to some other operating systems, but in our experience it doesn't + take long to get used to the reliability and efficiency of + U*ix/qmail/ezmlm. + + Subscription moderation is enabled by creating DDIIRR//mmooddssuubb and adding + the subscription moderator to DDIIRR//mmoodd//: + + + % ezmlm-sub DIR/mod moderator@host + + + + + To use an alternative basedir for subscription moderators, place that + directory name with a leading ``/'' in DDIIRR//mmooddssuubb. + + + 44..1177.. HHooww rreemmoottee aaddmmiinniissttrraattiioonn wwoorrkkss.. + + The term ``remote administration'' is used to denote the ability of a + list administrator by E-mail to add or remove any E-mail address from + the subscriber list without the cooperation of the user. Normally, + when user@userhost sends a message to list-subscribe- + other=otherhost@listhost to subscribe other@otherhost, the + confirmation request goes to other@otherhost. However, if remote + administration is enabled and user@userhost is a moderator, a + confirmation request (with a different action code) is sent back to + user@userhost instead. The reply from the administrator is suppressed + in the welcome message sent to the new subscriber (other@otherhost). + This protects the identity of the remote administrator. + + Remote administration is enabled by creating DDIIRR//rreemmoottee and adding the + remote administrator E-mail address(es) to DDIIRR//mmoodd//: + + + % ezmlm-sub DIR/mod remoteadm@host + + + + + To use an alternative basedir for remote administrators, place that + directory name with a leading ``/'' in DDIIRR//mmooddssuubb. Remote administra- + tors and subscription moderators databases always consist of the same + E-mail addresses. If both are enabled and one of DDIIRR//mmooddssuubb and + DDIIRR//rreemmoottee contains an alternative basedir name, this basedir is used + for both functions. If both DDIIRR//mmooddssuubb and DDIIRR//rreemmoottee contain direc- + tory names, the one in DDIIRR//mmooddssuubb is used for both functions. + + Remote administrators can add and remove addresses to the digest list, + the ``allow'' list (user aliases for lists using SENDER restrictions + on posting and archive access), and if used the ``deny'' list + containing addresses that are denied posting rights to the list. The + latter is easy to circumvent and intended to block errant mail robots, + rather than human users. + + + 44..1188.. HHooww mmeessssaaggee mmooddeerraattiioonn wwoorrkkss.. + + ezmlm-store(1), invoked in DDIIRR//eeddiittoorr, receives messages for message + moderated lists. If DDIIRR//mmooddppoosstt does not exist, ezmlm-store(1) just + calls ezmlm-send(1) and the message is posted to the list as if it + were not moderated. If DDIIRR//mmooddppoosstt exists, ezmlm-store(1) places the + message in DDIIRR//mmoodd//ppeennddiinngg//. It also sends a moderation request to + all the moderators. Included with this request is a copy of the + message. The ``From:'' and ``Reply-To:'' E-mail addresses contain + codes for ``reject'' and ``accept'', together with a unique message + name (derived from the message timestamp and process id) and a cookie + based on these items. When a moderator replies, ezmlm-moderate(1) is + invoked via DDIIRR//mmooddeerraattoorr. ezmlm-moderate(1) validates the request, + and if the request is valid and the message is found in + DDIIRR//mmoodd//ppeennddiinngg//, it carries out the requested action. + + If the request is ``reject'' the post is returned to SENDER with an + explanation and an optional moderator comment. If the request is + ``accept'' the message is posted to the list via ezmlm-send(1). As the + request is processed, a stub for the message is created in + DDIIRR//mmoodd//rreejjeecctteedd// or DDIIRR//mmoodd//aacccceepptteedd// for ``reject'' and ``accept'' + requests, respectively. + + If a valid reply is received but the message is no longer in + DDIIRR//mmoodd//ppeennddiinngg//, ezmlm-moderate(1) looks for the corresponding stub + in DDIIRR//mmoodd//rreejjeecctteedd// and DDIIRR//mmoodd//aacccceepptteedd//. If the stub is found and + the fate of the message was the one dictated by the new request, no + further action is taken. If, however, no stub is found or the request + and the actual message fate do not match, a notification is sent to + the moderator. This scheme was chosen to impart a maximum of + information with a minimum of messages. Also, it is the least + demoralizing setup for multiple moderator lists, where it is important + not to notify subsequent moderators that their work was in vain since + the action of the first responding moderator has already resulted in + processing of the message. + + If a message is not ``rejected'' or ``accepted'' it remains in + DDIIRR//mmoodd//ppeennddiinngg// until it times out. Cleanup of both messages and + stubs is accomplished by ezmlm-clean(1) which is invoked through both + DDIIRR//eeddiittoorr and DDIIRR//mmooddeerraattoorr for message moderated lists. ezmlm- + clean(1) looks at the timestamp used to generate the message/stub + name. If it is older than 120 hours (configurable in a range of 24-240 + hours, by placing the value in DDIIRR//mmooddttiimmee) it is removed. Unless + suppressed with the ezmlm-clean(1) ``-R'' switch, the SENDER of the + message is notified. + + By default, the E-mail addresses of message moderators are stored as a + subscriber list with a basedir of DDIIRR//mmoodd//. This can be changed to + any other bbaasseeddiirr by placing the name of that directory with a leading + ``/'' in DDIIRR//mmooddppoosstt. Although the default basedirs for message + moderation and subscription moderation/remote administration are the + same, both the functions and actors are entirely independent. + + + 44..1199.. HHooww QQMMQQPP ssuuppppoorrtt wwoorrkkss + + qmail processes messages on a first-come-first-served basis. This + means that when it receives a post to 100,000 subscribers, it will try + all the recipients before processing the next message. Often, it is + desirable to offload this work to an external host so that the main + list host remains responsive to e.g. ``subscribe'' and archive access + commands, as well as to other mail is it is not a dedicated mail host. + + ezmlm-idx allows the main distribution work to be offloaded to an + external server via the QMQP protocol. Configure qmail-qmqpc(1) on the + list host, and qmail-qmqpd(1) on the mail host (see qmail docs for + details), then create the file DDIIRR//qqmmqqppsseerrvveerrss//00. The list housed in + DDIIRR will now use the QMQP server for posts, by the local qmail for + other messages. If you apply the qmail-qmqpc.tar.gz patch (included in + the ezmlm-idx distribution), you can specify the QMQP server IP + addresses, one per line, in DDIIRR//qqmmqqppsseerrvveerrss//00, just as you normally + would in //vvaarr//qqmmaaiill//ccoonnttrrooll//qqmmqqppsseerrvveerrss. If the first server cannot + be contacted, the installation will try the second, and so on. The + advantage of controlling the servers locally is that you can specify + different servers for different lists. A good idea is to set up also + the list host as a QMQP server and use that as the last IP address. + This way, the list host will be used if the main QMQP server cannot be + contacted. Of course, ezmlm does not loose messages, but rather lets + qmail redeliver the post if no QMQP server is available. + + + 44..2200.. HHooww mmeessssaaggeess aarree ssttoorreedd iinn tthhee aarrcchhiivvee.. + + The structure of the ezmlm list archive is described in the ezmlm(5) + manual page. Basically, the message is stored in DDIIRR//aarrcchhiivvee//nn//mm, + where ``n'' is the message number divided by 100 and ``m'' the + remainder (2 digits). The first message is stored in DDIIRR//aarrcchhiivvee//00//0011. + + + 44..2211.. HHooww tthhee mmeessssaaggee iinnddeexx wwoorrkkss.. + + The ezmlm-idx(1) adds the option (default) of a message index to + ezmlm. The ``From:'' line, the subject, the author's E-mail address + and name and the time of receipt are logged for each message as it is + received. The subject is ``normalized'' by concatenating split lines + and removing reply-indicators such as ``Re:''. A hash of the + normalized subject with all white space removed is also stored. The + hash for any message within a thread is almost always the same and is + used together with the order of receipt to connect a set of messages + into a ``thread''. A hash is needed due to the inconsistent handling + by MUAs of white space in rfc2047-encoded subject headers. + + The message index is stored as DDIIRR//aarrcchhiivvee//nn//iinnddeexx, where ``n'' is the + message number mod 100. Thus, the directory DDIIRR//aarrcchhiivvee//5522// stores + messages 5200 through 5299 and the file ``index'' which contains the + index for those messages. + + The message index can be retrieved with the -index command (see ezmlm- + get(1)). You can also retrieve a range of messages, a specific thread, + or generate a message digest (see ezmlm-get(1)). Each of these + commands can be disabled or restricted as desired by the list owner. + + The ezmlm-idx(1) can be used at any time to either reconstruct an + existing index or create one an index for an existing message archive. + without one. + + + 44..2222.. HHooww tthhrreeaaddiinngg wwoorrkkss.. + + A ezmlm thread is just a message number-ordered set of messages with + identical ``normalized'' subject entries. This is a very reliable + method for threading messages. It does not rely on any variably + present ``In-Reply-To:'' or ``References:'' headers. If the subject + changes, the continuation becomes a separate thread very close to the + original thread in a digest. ezmlm uses this mechanism to return + message sets threaded and with a thread and author index, unless + specifically told not to do so with the ``n'' format specifier. + Naturally, lists set up without a message index (using the ezmlm-make + ``-I'' switch) do not maintain thread information. + + + 44..2233.. HHooww ddiiggeessttss wwoorrkk.. + + A ``digest'' is just an ordered collection of messages from a list, + usually sent out regularly depending on the time and traffic volume + since the last digest. Digest subscribers thus can read messages as + ``threads'' once daily, rather than receiving a constant trickle of + messages. + + As a major change in ezmlm-idx-0.30, the digest is no longer a totally + separate ezmlm-list, but a part of the main list. This has security + advantages, makes setup and administration easier, saves space, and + allows a consistent way for subscribers of both ``list'' and ``list- + digest'' to retrieve missed messages from a single archive. + + The digest of the list ``list'' is always called ``list-digest''. To + set up a list with a digest, simply use the ezmlm-make(1) ``-d'' + switch. You subscribe to and unsubscribe from a digest the same way as + for the main list, except that the request is sent to e.g. list- + digest-subscribe@host rather than to list-subscribe@host. + + Any option such as remote admin or subscription moderation that is + active for the list applies also to the digest list. Any restrictions + in posts or archive retrieval set up for the list, automatically + accept both subscribers of the main list and of the digest list. + + The changes in ezmlm-idx>=0.30 allow all programs to service both list + and list-digest functions. All digest-specific files are stored in + DDIIRR//ddiiggeesstt//. Digest list subscriber addresses in + DDIIRR//ddiiggeesstt//ssuubbssccrriibbeerrss// and digest list bounce information in + DDIIRR//ddiiggeesstt//bboouunnccee//. Text files are shared between list and digest. To + get the local part of the list or list-digest name in a context + sensitive manner, use ``<#l#>'' (lower case ``L'') in the text file. + + + In order to generate digest, the list needs to be archived and indexed + (both default). You can retrieve sets of messages from the message + archive. Such sets are always returned to the SENDER of the request. + ``Digests'' are a special form of such a set/request. First, there are + no restrictions on the number of messages that can be in a digest + (which is balanced by the requirement for a ``digest code'' that needs + to be specified in order to create a digest based on a mailed + request). Second, special files (DDIIRR//ddiiggiissssuuee and DDIIRR//ddiiggnnuumm) keep + track of the digest issue and the message number, amount, and time + when the last digest was created. Thus, the system is adapted to make + it easy to create the regular collections of messages commonly + referred to as ``digests''. + + Digest can be generated in several different ways: + + CCoommmmaanndd lliinnee + ezmlm-get can be invoked on the command line, or via a script + from e.g. crond(8): + + + % ezmlm-get DIR + + + + + If for some reason the digest should be disseminated via a separate + list, the digest can be redirected to a ``target address'' with the + ezmlm-get(1) ``-t'' switch. This may be useful if a non-standard + digest list name is required. In this case, the list disseminating + the digest must be set up as a sublist of the main list (see ``How + sublists work''). + + + ffrroomm DDIIRR//eeddiittoorr + This is the default and does not require and additional setup. + It works well with most lists. The only possible advantage is + for very low traffic lists and for lists where it is important + that a digest be sent out at a specific time (as DDIIRR//eeddiittoorr + digests are triggered only when messages are received). + + In DDIIRR//eeddiittoorr, ezmlm-get(1) needs to be combined with ezmlm- + tstdig(1) so that digests are generated only if certain criteria + are met (in this case, more than 30 messages, 64 kbytes of + message body or 48 hours since the latest digest). Add these + lines after the ezmlm-send line in DDIIRR//eeddiittoorr: + + + |/usr/local/bin/ezmlm/ezmlm-tstdig -t48 -m30 -k64 DIR || exit 99 + |/usr/local/bin/ezmlm/ezmlm-get diglist@host DIR || exit 0 + + + + + To set this up automatically when you create the list: + + + % ezmlm-make -d DIR dot local host [code] + + + + + Again, the ezmlm-get(1) ``-t'' switch can be used for non-standard + arrangements to redirect the digest. The ezmlm-make(1) ``-4'' + switch can be used to specify alternative ezmlm-tstdig(1) parame- + ters. + + ffrroomm DDIIRR//mmaannaaggeerr + This is useful only if you want digests at specific times, and + you do not have access to crond(8) on the list host. ezmlm- + get(1) is in it's normal place in DDIIRR//mmaannaaggeerr before ezmlm- + manage(1), but a digest code is specified in the ezmlm-get(1) + command line. To trigger digests requires a regular trigger + messages generated from e.g. crond(8) (see below), but this can + be done from _any_ host, not only the list host. ezmlm-make(1) + sets up ezmlm-get(1) this way if a digest ``code'' is given as + the 5th ezmlm-make(1) command line argument. However, you need + to set up the trigger messages separately (see below): + + + % ezmlm-make DIR dot local host code + + + + + To also test for message volume with this setup, generate trigger + messages with the granularity you'd like, and add a ezmlm-tstdig(1) + line to DDIIRR//mmaannaaggeerr. E.g., use a trigger message every 3 hours and + the following ezmlm-tstdig(1) line before ezmlm-get(1): + + + |/usr/local/bin/ezmlm/ezmlm-tstdig -t24 -m30 -k64 DIR || exit 99 + + + + + In general, a cron-triggered digest is preferred for very large + lists and for lists with very low traffic. Again, the ezmlm-get(1) + ``-t'' switch can be used for non-standard arrangements to redirect + the digest. For most lists, the digesting from DDIIRR//eeddiittoorr works + very well, and does not require any extra setup work. + + CCoommbbiinnaattiioonn sseettuuppss + The default setup in the ezmlmrc(5) file included in the + distribution is the DDIIRR//eeddiittoorr triggered setup described above. + If you in addition use ezmlm-cron(1) or crond(8) directly to + generate trigger messages to list-dig.code@host, you can get + regular digests (via the trigger messages and DDIIRR//mmaannaaggeerr), with + extra digest sent when traffic is unusually high (via the ezmlm- + tstdig/ezmlm-get limits set in DDIIRR//eeddiittoorr). This works best + when the time argument on the ezmlm-tstdig(1) command line is + the same as the trigger message interval, and the other ezmlm- + tstdig(1) parameters are set so that they are only rarely + exceeded within the normal digest interval. + + + 44..2244.. HHooww WWWWWW aarrcchhiivvee aacccceessss wwoorrkkss.. + + If the list is set up with ezmlm-make -i, ezmlm-archive(1) will be + invoked from DDIIRR//eeddiittoorr. This program creates indices for threads, + subjects, and authors under DDIIRR//aarrcchhiivvee from the iinnddeexx files. ezmlm- + cgi(1) is set up per user or globally (see man page) and told about + different lists via the //eettcc//eezzmmllmm//eezzccggiirrcc file. ezmlm-cgi(1) presents + and used the index created by ezmlm-archive(1) and converts these and + the messages to html on-the-fly. To be as efficient as possible, + ezmlm-cgi(1) outputs only basic html. However, style sheets are + supported and can be used to customize formatting without modification + of ezmlm-cgi(1). Extra buttons can be added via the config file. See + man page for details. + + + + + 44..2255.. HHooww eezzmmllmm--ttssttddiigg wwoorrkkss.. + + ezmlm-tstdig(1) looks at DDIIRR//nnuumm and DDIIRR//ddiiggnnuumm to determine how many + messages and how much traffic (in terms of bytes of message body) has + arrived to the list since the latest digest. It also determines how + much time has passed since the last digest was generated. If any of + the criteria specified by command line switches exists, ezmlm- + tstdig(1) exits 0, causing the invocation of the next line in the + .qmail file. If not, ezmlm-tstdig(1) exits 99 causing qmail to skip + the rest of the .qmail file. ezmlm-tstdig(1) looks at LOCAL to + determine if it is invoked in the command line, in DDIIRR//eeddiittoorr, or in + DDIIRR//mmaannaaggeerr. In the latter two cases, ezmlm-tstdig(1) verifies that + the list local address is correct. If invoked in DDIIRR//mmaannaaggeerr, ezmlm- + tstdig(1) exits 0 for all action requests except list-dig, so that is + does not interfere with the normal functions of ezmlm-get(1) and + ezmlm-manage(1). ezmlm-tstdig(1) uses DDIIRR//ttssttddiigg as a flag to avoid + problems caused by starting the program when another copy is already + running. + + ezmlm-make(1) automatically configures ezmlm-tstdig(1) with the + parameters ``-t48 -m30 -k64'', which can be overridden with the ``-3'' + switch. + + + 44..2266.. HHooww ssuubblliissttss wwoorrkk.. + + ezmlm uses the concept of sublists. Sublists are regular ezmlm lists, + except that they only accept messages from their parent list, which is + placed in the file DDIIRR//ssuubblliisstt. + + sublists are used to split the load of a large mailing list among + several hosts. All you need to do to set up a local sublist of e.g. + the qmail@list.cr.yp.to list is to create a ezmlm list, and put + ``qmail@list.cr.yp.to'' into DDIIRR//ssuubblliisstt of you list, and subscribe + the sublist to the main qmail list. Now anyone can subscribe to your + local list which handles its own bounces, subscribe requests, etc. + The load on the main list is only the single message to your local + list. + + Sublists will not add their own mailing list header and they will not + add a subject prefix. Normally, sublists will use their own message + number, rather than that used by the main list. With ezmlm-idx>=0.23, + sublists that are not archived and not indexed, will instead use the + main list message number. This way, bounce messages from the sublist + can refer the subscriber to the main list archive. This is not done + for indexed/archived sublists for security reasons (an attacker could + overwrite messages in the sublist archive). + + With ezmlm-idx>=0.31, there is support for using ezmlm as a sublist of + a mailing list run by another mailing list manager. To set this up, + set up a normal ezmlm sublist, then edit DDIIRR//eeddiittoorr so that the _e_z_m_l_m_- + _s_e_n_d line contains the command line option ``--hh _X_-_L_i_s_t_p_r_o_c_e_s_s_o_r_- + _V_e_r_s_i_o_n_:'' (before DDIIRR). As the header text, you need to use a header + that the main list manager adds to messages. Now your sublist will + accept only messages from the main list requiring that they come from + that list _a_n_d contain the header specified. + + ezmlm-idx>=0.313 also has added protection against the malicious + subscription of the ezmlm list to mailing lists run by other list + managers. If the ezmlm-reject(1) line in DDIIRR//eeddiittoorr has ``-h'' and + ``DDIIRR'' on it, ezmlm-reject(1) will read DDIIRR//hheeaaddeerrrreejjeecctt and reject + messages that have any header specified in that file. See the ezmlm- + reject(1) man page for suitable headers. + + + + 44..2277.. HHooww ssuubblliissttiinngg ccaann bbee mmaaddee ttrraannssppaarreenntt ttoo tthhee uusseerr.. + + Often you create a local sublist of a list that you do not control. + Local users know to subscribe to your local list. However, + occasionally, you want to run your own list as a main list and a + series of sublists per geographic site, or split onto several hosts if + the list is too large to be handled by a single computer. You may also + want to split the load of a ``well known'' list host that is getting + overwhelmed with traffic. ezmlm supports sublists, but here the fact + that the user has to interact with the correct sublist is a problem. + What if the user doesn't remember which sublist s/he is subscribed to? + What if you change the name of a sublist host or move a sublist to a + different host? + + ezmlm-idx&-0.32 adds ezmlm-split(1), which allows sublisting + transparent to the user. This program is invoked before ezmlm- + manage(1) in DDIIRR//mmaannaaggeerr. If it detects a subscribe or unsubscribe + command, it will forward the command to the appropriate sublist based + on a ``split file'' DDIIRR//sspplliitt. This file contains entries, one per + line, of the format: + + + domain:lo:hi:sublistname@sublisthost + edu:::othersub@otherhost + :1:26:third@thirdhost + + + + + For each address, a hash in the range 0-52 is calculated. The + ``domain'' is the last two parts of the host name, reversed. Thus, for + id.wustl.edu it would be ``edu.wustl''. The domain is considered to + match if the characters in the split file match. It is advisable to + use only the last part of the domain for compatibility with the SQL + version version (see section ``ezmlm support for SQL datbases''). + + Thus, any address *@*.domain with a hash between ``lo'' and ``hi'' + inclusive would match the first line and be forwarded to + sublistname@sublisthost. *@*.edu (independent of hash) would match + the second line and be forwarded to othersub@otherhost. Of remaining + requests, a request for any target address with a hash between 1 and + 26 would be forwarded to the sublist third@thirdhost. Remaining + requests would be passed on to the local list. + + The domain is useful for ``geographic'' splitting, and the hash for + load splitting (within a domain). The user interacts only with the + main list, and does not need to know from which sublist s/he is + serviced. + + ezmlm-idx sublists use the message number of the main list message if + they are not indexed. This allows sublists to in bounce messages refer + the subscriber to the main list archive. Use ezmlm-make(1) in + conjunction with ezmlmsubrc(5) to set up the sublists. See man pages + for further details. + + Since the addresses are stored locally, the system is very fast and + robust, but it is difficult to add new sublists. ezmlm-split(1) -D + supports parsing addresses on stdin and splitting them to stdout (see + man page). Thus, if you divide the domain of some sublist(s) onto a + net set of sublists, you can use ezmlm-list(1) to collect the + addresses, ezmlm-split -D with the new split file to split them, then + after clearing the local subscriber databases use ezmlm-sub(1) to add + the correct addresses to each new sublist. The section on SQL support + describes an alternative way of managing sublists (see section ``ezmlm + support for SQL datbases''). + + 44..2288.. HHooww ttoo sseerrvviiccee ccoommmmaannddss iinn tthhee ssuubbjjeecctt lliinnee.. + + Rfc2142 (standards track) says that for each mailing list list@host, + there MUST be an administrative address list-request@host. This is not + the default for ezmlm, but can be added with ezmlm-make(1) ``-q'', + which adds a ezmlm-request(1) line before the ezmlm-manage(1) line in + DDIIRR//mmaannaaggeerr. This address is used to manage commands in the + ``Subject:'' line, by translating them into appropriate ezmlm command + messages. + + When migrating from other mailing list managers which use this method + to issue list commands, configuring ezmlm to respond to such commands + may be useful. In addition, some software manufacturers sell MUAs and + mail gateways that are unable to correctly transport rfc822-compliant + Internet mail with certain characters in the local part of the + address. + + ezmlm-request(1) services the list-request@host address per rfc2142 + (standards track). It is usually invoked in DDIIRR//mmaannaaggeerr before ezmlm- + get(1) and ezmlm-manage(1). It ignores all requests that are not for + the list-request address. For requests to the list-request@host + address, ezmlm-request(1) parses the ``Subject:'' line. If a ezmlm + command address starting with the contents of DDIIRR//oouuttllooccaall (e.g. list- + get45) is on the command line, ezmlm-request(1) generates the + corresponding full ezmlm request message. If the subject does not + start with the contents of DDIIRR//oouuttllooccaall, ezmlm-request(1) prefixes the + line with the contents of DDIIRR//oouuttllooccaall, thereby building a complete + ezmlm command. If a host name is specified, it must match the contents + of DDIIRR//oouutthhoosstt, i.e. ezmlm-request(1) in this function will only + generate command messages for the local list. + + Thus, a subject of ``subscribe'' to list-request@host will be auto- + magically rewritten as a message to list-subscribe- + userlocal=userhost@host. Similarly, any ezmlm command or ``Reply- + To:'' address can be pasted into the subject field and sent to list- + request@host. ezmlm-request(1) does not validate the command name, + but invalid commands result in a ``help'' message in reply via ezmlm- + manage(1). This allows ezmlm-request(1) to also service custom + commands, like list-faq@host that you may have created for your list. + + If the ``Subject:'' is empty or does not start with a letter, ezmlm- + request(1) will attempt to interpret the first message body line that + starts with a letter in the first position. + + When ezmlm-request(1) has successfully processed a ''request'' + command, it exits 99 to skip the rest of DDIIRR//mmaannaaggeerr. + + To set up a list to include ezmlm-request processing, use the ezmlm- + make(1) ``-q'' switch. The default is to not do this. + + + 44..2299.. HHooww ttoo ssuuppppoorrtt aalltteerrnnaattiivvee ccoommmmaanndd nnaammeess.. + + ezmlm-idx>=0.23 allows alternate names for all user commands. This can + be used to e.g. make a message to list-remove@host to result in an + ``unsubscribe'' action. This may help migration from other mailing + list managers and in non-English environments. The use of aliases + allows ezmlm to respond to new command names, while always responding + correctly to the standard commands. If ezmlm-request(1) is used it + will automatically be able to deal with any commands you set up for + the list, within ezmlm or as separate programs. See ``Multiple + language support'' on how to set up command aliases. + + + + + 44..3300.. HHooww ttoo aadddd yyoouurr oowwnn ccoommmmaannddss.. + + The qmail/ezmlm mechanism makes it very easy to add your own commands. + You can add them to DDIIRR//mmaannaaggeerr, but this requires great care in terms + of ordering and exit codes. Easier is to set them up separately with a + ..qqmmaaiill--lliisstt--ccoommmmaanndd file. + + Let's assume you want to allow anyone to determine how many + subscribers are subscribed to your list with the command list- + count@host. Just create a program to do the work: + + + #!/bin/sh + DTLINE='Delivered-To: list-count@host processor' + grep "$DTLINE" > /dev/null && + { echo "This message is looping"; exit 100; } + { + echo "$DTLINE" + cat <>1000) on a busy list, since by default all bounces are stored in a + single directory and ezmlm-warn(1) examines all of them with each + invocation. ezmlm-idx->=0.32 changes bounce handling to improve + performance for large lists. Bounces are stored in subdirectories of + DDIIRR//bboouunnccee//dd//, one per 10,000 seconds. The corresponding address + hashes are stored in 16 subdirectories of DDIIRR//bboouunnccee//hh//. Instead of + looking at all bounces, ezmlm-warn(1) processes only the bounces in + DDIIRR//bboouunnccee//dd// subdirectories that are ``due''. In addition, ezmlm- + warn(1) uses DDIIRR//bboouunnccee//llaassttdd as a simple lockout, to assure that it + will do work only at most once every 5.5 hours. (Times are scaled to + the ezmlm-warn(1) ``-t'' argument if used.) Together, these changes + assure that bounce handling will scale well in the default + configuration, even for very large lists. + + + 44..3388.. HHooww tthhee iinnffoo aanndd ffaaqq ccoommmmaannddss wwoorrkk.. + + The _-_i_n_f_o and _-_f_a_q commands simply reply with the contents of the + DDIIRR//tteexxtt//iinnffoo and DDIIRR//tteexxtt//ffaaqq files. Edit these files directly or + remotely (see ``How to remotely edit dir/text files''). The + DDIIRR//tteexxtt//iinnffoo file should start with a single line that is meaningful + as is and describes the list. This will be used in later versions to + allow automatic assembly of the global ``list-of-lists'' (see ``How to + set up a global list address like majordomo@host or listserv@host''). + + + 44..3399.. HHooww tthhee gglloobbaall eezzmmllmm lliisstt aaddddrreessss wwoorrkkss.. + + Sometimes, it is desirable to have a host- or user-wide address that + can list available mailing lists. + + ezmlm-request(1) can be used to set up a global address, such as + ezmlm@host which allows the user to see and interact with a number of + different mailing lists. This is especially useful when your users are + used to other mailing list managers, such as ``majordomo'' or + ``listproc''. ezmlm-request(1) is set up to answer requests to the + address (see ``How to set up a global list address like majordomo@host + or listserv@host''). There, it interprets the first line of the + message body as a command. It will reply directly to ``lists'' and + ``which'' commands. All other commands will be used to construct + messages to the respective lists. Where other mailing list managers + use synonyms of ezmlm commands, ezmlm-request(1) recognizes these and + translates them to the corresponding ezmlm commands. ezmlm-request(1) + will build commands also of unrecognized commands. Thus, if you create + new commands for a list, ezmlm-request(1) will automatically support + them. + + If the user does not specify the complete list address, ezmlm- + request(1) will attempt to complete the name. See the ezmlm-reject(1) + man page for more info. + + + 44..4400.. HHooww eezzmmllmm--ccrroonn wwoorrkkss.. + + If you are a user and have crond(8) access, if you do not need to get + digests at specific times, or if you are a system administrator + setting up lists, there is no reason for you to use ezmlm-cron(1). If + you are a system administrator not allowing users crond(8) access or a + user that needs digests at specific times, but without crond(8) + access, read on. + + ezmlm-cron(1) is a very restrictive interface to crond(8). ezmlm- + cron(1) can be used to create digest trigger messages. If a list is + set up with a digest code (see ezmlm-make(1) and ezmlm-get(1)) ezmlm + will generate a digest from the list joe-sos@host sent to to + subscribers of joe-sos-digest@dighost when receiving a message to joe- + sos-dig-code@host where ``code'' is the digest code. ezmlm-cron(1) can + be used to generate such messages at regular intervals. The file + eezzccrroonnrrcc is set up by the sysadmin and controls what trigger messages + specific users may set up via ezmlm-cron(1). + + Usually, the ezcronrc of that use will have an entry like + ``user:user-:host:10'' allowing ``user'' to create trigger messages + for up to 10 lists with names starting with ``user-'' and on the host + ``host''. + + To list the ezcronrc line controlling your use of ezmlm-cron(1): + + + % ezmlm-cron -c + + + + + To list all entries that you've created: + + + % ezmlm-cron -l + + + + + To add an entry to trigger digests from list@host every morning at + 0230: + + + % ezmlm-cron -t 02:30 -i24 list@host code + + + + + A new entry for the same list overwrites an old entry. + + To delete the entry above: + + + % ezmlm-cron -d list@host + + + + + or use ezmlm-cron to trigger messages at a different time: + + + % ezmlm-cron -t 16:16 -i24 list@host code + + + + 44..4411.. HHooww eezzmmllmm--mmaakkee wwoorrkkss.. + + ezmlm lists allow almost infinite customization. The component build, + together with the qmail delivery mechanism makes it possible to create + any variant of list function imaginable. However, this complexity + makes it somewhat daunting to the average user wanting to set up a + mailing list. ezmlm-make(1) allows automated list setup, while + permitting a large amount of configurability. + + At first glance, ezmlm-make(1) has many complicated options. However, + these can be applied iteratively through the ezmlm-make(1) edit + mechanism. Also, they are intended to be relatively complete so that + execution of ezmlm-make(1) by e.g. a GUI can be used to safely set up + and edit any list. + + ezmlm-make(1) reads its command line arguments and switches, then + creates the list directory. If the ``-e'' edit or ``-+'' sticky edit + switches are not specified, ezmlm-make(1) will fail if the directory + already exists. The directory argument must be an absolute path + starting with a slash. The dot-qmail file argument, if specified, must + also be absolute. + + ezmlm-make(1) next reads ezmlmrc(5) located in the //eettcc// directory + with a default install. If not found, the file in the ezmlm binary + directory will be used. The second ezmlm-make command line argument + specify the root name of the .qmail files. If the ezmlm-make(1) ``-c'' + switch is used, ezmlm-make(1) will look in that directory for a + ..eezzmmllmmrrcc file and use it instead. If this file does not exist, ezmlm- + make(1) will print a warning and use the previously discussed + ezmlmrc(5) files in the same order. You can also use ``-C + _e_z_m_l_m_r_c_._a_l_t'' to use _e_z_m_l_m_r_c_._a_l_t as the ezmlmrc(5) file. Again, ezmlm- + make(1) will fall back to the others with a warning, if the specified + ezmlmrc(5) file is not found. + + When not run in ``-e edit'' or ``-+'' sticky edit modes, ezmlm-make(1) + first creates the list directory. It also as the last step of its + action creates DDIIRR//kkeeyy containing the key used for cookie generation. + + The ezmlmrc(5) file consists of a number of file names relative to the + list directory, followed by conditional flags (see ezmlm-make(1) and + ezmlmrc(5) for details). If all the conditional flags (controlled by + the corresponding command line switches) are true, the lines that + follow are entered into the named file. There are also tags to erase + files. Tags in the format <#X#> (where ``X'' is any number, except + ``1'' and ``2'') are replaced by the corresponding ezmlm-make(1) + switch argument. The ezmlm-make(1) command line arguments and the + ezmlm binary path can be similarly substituted into the text. Thus, + ezmlmrc(5) controls (within reason) the entire operation of ezmlm- + make(1). ezmlmrc(5) is also set up so that no messages or file + containing list state information are lost. Therefore, ezmlm-make(1) + can be used to safely edit existing lists. The only caveat is that the + list state is undefined while editing is in progress. Thus, it is + advisable to prevent mail delivery by setting the ``sticky'' bit on + the user's home directory while editing lists. + + ezmlm-make(1) will create the file DDIIRR//ccoonnffiigg. This files saves all + the flags that were set at the last execution of ezmlm-make, as well + as all the switch and command line arguments. When editing a list, + only ``DIR'' and the non-default letter switches need to be specified. + Other command line arguments and the ``digit switch'' arguments are + read from DDIIRR//ccoonnffiigg. To remove a digit switch, simply use it with + two single quotes as the argument. + + You can also easily determine how a list was set up by looking at + DDIIRR//ccoonnffiigg. + + _N_o_t_e_: DDIIRR//tteexxtt// files will be created but not overwritten when using + the ``-e'' or ``-+'' edit switches. This is to preserve manual + customizations. To overwrite these and reset the files to the content + specified by eezzmmllmmrrcc, use ``-ee'' or ``-++''. + + _N_o_t_e_: As of ezmlm-idx-0.40 the ezmlm-make(1) ``-c'' and ``-C file'' + switches are sticky when using ``-+'' or ``-++'', so you do not need + to specify them. This feature is disabled if ezmlm-make(1) is run as + root. + + + 44..4422.. WWhhaatt nnaammeess ccaann II uussee ffoorr mmyy lliissttss?? + + Rather than restrict you to a single E-mail address (user@host), qmail + in the default setup gives you control over an infinite number of + addresses user-*@host. Of course, you (normally) have no way of + controlling elsewhere@host since that could lead to overlap between + users' ``e-mail address space''. As a consequence, all you mailing + lists have to be named user-xx@host where ``user'' is your user name + and ``xx'' is anything. You cannot create e.g. mylist@host, only user- + mylist@host. To create the list user-list@host do: + + + % ezmlm-make ~/list ~/.qmail-list user-list host + + + + + Notice that ``user'' is nnoott part of the ..qqmmaaiill file name. + + There are two way to create lists with names not starting with your + user name: First, qmail can be set up so that you control a virtual + domain (see below). Second, the system administrator can set up lists + with arbitrary names within the ~~aalliiaass// directory. + + + 44..4433.. LLiissttss iinn vviirrttuuaall ddoommaaiinnss + + If you use qmail>=1.02 and ezmlm-idx>=0.32, lists under virtual + domains work just like other lists and require no adjustments. You can + choose any local name for the list and the ezmlm-make(1) argument + ``local'' is that name; ``host'' is the name of the virtual domain. + + + 44..4444.. HHooww ddoo II mmaakkee ccuussttoommiizzaattiioonn ssiimmppllee ffoorr mmee//mmyy uusseerrss?? + + All non-default switches, ezmlm-issubn(1) setups, etc, can be made + standard for new lists by customizing the ezmlm-make(1) configuration + file named ``eezzmmllmmrrcc''. A default eezzmmllmmrrcc((55)) is installed in the + ezmlm binary directory. If installed, a system-wide customized ezmlmrc + file in //eettcc//eezzmmllmmrrcc (or symlinked from there) overrides this. + Installing a ~~//..eezzmmllmmrrcc file in a user ddoottddiirr and using the ezmlm- + make(1) ``-c'' switch allows further per user customization (see + ``Customizing ezmlm-make operation''). + + + 55.. eezzmmllmm ssuuppppoorrtt ffoorr SSQQLL ddaattaabbaasseess.. + + + 55..11.. WWhhyy uussee aann SSQQLL ddaattaabbaassee wwiitthh eezzmmllmm?? + + The main advantages are that you are using an address database system + that can easily be accessed from any number of other programs via + ODBC, perl, java, PHP, ... You can easily hook up ezmlm with your + customer database, etc. ezmlm programs compiled with SQL support (and + when available also those compiled with support for other SQL servers) + are entirely backwards compatible. You can mix SQL dbs with normal + ezmlm dbs, and convert lists between them. + + + 55..22.. WWhhyy nnoott ttoo uussee aann SSQQLL ddaattaabbaassee wwiitthh eezzmmllmm.. + + The main disadvantages of the SQL version are that you need to be + familiar with the SQL server, the binaries are quite a bit larger, and + you are trusting your addresses to a large database program, rather + than a small and easily audited set of ezmlm programs. Also, the SQL + server becomes a single point of failure. + + Ezmlm with SQL support continues to rely on qmail stability. If + connection fails, ezmlm aborts with a temporary error causing + redelivery at a later time point. + + + 55..33.. TTaabblleess uusseedd ffoorr ((MMyy))SSQQLL ssuuppppoorrtt.. + + The basic philosophy is that the database can be on any host (if you + use SENDER restrictions, connectivity to the main host is more + important than to the sublists), and you choose the database and + ``table root'' names. The default database is ``ezmlm'' and the + default table root is ``list''. Each list has a separate table root. + Any number of lists can share a database. + + The main list address table is named with the table root only, others + have that name with various suffixes. In the following ``list'' is + used as the table root. + + + 55..33..11.. AAddddrreessss ttaabblleess.. + + + lliisstt + List subscriber addresses. + + lliisstt__ddiiggeesstt + Digest list subscriber addresses. + + lliisstt__aallllooww + List subscriber alias addresses. Used only if SENDER + restrictions are used for the list. This is configured in the + default SQL list setup, but a local (ezmlm-style non-SQL) + database could also be used. + + lliisstt__ddeennyy + List deny addresses. This table is created, but the default + configuration, if it uses the ``deny'' addresses at all, will do + so with a local database. + + lliisstt__mmoodd + Moderator addresses. Created for completeness, but not used in + the default configuration. If moderators are used, the addresses + are stored in a local database. + + + 55..33..22.. SSuubbssccrriibbeerr lloogg ttaabblleess.. + + For each of the above tables, there is a ``*_slog'' table that + contains one row per transaction against the corresponding address + table. The entries contain a time stamp, the subscription address; a + direction indicator (``-'' for removals, ``+'' for additions); a type + indicator (blank for ezmlm-manage, ``m'' for ``manual'', ``p'' for + ``probe, i.e. bounce handling; and the subscriber ``From:'' line + contents (only additions and only when made by ezmlm-manage or by + ``ezmlm-sub(1) -n''). + + + 55..33..33.. MMeessssaaggee llooggggiinngg ttaabblleess.. + + For both the list and the digest list, there are a pair of tables that + log messages: + + + lliisstt__ccooookkiiee + The main list stores the message number and a pseudo-random + cookie in this table when it processes the message. The cookie + is derived from the secret DDIIRR//kkeeyy, the message sender and the + message number. Thus, it is non-repeating and virtually + impossible to guess beforehand. Sublists will check that the + cookie sent with the message is the same as the one received + with the message. + + The digest list is created similarly, except that it is ezmlm- + get(1) that originates the message and creates the cookie. This + is done in ``list_digest_cookie''. + + + lliisstt__mmlloogg + Both the main list and the sublists make entries in this table. + Each entry consists of a time stamp, a message number, a list + number, and a code. The code is 0 for message arrival, 1 for + ``finished processing'', 2 for ``receipt received'' and -1 for + bounce. The lists will refuse to process messages that do not + have the correct cookie, or if the message already has an entry + with a code of greater than 0. To inject a message at the + sublist, an attacker would have to inject a message with the + correct code before the list has processed the ``real'' message, + or subvert the SQL server. In practice, this is very hard to do, + unless the attacker has broken security at the database server + or a sublist. This authentication mechanism is intended to make + it safe to sublist moderated lists. It also blocks any message + duplication between main list and sublist from being propagated + to the subscribers. + + The codes 2 for ``receipt received'' and -1 for bounce are + entered by ezmlm-receipt(1) at the main list. This program is + configured instead of ezmlm-return(1) if the main list was set + up with ``ezmlm-make -w6''. ezmlm-receipt(1) checks the cookie + of messages addresses to mainlocal-return-receipt@mainhost and + if correct enters the ``receipt received'' code. This address is + normally in the subscriber database with a hash of 98, so that + each list sends a message to the address _a_f_t_e_r all subscriber + addresses. + + Bounces of sublist messages should not lead to removal of the + sublist from the database. ezmlm-receipt(1) will instead log the + bounce to the ``list_mlog'' table. It will also store up to 50 + bounces in the bounce directory. This helps error detection and + diagnosis. After the first 50 bounces, no more bounces are + stored, until you manually remove the old ones. This is to + prevent filling up your hard disk in case a configuration error + causes a deluge of bounces. + + The digest list is treated in the same manner. Here, the tables + is ``list_digest_mlog'' and the feedback address is mainlocal- + digest-return-receipt@mainhost. + + + + + 55..44.. HHooww ttoo sseett uupp aa ssiimmppllee lliisstt wwiitthh SSQQLL ssuuppppoorrtt.. + + To use SQL database support, you have to compile the programs with SQL + support. Currently, only MySQL support is available. See IINNSSTTAALLLL..iiddxx + in the package on how to do this. + + The programs with SQL support will work exactly like the normal + programs for standard lists. However, if the file ssqqll exists in the + basedir, it turns on the SQL mode and it is expected to contain SQL + server connect info in the format + + ``host:port:user:password:database:table'' + + + Here, ``Host'' is the SQL database server host, ``port'' can be left + blank to use the default port, ``user'' and ``password'' are connec- + tion credentials for a user you need to define and grant access to the + database. ``Table'' is the name of the address table (``list'' in the + examples above and ``list_digest'' for the corresponding digest list). + For list clusters, ``:sublist'' is suffixed to this info and it is the + name/address of the sublist. + + For each address database, you also need to create the address table + as well as the ``*_slog'' subscription log table. In addition, you + should create a ``*_cookie'' and ``*_mlog'' table for message logging. + This is all it takes to start using an SQL database. + + + 55..44..11.. HHeellppeerr pprrooggrraammss ffoorr SSQQLL--eennaabblleedd lliissttss.. + + Two programs are supplied in the distribution to make it easier to + create the database user and tables. Also, ezmlm-make(1) has support + for setting up SQL-enabled lists. + + + CCrreeaattiinngg tthhee ttaabblleess + ezmlm-mktab(1) will create the necessary tables: + + + % ezmlm-mktab -d table + + + + + Pipe this into the SQL client with the appropriate administrator + credentials needed to create tables (see MySQL documentation, e.g. + ). + + For most lists, the only addresses that are stored in the SQL + database are the subscribers of list and digest, and the ``allow'' + aliases. It is NOT normally advisable to store moderator addresses + there, since they are needed only at the main list and secrecy is + more important. ``Deny'' addresses are few and again only needed at + the main list. ``Allow'' are put in the SQL database when using the + default ezmlmrc file only to make all relevant addresses + manipulatable via the SQL server. The other tables are created, in + case they are wanted (the cost for having them as empty table is + zero). The basedir/sql file is the decision point. If it exists, an + SQL table is used; if not a local ezmlm db is used. + + + CCrreeaattiinngg aa uusseerr eennttrryy + Create a user that has full access to the database from the list + host. How to do this depends on the RDBMS. + + + CCrreeaattiinngg tthhee lliisstt + ezmlm-make(1) supports SQL-enabled lists with the ``-6'' switch: + + + % ezmlm-make other_switches -6 'host:port:user:pw:db:table' \ + dir dot local host + + + + + Will create an SQL-enabled list that uses the SQL server for the + main list subscribers, digest list subscribers (if configured) and + ``allow'' poster alias addresses (if configured). + + + 55..55.. MMaannuuaallllyy mmaanniippuullaattiinngg tthhee ssuubbssccrriibbeerrss ooff aa SSQQLL--eennaabblleedd lliisstt.. + + ezmlm-sub(1), ezmlm-unsub(1), and ezmlm-list(1) work as you would + expect also with a SQL-enabled list. ezmlm-list(1) may be minimally + slower (depending on network speed) if the SQL server is not local. + ezmlm-sub(1) and ezmlm-unsub(1) will be faster, but this is noticeable + only with very large subscriber lists and addition/removal of large + numbers of addresses (more than several thousands). + + + 55..66.. CCoonnvveerrttiinngg ttoo aanndd ffrroomm aanndd SSQQLL ddaattaabbaassee.. + + Just like other programs, ezmlm-list(1), ezmlm-sub(1), and ezmlm- + unsub(1) will work with normal address databases in the absence of + DDIIRR//ssqqll. However, they also have a ``-M'' switch to force this + behavior even in the presence of DDIIRR//ssqqll. This is used to convert an + address database from the standard type to the SQL type: + + + % ezmlm-list -M dir | xargs ezmlm-sub dir + + + + + or from the SQL version to the standard type: + + + % ezmlm-list dir | xargs ezmlm-sub -M dir + + + + + To synchronize the two, remove one and then update it with ezmlm- + sub(1) from the other. Alternatively, sort the ezmlm-list(1) output + for both, use diff and sed/awk to get separate files of the differ- + ences, and use ezmlm-sub(1) and ezmlm-unsub(1) to apply the differ- + ences to the appropriate database. + + This type of conversion can serve as a convenient means to convert a + list from one type to another, to back up databases, and to move + subscriber addresses from a standard list to a SQL table for other + purposes, or from a SQL database to a standard mailing list (you may + need to use addresses from a SQL table, without wanting your lists to + be dependent on an SQL server for day to day operation). + + _N_o_t_e_: This inter-conversion requires the DDIIRR//ssqqll file. If you do not + run the list against an SQL server, you need to disable deliveries + before you temporarily create this file. Otherwise, the list will run + against the SQL database during the time DDIIRR//ssqqll exists. + + + 55..77.. OOppttiimmiizziinngg MMyySSQQLL ffoorr eezzmmllmm.. + + + 55..77..11.. AAddddrreessss SSEELLEECCTTss,, aaddddiittiioonnss,, rreemmoovvaallss.. + + ezmlm-idx-0.40 simplifies the SQL support and queries over ezmlm- + idx-0.32 at the cost of dropping distributed sublist support. We have + figured out a simpler way to support the latter, which hopefully will + be incorporated into ezmlm in the future (written under contract). + + With the simplification, the queries are very straight forward, and + tuning is indicated only under extreme circumstances (very many very + large and busy lists or constant addition/removal of many addresses). + + + 55..88.. MMaaiinntteennaannccee ooff tthhee MMyySSQQLL ddaattaabbaassee.. + + Weekly to monthly error checks on MySQL tables is recommended. Best is + to use: + + + # isamchk -s -O readbuffer=2M */*.ISM + + + + + Other options allow automatic correction of errors, but are dangerous + if tables are accessed while isamchk is running. + + Other isamchk options allow recovery of space after frequent + insert/delete of addresses (can also be done with ``OPTIMIZE TABLE''), + key optimization, etc. See the MySQL documentation ( + ) for more info. + + + 66.. PPoossssiibbllee eerrrroorr ccoonnddiittiioonnss iinn eezzmmllmm lliissttss.. + + + 66..11.. WWhhaatt ddoo II ddoo iiff eezzmmllmm ddooeessnn''tt wwoorrkk?? + + Try to determine where the problem occurs and how to reproduce it: + + +o Do messages to ezmlm return an error message to the sender or not? + + +o What is/are the error message(s)? + + +o What does ezmlm log into the mail log? + + +o Are you using a setup with virtual domains, and qmail<1.02 or + ezmlm-idx<0.31? If so, have you adjusted DDIIRR//iinnllooccaall (see + ``Adapting ezmlm-make for virtual domains'')? + + +o Are posts sent out to the subscribers? + + +o Are there subscribers? + + + % ezmlm-list DIR + + + + + +o Are there moderators? + + + + % ezmlm-list moddir + + + + + where ``moddir'' is the contents of DDIIRR//rreemmoottee (for remote admin + lists), of DDIIRR//mmooddssuubb (for subscription moderated lists) or DDIIRR//mmoodd-- + ppoosstt (for message moderation), if and only if the contents start with + a forward slash. The default in all cases is DDIIRR//mmoodd//. If both + DDIIRR//mmooddssuubb and DDIIRR//rreemmoottee contain directory names, the one in DDIIRR//mmoodd-- + ssuubb is used for both subscription moderation and remote admin. + + +o Are the ownerships of all files correct, i.e. read/writable for the + owner? + + + % chown -R user DIR + + + + + For lists under alias: + + + % chown -R alias DIR + + + + + If you use custom moderator databases, those directories and all their + contents must also be readable for the user under which the list oper- + ates (i.e. the user qmail changes to during the delivery). + + +o Read the qmail log and capture relevant parts. + + +o Did you customize the package at all? If so, try the default + settings which are known to work. + + +o Did you customize eezzmmllmmrrcc((55))? Try to use the default copy (skip the + -c switch). + + +o Did your customization of ..eezzmmllmmrrcc fail to have an effect? + Remember to use the -c switch. The ..eezzmmllmmrrcc file used is the one in + ``dotdir'', i.e. the directory where the ..qqmmaaiill files go, usually, + but NOT necessarily, the one in your home directory. + + +o Make sure you followed the instructions in man pages and other + documentation. Most of the problems are due to not closely + following the instructions. Try again with a new test list. + + +o Make sure to take notes of how the list was created (which flags + you used, etc.). + + +o use ezmlm-check(1) (see ``Using ezmlm-check to find setup + errors''). and compare the variables identified by ezmlm-check to + DDIIRR//iinnllooccaall, etc. If you don't get a reply from ezmlm-check, then + message was not delivered properly. Check your qmail setup. + + +o Try to find your problem or a question/item close to it in the FAQ. + + +o If this didn't resolve the problem, post to the ezmlm mailing list, + describing how you set up the list, your general setup (especially + the relevant control files for a virtual domain), what works and + what doesn't and what results from different actions (log entries, + error messages). + + If you have solved a problem that you believe might be more general, + please send a description of the problem and its solution to the + authors, ideally as a FAQ item. + + + 66..22.. HHooww ddoo II rreeppoorrtt eezzmmllmm bbuuggss?? + + If you have found a bug in the ezmlm-idx additions, please send a bug + report by E-mail to lindberg@id.wustl.edu. Describe the error, your + setup, and your system in sufficient detail so that it can be + reproduced by third parties. Include relevant sections of mail log, + and information about any error messages returned. If you ran into a + problem and resolved it on your own, include a fix as a context diff + against the distribution. + + If you have found a bug in ezmlm proper (unlikely), please send a + similar bug report to djb@cr.yp.to or djb-ezmlm@cr.yp.to. If you're + unsure where the bug is, you can start with lindberg@id.wustl.edu. If + you have problems and questions, please refer to the documentation, + then to mailing list archives, then E-mail the ezmlm mailing list or + the authors. + + + 66..33.. WWhheerree ddoo II sseenndd ssuuggggeessttiioonnss ffoorr eezzmmllmm--iiddxx iimmpprroovveemmeennttss?? + + E-mail to lindberg@id.wustl.edu, ideally with a context diff. For + ezmlm proper, ezmlm@list.cr.yp.to may be better. + + + 66..44.. UUssiinngg eezzmmllmm--tteesstt ttoo cchheecckk tthhee eezzmmllmm((--iiddxx)) pprrooggrraammss.. + + ezmlm-test(1) tests the different ezmlm(-idx) programs. It is useful + to test your installation. If this program succeeds, it is not likely + that you have problems due to platform-specific ezmlm(-idx) bugs. If + ezmlm-test(1) fails, this is the place to start. The program is good + at finding problems but not that easy to use to determine the cause. + Start by finding the place where it fails, recreate the conditions + (add ``exit 0'' just before the point of failure and set the + environment variables as set by the script), then try to run the + command manually. ~~//____TTSSTTDDIIRR____eerrrr may contain a relevant error + message. For further help, E-mail lindberg@id.wustl.edu. + + + 66..55.. UUssiinngg eezzmmllmm--cchheecckk ttoo ffiinndd sseettuupp eerrrroorrss.. + + ezmlm-check(1) is included in the ezmlm-idx distribution. ezmlm- + check(1) is an evolving shell script which when put into a ..qqmmaaiill file + of a mailing list will return information about the environment + variables passed by qmail to ezmlm as well as the list setup. It also + attempts to check for common error conditions, such as HOST and + DDIIRR//iinnhhoosstt mismatch, missing files, etc. To use ezmlm-check(1), place + a line: + + + |/usr/local/bin/ezmlm/ezmlm-check 'DIR' + + + + + where ``DIR'' is the list directory, as the first line in DDIIRR//eeddiittoorr + (for mail to list), DDIIRR//mmaannaaggeerr (for mail to list-subscribe, list- + help, etc), DDIIRR//mmooddeerraattoorr (for mail to list-accept, list-reject). + ezmlm-check(1) will send its output to SENDER. The rest of the ..qqmmaaiill + file will be ignored. If you use a non-standard ezmlm binary direc- + tory, change the ezmlm-check(1) path accordingly. + + ezmlm-check(1) in combination with mail logs and ezmlm error messages + should make it easy to diagnose setup problems. When done, don't + forget to remove the ezmlm-check(1) line. It is not security-proofed + against SENDER manipulation and with it in place, the list won't work. + + ezmlm-check(1) does not check all aspects of list generation, but + catches all common errors when lists are created with ezmlm-make(1), + an many other errors as well. The ezmlm-check(1) reply is also very + valuable for support via E-mail. + + + 66..66.. PPoossttss aarree rreejjeecctteedd:: SSoorrrryy,, nnoo mmaaiillbbooxx hheerree bbyy tthhaatt nnaammee + ((##55..11..11)).. + + qmail tried to deliver the mail, but there is no mailbox with that + name. ezmlm-make(1) was used with incorrect arguments, often in + conjunction with a virtual domain setup. If the list is in a virtual + domain, the ``host'' argument for ezmlm-make(1) should be the virtual + domain, not the real host name. See ``What names can I use for my + mailing lists?'' and ``Lists in virtual domains'' for more info. + + Other possibilities are that your qmail setup is incorrect. For a + virtual domain controlled by user ``virt'', create ~~vviirrtt//..qqmmaaiill--tteesstt + containing ``|/bin/echo "It worked"; exit 100''. Now send mail to + test@virtual.dom. If delivery works, you should get an error message + ``It worked'' back. If you get anything else, you need to adjust your + qmail setup. Similarly, for a normal user, create ~~uusseerr//..qqmmaaiill--tteesstt + and mail user-test@host to test that you control extension addresses. + If this fails, contact your system administrator or adjust your qmail + setup. + + If these tests worked, but your list still does not, you most likely + supplied an incorrect ``dot'' argument for ezmlm-manage(1). It should + be ~~vviirrtt//..qqmmaaiill--tteesstt for the list test@virtual.dom and ~~uusseerr//..qqmmaaiill-- + tteesstt for the list user-test@host. + + + 66..77.. PPoosstt aarree nnoott sseenntt ttoo ssuubbssccrriibbeerrss.. + + + NNoonn--mmooddeerraatteedd lliissttss + + 1. Read the qmail log. Is your message delivered to the list? + You can also: + + + + % cat DIR/num + + + + + 2. Send a message to the list. + + 3. See if it was received/processed: + + + + % cat DIR/num + + + + + If the number was incremented, the message went to the list, and + was successfully sent out in the opinion of ezmlm-send(1) + (ezmlm-send(1) doesn't mind if there are no subscribers, so + check that there really are both moderators and subscribers. + These are added with ezmlm-sub(1). You can not just put + addresses into a text file!). + + + MMeessssaaggee mmooddeerraatteedd lliissttss + + 1. Check number of queued messages awaiting moderation: + + + + % ls -l DIR/mod/pending + + + + + 2. Send a message to the list. + + 3. Check if another message was added to the queue: + + + + % ls -l DIR/mod/pending + + + + + A new file should have appeared. If this file has the owner exe- + cute bit set, it was successfully processed by ezmlm-store(1). + If this is true, but no moderation request was sent, then con- + tinue with ``Messages posted to the list do not result in moder- + ation requests''. If there is no new file, the message did not + reach ezmlm-store(1), or ezmlm-store(1) failed early. In both + cases, the mail log should tell you more. + + If the message is there, but the owner execute bit is not set, + ezmlm-store(1) failed. Check the mail log. Possible reasons + include a failure to find the ezmlm-send(1) binary or DDIIRR//mmssgg-- + ssiizzee is specified and the message body size is outside of the + allowed range (again, this is accompanied by an error message + and mail log entry). + + + GGeenneerraall + + 1. If the message was not received/processed, there should be an + error message in the mail log. + + 2. Fix temporary and permanent errors with the help of qmail and + ezmlm documentation. + + 3. If there is no log entry at all, then the mail went to + another host. Check your qmail setup. + + 4. If mail was delivered to the list, but not forwarded to the + subscribers (check the qmail log - there should be an entry + for a new delivery to the list), tthhee mmoosstt ccoommmmoonn eerrrroorr iiss + tthhaatt tthheerree aarree nnoo ssuubbssccrriibbeerrss.. In this case, ezmlm-send(1) + sends a message from list-help@host, and logs success, but no + recipients are logged. To qmail, it is perfectly acceptable + to send a message without recipients, so no error message is + logged. + + 5. Check subscribers: + + + % ezmlm-list DIR + + + + + 6. Assure that ownerships are correct on the list directories: + + + % chown -R user DIR + + + + + For lists owned by the ``alias'' user (in ~alias): + + + % chown -R alias DIR + + + + + 7. Most other problems should be easily corrected with the help + of the qmail log. + + + 66..88.. eezzmmllmm--mmaakkee ffaaiillss:: uussaaggee:: eezzmmllmm--mmaakkee ...... + + The command line you specified is incomplete. Usually, a command line + argument has been omitted or a switch was placed after the other + arguments rather than before. + + The same error is issued when you attempt to invoke ezmlm-make(1) with + only the ``DIR'' argument without using the ``-e'' or ``-+'' switch. + Other command line arguments can be omitted only when editing lists + created or previously edited with ezmlm-make from ezmlm-idx>=0.23. + + Some special situations use ezmlm-make(1) as a general script + processor, e.g. the setting up of sublists with ezmlmsubrc(5) and of + a global interface with ezmlmglrc(5). Here, there is no ``memory'' so + all arguments have to be specified, even when using the ``-e'' or + ``-+'' switches. + + + 66..99.. eezzmmllmm--mmaakkee ffaaiillss:: UUnnaabbllee ttoo ccrreeaattee ...... + + This error occurs when ezmlm-make is used to set up a list, and it + tries to create a directory or a ..qqmmaaiill--lliisstt link that already exists. + Usually, this occurs because the list already exists. If you are + creating a new list, first erase remnants of any old test lists by + deleting the list directory and the link files: _N_O_T_E_: _D_O _N_O_T _U_S_E _T_H_E_S_E + _C_O_M_M_A_N_D_S _W_I_T_H_O_U_T _U_N_D_E_R_S_T_A_N_D_I_N_G _T_H_E_M_. You may erase more than you + intended! + + + + % rm -rf DIR + % rm -rf ~/.qmail-list ~/.qmail-list-* + + + + + If you want to save some files (such as in DDIIRR//tteexxtt//), make backup + copies first, run ezmlm-make, then copy the backups to DDIIRR//tteexxtt//. Of + course, it is usually easier to create a custom ..eezzmmllmmrrcc, and than use + that for all your lists. + + To use ezmlm-make(1) to modify an existing list, without changing the + subscriber or moderator lists or the message archive, use the ezmlm- + make ``-e'' switch. With this, you need to re-specify all desired + switches. If instead you use ``-+'' you need to specify only switches + that are changed/new. NOTE: any customization that you've made to + program files like DDIIRR//eeddiittoorr will be overwritten. For instance, if + you manually added checks to DDIIRR//eeddiittoorr or added a pointer to a custom + moderator database in e.g. DDIIRR//mmooddssuubb these changes will be lost. To + retain such changes (especially ones that are common for several of + your lists), place them in a local ~~//..eezzmmllmmrrcc file instead. You can + either make such changes the default for your lists, or you can + configure ~~//..eezzmmllmmrrcc so that they are added only if a specific ezmlm- + make switch is used. (see ``Customizing ezmlm-make operation''). + + + 66..1100.. eezzmmllmm--mmaakkee ffaaiillss:: ...... eezzmmllmmrrcc ddooeess nnoott eexxiisstt + + There is no readable ezmlmrc(5) file in //eettcc//eezzmmllmm nor in the ezmlm + binary directory. If you have ..eezzmmllmmrrcc in ``dotdir'' (see + ``Terminology: dotdir'') use the ezmlm-make(1) ``-c'' switch (see + ``Customizing ezmlm-make operation''). _N_o_t_e_: The default location for + a global edited eezzmmllmmrrcc file is //eettcc//eezzmmllmm//eezzmmllmmrrcc as of ezmlm- + idx-0.40. + + + 66..1111.. IInnddeexx//ggeett//tthhrreeaadd rreeqquueessttss ffaaiill qquuiieettllyy oorr wwiitthh eerrrroorrss ffrroomm + eezzmmllmm--mmaannaaggee.. + + Make sure this is an indexed list and has an ``ezmlm-get'' line first + in DDIIRR//mmaannaaggeerr. If not, your commands are fed directly to ezmlm- + manage(1). If they contain ``-'', ezmlm-manage interprets the rest as + an address to which it sends the error message. Usually, this results + in a "trash address" mail log entry and a bounce, which is why you + don't see any error message. The same happens if you send non-existing + commands followed by ``-'' and arguments. Thus, list-gugu-54@host + results in an ezmlm-manage error, resulting in help text being sent to + 54@localhost ... When testing, try using syntax with a ``.'', not a + ``-'', after the action command, e.g. list-get.54_60@host. This will + assure that error messages get back to you. + + + 66..1122.. DDiiggeesstt ttrriiggggeerriinngg rreeqquueessttss ffaaiill.. + + (Digest triggering by mail is a relic from older versions. Use the + standard setup with ezmlm-tstdig(1) as by ezmlm-make(1) ``-d'', or run + ezmlm-get(1) directly from the command line via crond(8).) + + If you get an error message, it tells you why the request failed. If + you do not, see the previous item. Try using syntax without ``-'' + after the ``dig'' command. Also, requests that would result in an + empty digest are silently ignored, but the reason why no digest was + created is logged to the mail log. This is done so that cron scripts + generating daily digest will just fail silently, rather than + generating an error, for what isn't really one. + + + 66..1133.. RReemmoottee aaddmmiinniissttrraattiioonn ((uunn))ssuubbssccrriibbee ccoonnffiirrmm rreeqquueessttss ggoo ttoo tthhee + uusseerr,, nnoott tthhee mmooddeerraattoorr.. + + Either the list is not set up for remote administration (i.e. + DDIIRR//rreemmoottee does not exist), or the moderator is sending the request + from an address that is not in the moderator database (e.g. from + Fred@host.dom, when fred@host.dom is in the moderator db, but + Fred@host.dom is not). ezmlm-manage(1) has no way of knowing that the + SENDER is a moderator and treats the request as coming from a regular + user, i.e. it sends a confirmation request to the target address. + Correct the SENDER address, the address in the moderator db, or create + DDIIRR//rreemmoottee. If you are using a non-default moderator db location, make + sure that the moddir name is in DDIIRR//rreemmoottee (for remote admin only) or + DDIIRR//mmooddssuubb (if there is subscription moderation as well). In both + cases, the contents will be ignored unless they start with a ``/''. + + + 66..1144.. ((UUnn))ssuubbssccrriibbeerrss ddooeess nnoott rreecceeiivvee aa ((uunn))ssuubbssccrriibbee aacckknnoowwlleeddggee-- + mmeenntt + + With normal ezmlm lists, a subscriber confirming a subscription or a + non-subscriber confirming a unsubscribe request results in a message + to the target address. This message is suppressed when the list is set + up for subscription and/or remote administration, so that + confirmations from multiple moderators do not result in multiple + messages to the target address. The target address is always notified + if the subscriber status of the address changes (from non-subscriber + to subscriber or vice versa). + + + 66..1155.. MMeessssaaggeess ppoosstteedd ttoo aa mmooddeerraatteedd lliisstt aarree sseenntt oouutt wwiitthhoouutt mmooddeerr-- + aattiioonn.. + + The list is not set up as a moderated list. Check DDIIRR//eeddiittoorr. If + should contain a ezmlm-store(1) line after the ezmlm-reject line if it + is a moderated list. No ezmlm-send(1) line should be in DDIIRR//eeddiittoorr. + If there is, the list is not moderated. Also, DDIIRR//mmooddppoosstt must exist. + If it does not, ezmlm-store(1) will post the messages directly (via + ezmlm-send(1)) without sending them out for moderation first. This + makes it easy to temporarily remove message moderation by simply + removing DDIIRR//mmooddppoosstt, but may be confusing if the user is unaware of + this ezmlm-store(1) feature. + + + 66..1166.. MMeessssaaggeess ppoosstteedd ttoo aa mmooddeerraatteedd lliisstt ddoo nnoott rreessuulltt iinn mmooddeerraattiioonn + rreeqquueessttss.. + + + +o Check that ~~//..qqmmaaiill--lliisstt is a link to DDIIRR//eeddiittoorr. + + +o Check that DDIIRR//eeddiittoorr contains ezmlm-store(1) and not ezmlm- + send(1). If this is not the case, the list is not message + moderated. + + +o Check for the presence of DDIIRR//mmooddppoosstt. If this file is missing, the + list is not moderated, even if DDIIRR//eeddiittoorr is set up with ezmlm- + store(1). + + +o Check qmail logs for error conditions during post delivery and + correct these. If the messages are delivered correctly, verify that + ezmlm-store(1) generated the moderation requests to the moderators. + + +o Check to see that there are indeed moderators: + + + + % ezmlm-list moddir + + + + + where ``moddir'' is the contents of DDIIRR//mmooddppoosstt if they start with a + ``/'', otherwise those of DDIIRR//rreemmoottee (same ``/'' requirement), and + DDIIRR//mmoodd// by default. + + + +o Check file ownerships. + + Another common problem is directory ownerships, especially for + lists under ~alias. To correct this error, issue the following + command while in the ~alias directory (User the user/group of the + list owner; for ~alias lists user=alias, group=qmail): + + + % chown -R user DIR + + + + + + 66..1177.. MMooddeerraattiioonn rreeqquueesstt rreepplliieess ddoo nnoott rreessuulltt iinn tthhee aapppprroopprriiaattee + aaccttiioonn.. + + + +o Check that the address in the moderation request is correct. + + +o Check that the ~~//..qqmmaaiill--lliisstt--aacccceepptt--ddeeffaauulltt and ~~..//qqmmaaiill--lliisstt-- + rreejjeecctt--ddeeffaauulltt links exists and point to DDIIRR//mmooddeerraattoorr. + + +o Check that DDIIRR//mmooddeerraattoorr invokes ezmlm-moderate(1), and that there + is a copy of ezmlm-send(1) in the ezmlm binary directory. + + +o Check the qmail log to see that the replies were delivered to this + address. + + +o Check directory ownerships. For lists under alias: + + + + % chown -R alias DIR + + + + + _N_O_T_E_: This needs to be done every time you add/remove moderators as + ``root''. For user-controlled lists (i.e. you are ``user'' when run- + ning e.g. ezmlm-sub(1)) this is not a problem. + + If setting up lists for _a_l_i_a_s, you can avoid many problems by setting + them up as ``alias'', i.e. use ``su alias'' not ``su''. + + If setting up lists for a user controlling a virtual domain, you can + avoid many problems by assuming that uid (``su user'') before making + any changes. + + +o Check the qmail logs: After the delivery of the moderation request, + ezmlm-send(1) should run to send messages to all the list + subscribers. + + +o Make sure there are list subscribers: + + + + % ezmlm-list DIR + + + + + Most error conditions, incorrect request cookies, etc, should result + in informative error messages in the mail log. + + + 66..1188.. MMooddeerraattoorr ccoommmmeennttss wwiitthh mmooddeerraattiioonn rreeqquueesstt rreepplliieess aarree nnoott + aaddddeedd ttoo tthhee ppoosstt//sseenntt ttoo tthhee ppoosstteerr.. + + Moderator comments are where the moderator chooses to ``reject'' the + message and inform the person posting which his/her message was + inappropriate. However, if a moderator wants to comment on aacccceepptteedd + posts, the moderator may only do so via a follow-up post to the list. + This is to avoid anonymously tagged-on text to posts. If a moderator + has something to say to the list, they should (and can only) do so in + regular posts. If you want to edit posts before sending them to the + list, set up a moderated list with you as the only moderator. Into + DDIIRR//eeddiittoorr before the ezmlm-store(1) line, put a condredirect(1) line + that redirects all messages with a SENDER other than you to your + address. You can edit the contents ands repost, the message will pass + condredirect(1), and hit ezmlm-store(1). You will be asked to confirm + (needed to assure that nobody else can post directly) and when you do, + the messages is posted. + + Moderator comments for ``reject(ed)'' posts need to be enclosed + between two lines (yes, the end marker is required), having ``%%%'' + starting on one of the first 5 positions of the line. If there are + characters before the marker, these will be removed from any comment + line that starts with the same characters (e.g. the characters before + ``comment2'' in the example below will be removed): + + + %%% + comment + %%% + + + or: + + + > %%% + comment + > comment2 + > %%% + + + but not: + + %% + COMMENT + %% + + + and not: + + %%% this is my comment %%% + + + or + + ezmlm said>%%% + comment + ezmlm said>%%% + + + + + 66..1199.. SSoommee hheeaaddeerrss aarree mmiissssiinngg ffrroomm mmeessssaaggeess iinn tthhee ddiiggeesstt.. + + By default, only a subset of message headers are sent out in any + digest and archive retrieval requests. First, headers in + DDIIRR//hheeaaddeerrrreemmoovvee are stripped. Most non-essential headers are excluded + when the default archive retrieval format (``m'') is used. Use the + ``v'' or ``n'' format (see ezmlm-get(1)) to get all message headers + that are in the archive. + + + 66..2200.. SSoommee RReecceeiivveedd:: hheeaaddeerrss aarree mmiissssiinngg ffrroomm mmeessssaaggeess.. + + ezmlm-idx>=0.313 removes all but the latest ``Received:'' header from + messages sent to the list. This is done since messages, especially + sent via sublists, may have so many ``Received:'' headers that MTAs + with primitive ``loop detection'' erroneously reject them. The + subscriber can subscribe, since those messages have fewer such + headers, and will receive warning and probe messages, but never see + any posts. + + To see all headers of a message for diagnostic purposes, mail + mainlist-getv.num@mainhost, where ``num'' is the message number. All + ``Received:'' headers are stored in the archive copy of the message. + + To disable ``Received:'' header pruning, use the ezmlm-send(1) ``-r'' + switch. + + + 66..2211.. MMyy MMuutttt uusseerrss ccaannnnoott tthhrreeaadd tthheeiirr ddiiggeesstt mmeessssaaggeess.. + + The digest by default removed non-essential headers like ``In-Reply- + To:'' from messages. Modern MUAs, like _M_u_t_t can split out messages + from a digest and then thread them based on such headers. To include + these and all other headers in the digest messages, use the ``v'' or + ``n'' format as described on the ezmlm-get(1) man page. Normally, the + threading done by ezmlm is sufficient and the default format preferred + to reduce message and digest size, often by 25% or more. + + + 66..2222.. PPoossttss ffaaiill:: MMeessssaaggee aallrreeaaddyy hhaass MMaaiilliinngg--LLiisstt ((##55..77..22)).. + + The list you are trying to post to is used as a sublist (a list fed + with messages from another (ezmlm) list), but not properly set up as a + sublist. Put the name of the parent list (``origlist@orighost'') + which exactly matches the SENDER of the original (or parent) list into + DDIIRR//ssuubblliisstt. Check the ownership of DDIIRR//ssuubblliisstt, to make sure that + the user controlling the list can read it. + + Alternatively, use the ezmlm-make(1) ``-0 origlist@orighost'' switch + (see ``Customizing ezmlm-make operation''). + + + 66..2233.. TThhee llaasstt lliinnee ooff aa DDIIRR//tteexxtt// ffiillee iiss iiggnnoorreedd.. + + Only complete lines ending with ``newline'' are copied. The last line + in the DDIIRR//tteexxtt// file most likely lacks a terminal ``newline''. + + + 66..2244.. NNoo CCOONNFFIIRRMM rreeqquueessttss aarree sseenntt ttoo mmooddeerraattoorrss.. + + Assuming that the user initiated the subscribe request, got a + ``confirm'' request, and replied correctly, there are two possible + causes for the problem: Either the list is not subscription moderated + (in this case the user is subscribed and received a note saying so) or + the list is subscription moderated but no moderators have been added + (ezmlm-manage(1) sends out the request and doesn't mind that there are + no recipients). + + Check that the list is subscription moderated: + + + % cat DIR/modsub + + + + + If this fails the list is not subscription moderated. If it succeeds + with a directory name with a leading ``/'', this is your ``moddir''. + If not: + + + + % cat DIR/remote + + + + + If this succeeds with a directory name with a leading ``/'', this is + your moddir, otherwise the moddir is ``DDIIRR//mmoodd//''. + + Check for moderators: + + + + % ezmlm-list moddir + + + + + If there are none, this is your problem. If there are some, check the + mail log to see what happened when the CONFIRM requests was supposed + to have gone out. Assure correct ownerships for the moderator db: + + + + % chown -R user moddir + + + + + For ~alias: + + + + # chown -R alias moddir + + + + + Another possible problem is that you are trying to use the remote + admin feature to subscribe a user, but you get no CONFIRM request. + Usually, this is due to your SENDER address not being in the moderator + database. The CONFIRM request went to the target address instead, + since as far as ezmlm is concerned, you are a regular user. + + + 66..2255.. DDeelliivveerriieess ffaaiill ````tteemmppoorraarryy qqmmaaiill--qquueeuuee eerrrroorr'''' + + Usually, this is due to a corrupted qmail queue (should affect all + mail) or a corrupted ezmlm subscriber database (See ``How to deal with + corrupted subscriber lists''). ezmlm-idx>=0.40 has more informative + qmail error messages. + + + + + + 66..2266.. HHooww ttoo ddeeaall wwiitthh ccoorrrruupptteedd ssuubbssccrriibbeerr lliissttss + + Dan has made ezmlm very robust, but a subscriber list can still become + corrupted due to e.g. disk errors. Usually, this will lead to a + ``temporary qmail-queue error'' because an address does not conform to + the standard format. Occasionally, two E-mail addresses are fused, + e.g. ``addr1@hostTaddr2@host''. To diagnose and fix this type of + error, disable deliveries (easiest is to ``chmod 0 DIR/lock''), back + up the contents of DDIIRR//ssuubbssccrriibbeerrss//, then: + + + + % ezmlm-list DIR > tmp.tmp + + ( edit tmp.tmp to fix any problems ) + + % rm -rf DIR/subscribers/* + % ezmlm-sub DIR < tmp.tmp + + + + + This will list all E-mail addresses, allow you to edit them, then re- + subscribe them. Don't forget to re-enable deliveries. + + + 66..2277.. VVaaccaattiioonn pprrooggrraamm rreepplliieess aarree ttrreeaatteedd aass bboouunncceess bbyy eezzmmllmm.. + + Standard vacation programs do not reply to messages that contain a + ``Precedence: bulk'' header. ezmlm-idx>=0.23 sets up lists with this + header in DDIIRR//hheeaaddeerraadddd. For older lists, use ``ezmlm-make -+'' or + ``ezmlm-make -e'' to update them, or just add a ``Precedence: bulk'' + line to DDIIRR//hheeaaddeerraadddd. + + + 66..2288.. DDiiggeessttss ddoo nnoott ccoommee aatt rreegguullaarr hhoouurrss.. + + In the default setup, ezmlm-tstdig(1) determines if a new digest is + due every time a message arrives to the list. Thus, even though ezmlm- + tstdig is set to produce digests 48 hours after the previous digest, + the digest will not be generated until a message arrives. If you'd + like digests at a specific time each day, use crond(8) and crontab(1) + to daily run: + + + % ezmlm-get DIR + + + + + + 66..2299.. PPrreevveennttiinngg llooooppss ffrroomm mmiissccoonnffiigguurreedd ssuubbssccrriibbeerr aaddddrreesssseess.. + + Occasionally, a subscriber address is misconfigured and automatically + sends a message back to the list. Sometimes, the subscriber's setup + has removed headers that ezmlm uses for loop detection or the + generated messages has nothing in common with the send-out. To block + such mail at the list, include the ezmlm-make(1) ``-k'' (kill) switch + and add the offending address to DDIIRR//ddeennyy// with + + + % ezmlm-sub DIR/deny badadr@badhost + + + + + ezmlm-unsub(1) and ezmlm-list(1) can be used similarly to remove or + list the addresses. If your list is configured for remote administra- + tion (see ``How remote administration works''), and you are a remote + administrator, you can add the address by sending mail to list-deny- + badadr=badhost@listhost. Other subscriber database commands work as + well for list-deny. + + In other instances, a configuration error somewhere close to the + subscriber creates a local mail loop throwing off messages to you. + They are often bounces that are sent to the list address or to ``list- + help'' due to configuration errors. Rather than accepting these, or + the often resulting double bounces to ``postmaster'', just add a + ``|/path/ezmlm-weed'' line first to DDIIRR//eeddiittoorr or DDIIRR//mmaannaaggeerr. This + discards the bounce messages generated by the looping systems. ezmlm- + weed(1) is also useful in other settings where excessive numbers of + error messages are sent to the wrong address. + + + 66..3300.. AA uusseerr ccaann ssuubbssccrriibbee aanndd rreecceeiivveess wwaarrnniinngg aanndd pprroobbee mmeessssaaggeess,, + bbuutt nnoo mmeessssaaggeess ffrroomm tthhee lliisstt.. + + ezmlm lists (ezmlm-idx>=0.31) remove ``Received:'' headers from + incoming messages by default. This can be prevented with the ezmlm- + send(1) ``-r'' switch. When the headers are propagated, especially + sublist message may have many (15-20 or more), ``Received:'' headers. + If there is a poorly configured sendmail host with a ``hopcount'' set + too low, it will bounce these messages, incorrectly believing that the + many ``Received:'' headers are due to a mail loop. The reason that + administrative from the list do not bounce is that they have fewer + ``Received:'' headers, since they originate from the sublist. + + The message with all headers including the removed ``Received:'' + headers can be retrieved from the list archive with the _-_g_e_t_v command. + The top incoming ``Received:'' header is added by qmail at the receipt + to the list (or last sublist) host. This header is not removed, to + allow the recipient to determine when the message reached the list. + + + 77.. CCuussttoommiizziinngg eezzmmllmm--mmaakkee ooppeerraattiioonn vviiaa eezzmmllmmrrcc + + + 77..11.. UUssiinngg eezzmmllmm--mmaakkee ttoo eeddiitt eexxiissttiinngg lliissttss.. + + With ezmlm-make(1) (from ezmlm-idx >=0.21) you can use the ``-e'' + switch to edit existing lists. Invoke the ezmlm-make(1) command just + as you would to create the list anew, but change the switches to + reflect the desired change, and add the ``-e'' switch. ezmlm-make will + accept preexisting directories and overwrite or remove files to change + the setup. The message counter (DDIIRR//nnuumm), digest counters (DDIIRR//ddiiggnnuumm + and DDIIRR//ddiiggiissssuuee), the key (DDIIRR//kkeeyy) and the message archive will not + be affected. + + If the list has been created or previously edited with ezmlm-make(1) + from ezmlm-idx>=0.23, the list remembers (via DDIIRR//ccoonnffiigg) the + arguments and the switches. All you have to do is to use the ezmlm- + make(1) ``-+'' switch and specify options you wish to change, or use + the ``-e'' switch and specify all non-default options you'd like to + use. + + _N_O_T_E_: ezmlm-make(1) ``-e'' and ``-+'' will OVERWRITE any manual + customizations you have made to the program files, but not text files + and DDIIRR//hheeaaddeerraadddd, DDIIRR//hheeaaddeerrrreemmoovvee, etc. To reset all such files + (such as when changing list name), use ``-ee'' or ``-++''. + + To make general customizations, please change eezzmmllmmrrcc((55)) (see ``What + is ezmlmrc?'' or read on) instead and use the ``-c'' switch as well. + DO NOT use this option to change production lists without testing it + on other lists first. Also, for some changes, removing or adding a + flag is sufficient (see ``How do I quickly change properties of my + list''). + + + 77..22.. WWhhaatt iiss eezzmmllmmrrcc?? + + ezmlm-make(1) has a number of default switches that through eezzmmllmmrrcc((55)) + have defined functions. These allow creation of many standard lists. + + In addition, ezmlm-make(1) operation is fully customizable via + modification of the template file, ezmlmrc(5) or .ezmlmrc. A default + ezmlmrc(5) is installed in the ezmlm binary directory. The system + administrator can install a system-wide default eezzmmllmmrrcc((55)) file in + //eettcc//eezzmmllmmrrcc (or symlinked from there) which overrides the file in the + ezmlm binary directory. If the ezmlm-make(1) ``-c'' (custom) switch is + used, ezmlm-make(1) will look for ..eezzmmllmmrrcc in the ``dotdir'', i.e. the + directory in which the ..qqmmaaiill--lliisstt links are placed. This is usually a + set directory for a given user/virtual domain (usually, the home + directory for the user controlling the lists). + + eezzmmllmmrrcc((55)) controls everything except creation of the list directory + itself and the key used for cookie generation. The syntax of + eezzmmllmmrrcc((55)) is documented in ezmlm-make(1), the ezmlmrc(5) man page, + and in the ezmlmrc(5) file installed in the ezmlm binary directory. + ezmlm-make limits its effects to within the list ``dot'' and ``DIR'' + directories. In the ``dotdir'', only links to within ``DIR'' can be + created. + + + 77..33.. CChhaannggiinngg ddeeffaauullttss ffoorr DDIIRR//tteexxtt// ffiilleess.. + + Copy the ezmlmrc(5) file from the ezmlm bin directory to ..eezzmmllmmrrcc in + your ..qqmmaaiill file base directory (usually your home directory): + + + % cp /usr/local/bin/ezmlm/ezmlmrc ~/.ezmlmrc + + + + + The base eezzmmllmmrrcc((55)) file lives in the ezmlm binary directory, which + may differ from ``//uussrr//llooccaall//bbiinn//eezzmmllmm//eezzmmllmmrrcc'' if you do not have a + default setup. If your system administrator has placed a ezmlmrc(5) + file into the //eettcc directory, start with that one instead, as it is + likely to already contain some useful local customization and + comments. + + Now edit ~~//..eezzmmllmmrrcc. Find the tag corresponding to the text file you + want to change, e.g. ``'', and modify it + appropriately. Some tags have conditional flags, so that succeeding + text is copied only if specific switches are on/off. Thus, text + succeeding ``'' is copied into DDIIRR//tteexxtt//ffiillee if and + only if the ezmlm-make(1) ``-rms'' switches are all used. For more + info, see documentation in eezzmmllmmrrcc((55)) and the ezmlm-make(1) man page. + To invoke a custom ..eezzmmllmmrrcc file, use the ezmlm-make(1) ``-c'' + (custom) switch. + + + 77..44.. CChhaannggiinngg ddeeffaauulltt mmooddeerraattoorr ddiirreeccttoorriieess.. + + See above. Edit the ..eezzmmllmmrrcc file to add a directory name to e.g. + ``''. Also, you need to create that directory, and the + subscribers subdirectory under it. NOTE: DDIIRR//mmoodd// is still required as + the base directory for the message moderation queue. + 77..55.. AAddaappttiinngg eezzmmllmm--mmaakkee ffoorr vviirrttuuaall ddoommaaiinnss.. + + This is not necessary if you use qmail>=1.02 and ezmlm-idx>=0.32. + + The problem with virtual domains is that ezmlm-make(1) by default puts + the list name in DDIIRR//iinnllooccaall. However, if the domain host1.dom.com is + controlled by the user ``virt'', then the local part of the address + for the list list@host.dom.com will be ``virt-list'', not ``list''. + This is easily accommodated by putting a ..eezzmmllmmrrcc file in ~~vviirrtt//. In + the ``'' section of this file, enter ``virt-<#L#>'' instead + of ``<#L#>''. Now, all lists created under ~~vviirrtt will be + automatically set up correctly. + + Similarly, if host1.dom.com is controlled by virt-dom1 and + host2.dom.com by ``virt-dom2'', inlocal for list list@host1.dom.com + should be ``virt-dom1-list'' and for list@host2.dom.com should be + ``virt-dom2-list''. To accommodate this, put ``virt-<#1#>-<#L#>'' in + ``''. + + Running: + + + % ezmlm-make -c ~virt/LIST ~virt/.qmail-dom1-list \ + list host1.dom.com + + + + + will produce a LLIISSTT//iinnllooccaall of virt-dom1-list by substituting the + first part between two ``-'' (dom1) for ``<#1#>''. Two levels of + dashes are accommodated, i.e. ``<#2#>'' will be replaced by the second + part between two ``-'' (in this case empty (_S_i_c_!)). For more info, + see ezmlm-make(1) and comments in eezzmmllmmrrcc. + + + 77..66.. SSeettttiinngg uupp eezzmmllmm--mmaakkee ffoorr ssppeecciiaall ssiittuuaattiioonnss.. + + Ezmlm-make is very flexible. There are only three sets of special + command line switches: ``-vV'' for version info, ``-cC'' controlling + the use of a custom file ..eezzmmllmmrrcc in the ``dot'' directory, and + ``-eE'' for edit mode (i.e. reconfiguration of existing list setups). + All other switches are soft, i.e. controlled through eezzmmllmmrrcc((55)). Many + switches, have special meanings via eezzmmllmmrrcc((55)) and are documented in + the man page. Any other switches can be used for customization (_N_O_T_E_: + _w_e _m_a_y _u_s_e _s_w_i_t_c_h_e_s _o_t_h_e_r _t_h_a_n _`_`_-_x_y_z_'_' _f_o_r _s_p_e_c_i_f_i_c _p_u_r_p_o_s_e_s _i_n + _f_u_t_u_r_e _v_e_r_s_i_o_n_s_.) The ``-xyz'' switches will always be available for + your use, with the ``-x'' switch being configured for some + demo/special features in the distributed eezzmmllmmrrcc((55)). You can use them + for anything you like. They are by default off=false. The complement + of these switches is ``-XYZ'' (by default on=true). You can use these + to cause specific changes in the list setup if a given switch is used. + For an example, see the ``-x'' switch as used and documented in the + default eezzmmllmmrrcc((55)) file. The switches ``-aip'' are set by default to + be backwards compatible with ezmlm-0.53. Other switches are ``off'' by + default. + + Switches ``-a-z'' and ``-A-Z'' take no arguments. Switches ``-0'' and + and ``-3-9'' take arguments. When the ezmlm-make(1) ``-+'' switch is + used, the current settings for all these switches are read from the + list's DDIIRR//ccoonnffiigg (if available). + + + 88.. RReessttrriiccttiinngg mmeessssaaggee ppoossttiinngg ttoo tthhee lliisstt.. + + + + 88..11.. RReeqquuiirriinngg tthhee lliisstt aaddddrreessss iinn TToo:://CCcc:: hheeaaddeerrss.. + + SPAM or junk mail is usually sent by mailing a single message to a + large number of (unwilling) recipients. As such, it usually does not + contain the E-mail address of all recipients (remember, junk mailers + pay for these address lists). By rejecting messages that do not have + the list address in the To: or Cc: header(s) a large fraction of spam + to the list can be filtered out. + + This filter function is activated by default, but will work only if + you specify the list directory on the ezmlm-reject(1) command line. To + disable this restriction, remove the ``DIR'' argument from the ezmlm- + reject(1) command line, or add the ``-T'' switch. + + By default, this error is logged, and an error message is sent to the + sender. Since virtually all the failures will be SPAM and virtually + all spam has a faked SENDER, most of these error messages will go to + the postmaster. Thus, you may want to use the ezmlm-reject ``-q'' + switch (quiet) to suppress the sender notification. + + + 88..22.. RReejjeeccttiinngg mmeessssaaggeess sseenntt ffrroomm ootthheerr mmaaiilliinngg lliissttss.. + + ezmlm automatically detects are rejects messages that are sent from + other ezmlm mailing lists. Some other mailing list managers do not use + a rigorous mechanisms to verify subscribers. Thus, it is possible to + subscribe an ezmlm list address to such a mailing list. You can easily + block such a list by adding the address to the ``deny'' if you use the + ezmlm-make(1) ``-k'' option. However, you can also configure ezmlm- + reject(1) to reject messages based on specific headers placed into + DDIIRR//hheeaaddeerrrreejjeecctt. A set of headers which will catch mailing list + managers known to us are listed in the ezmlm-reject(1) man page. To + activate this option, you must specify the ``-h'' switch and DDIIRR on + the ezmlm-reject(1) line in DDIIRR//eeddiittoorr. Naturally, you can make this + the default by editing ezmlmrc(5) (See ``Customizing ezmlm-make + operation''). + + + 88..33.. RReessttrriiccttiinngg ppoossttss bbaasseedd oonn tthhee SSuubbjjeecctt lliinnee.. + + ezmlm-reject(1) is by default configured to reject posts with empty + subject (``-s'' switch) or with a subject that consists of only an + administrative command word (``-c'' switch), such as ``subscribe''. To + remove these restrictions, use the ezmlm-reject(1) ``-S'' and ``-C'' + switch, respectively. You can also into DDIIRR//eeddiittoorr before the ezmlm- + send(1) line add: + + + | grep -i 'subject:' | grep -if DIR/bad_words >/dev/null && \ + {echo "bad words found"; exit 100; } + + + + + to reject messages that have a line matching ``Subject:'' followed by + any bad word listed in DDIIRR//bbaadd__wwoorrddss. + + + 88..44.. RReessttrriiccttiinngg tthhee ssiizzee ooff ppoossttss.. + + If the ``DIR'' argument is specified on the ezmlm-reject(1) line in + DDIIRR//eeddiittoorr and DDIIRR//mmssggssiizzee exists and contains a number (in bytes) + greater than ``0'', then any posts with a body larger than the number + specified is rejected. The maximum message size can optionally be + followed by ``:'' and a minimum message body size in bytes. For + moderated lists, messages that are too large are rejected and not sent + to the moderators. This feature can be used to prevent the posting an + entire digest to the list by setting DDIIRR//mmssggssiizzee slightly below the + message size set in your ezmlm-tstdig(1) innovation (if any). A + minimum size can catch a few administrative request sent to the main + list, but is otherwise not that useful. To always configure your lists + with a message size restriction, add to eezzmmllmmrrcc((55)): + + + + max:min + + + + + The ezmlm-make(1) ``-x'' switch adds this with 40000:2. + + + 88..55.. RReessttrriiccttiinngg ppoossttss bbaasseedd oonn MMIIMMEE ccoonntteenntt--ttyyppee.. + + ezmlm-reject(1) will look for DDIIRR//mmssggssiizzee, DDIIRR//mmiimmeerreejjeecctt, and + DDIIRR//mmiimmeerreemmoovvee if the ``DIR'' argument is specified (``DIR'' can be + left out to conserve resources on lists that do not use these + features). _N_o_t_e_: _T_h_e _`_`_D_I_R_'_' _a_r_g_u_m_e_n_t _i_s _a_l_s_o _r_e_q_u_i_r_e_d _f_o_r _t_h_e _t_h_e + _T_o_:_/_C_c_: _l_i_s_t _a_d_d_r_e_s_s _r_e_s_t_r_i_c_t_i_o_n _(_s_e_e _`_`_R_e_q_u_i_r_i_n_g _t_h_e _l_i_s_t _a_d_d_r_e_s_s _i_n + _T_o_:_/_C_c_: _h_e_a_d_e_r_s_'_'_)_. If the message contains MIME parts that are of a + content-type listed in DDIIRR//mmiimmeerreejjeecctt they are rejected. If the + message is a simple MIME message of a content-type listed in either + DDIIRR//mmiimmeerreejjeecctt or DDIIRR//mmiimmeerreemmoovvee it is also rejected. + + There is currently no ezmlm-make(1) switch for DDIIRR//mmiimmeerreejjeecctt, but it + can easily be configured by editing eezzmmllmmrrcc((55)). The ezmlm-make ``-x'' + switch configures DDIIRR//mmiimmeerreemmoovvee (see ``mimeremove'') for a list of + content-types). Messages consisting solely of these content-types + (rare) will be rejected, and the corresponding MIME parts of composite + messages will be removed. + + + 88..66.. RReessttrriiccttiinngg ppoossttss ttoo lliisstt ssuubbssccrriibbeerrss.. + + Use message moderation. As an alternative, implement a check against + SENDER by using ezmlm-issubn(1). The latter is easily defeated by + faking SENDER. Also, it prevents posts from legitimate subscribers + that are subscribed under a different address than the one they send + from. Nevertheless, it may be useful in some situations. Add: + + + + |/usr/local/bin/ezmlm/ezmlm-issubn 'DIR' 'DIR/digest' 'DIR/allow' || + { echo "Sorry, you are not allowed to post to this list."; + exit 100; } + + + + + _A_L_L _O_N _O_N_E _L_I_N_E to DDIIRR//eeddiittoorr before the ezmlm-send(1) line. ``DIR'' + is the main list directory. If your ezmlm binaries live in a different + directory, change the ezmlm-issubn(1) path accordingly. If you would + like denied posts to be dropped silently rather than bounced, change + the exit code to 99. + + See ``Customizing ezmlm-make operation'' if you want your lists to + have some of these features by default or set by specific ezmlm- + make(1) switches. The ezmlm-make(1) ``-u'' switch by default sets up + restrictions this way. + + + If you do not want to allow digest subscribers to post, remove + DDIIRR//ddiiggeesstt// from the ezmlm-issubn command line. To allow posts from an + address that is not a subscriber, simply add it to the addresses in + DDIIRR//aallllooww//: + + + % ezmlm-sub DIR/allow address@host + + + + + The ``allow'' database can be manipulated remotely by sending mail to + list-allow-subscribe@listhost, list-allow-unsubscribe@listhost, etc. + If configured for the list, the ``-list'' command for remote adminis- + trators will work for the ``allow'' database as well. + + Please note that this setup is not secure, as it is easy to modify the + envelope SENDER. For more secure options, see ``Restricting posts to + an arbitrary set of E-mail addresses (higher security option)''. + + + + 88..77.. RReessttrriiccttiinngg ppoossttss ttoo aann aarrbbiittrraarryy sseett ooff EE--mmaaiill aaddddrreesssseess + ((hhiigghheerr sseeccuurriittyy ooppttiioonn)).. + + The easiest way to achieve this is to simply set up a message + moderated list, and add all the e-mail addresses to the moderator db. + Use a custom location, if you want a different set of moderators for + subscription moderation/remote admin. If a "moderator" posts, only + s/he will get a confirmation request. If anybody else posts, the post + will be sent to all moderators. + + + To directly bounce posts from SENDERs not in the database, use the + ezmlm-store ``-P'' (not public) switch. This is more secure than a + simple ezmlm-issubn(1) construct, since faking SENDER to a moderator + address will result in a confirmation request to that moderator (which + s/he will reject/ignore), rather than a direct post. The draw-back is + that each post has to be confirmed, but with the speed of ezmlm the + request will arrive immediately after the post is made, so the + overhead should is The best choice depends on your particular needs in + the trade-off between security and convenience. + + ``ezmlm-make -om'' will set up such a moderated list with ``ezmlm- + store -P''. This is the most useful setup for an announcement list. + + + Setting a list up in this way with only the owner's address gives you + a pretty safe owner-only list. + + + 88..88.. CCoommpplleetteellyy rreessttrriiccttiinngg ppoossttss.. + + To completely prevent posting (for instance a message-of-the-day + list), set up a normal list, and just remove ~~//..qqmmaaiill--lliisstt and + DDIIRR//eeddiittoorr altogether. Make posts from the shell, or from shell + scripts or crond, by simply piping a (complete) message to ezmlm- + send(1): + + + + % /usr/local/bin/ezmlm/ezmlm-send DIR < message + + + + + _N_O_T_E: This can be done by any user with write access to files within + the list directory, so make sure your file modes are set correctly. + The ezmlm-send(1) path may need to be changed to match your ezmlm + binary directory. It's also a good idea to not allow others to read + your list directory and DDIIRR//ssuubbssccrriibbeerrss// and other address lists. + + + 88..99.. AA ggeenneerraall ssoolluuttiioonn ttoo rreessttrriiccttiinngg ppoossttss bbaasseedd oonn SSEENNDDEERR.. + + As discussed above, the security afforded by SENDER checks is minimal, + but nevertheless sufficient to keep out most spam and garbage. + However, some subscribers post from e-mail addresses other than their + subscription address, and users tend to become unfriendly when their + posts are denied even though they are subscribers. This is a general + solution to this problem which has minimal overhead for the list owner + and is essentially completely transparent to the subscriber. + + Set up the list with ezmlm-gate(1) in DDIIRR//eeddiittoorr in place of the + ezmlm-send(1) line. To the ezmlm-gate(1) command line add the list + directory twice, then a digest directory DDIIRR//ddiiggeesstt// (if it exists), + then DDIIRR//aallllooww//. Create DDIIRR//mmooddppoosstt. Add the list owner as a message + moderator. + + With this setup, any message from a SENDER that is a subscriber of the + main list, the digest list or added to DDIIRR//aallllooww//, will be posted + directly, others will be sent to the list owner for approval. If the + list wants to automatically approve posts from that address in future + (e.g. it is an alias for a subscriber) s/he just adds it to the + database in DDIIRR//aallllooww//. If the owner wants to approve this post, but + not necessarily future posts from that address, s/he just accepts the + message. To reject the message with a comment is equally easy. If the + owner wished to have the option to silently ignore posts (and not have + the SENDER notified that the post timed out), just add the ezmlm- + clean(1) ``-R'' switch in DDIIRR//eeddiittoorr and DDIIRR//mmooddeerraattoorr. + + In this way, the normal subscriber is always happy and the ``behind + the scenes'' work of the owner is minimalized. + + ezmlm-make creates lists with this setup if you specify the ``-u'' + switch in addition to the ``-m'' switch: + + + + % ezmlm-make -mu ~/list ~/.qmail-list joe-list host + + + + + If you omit the ``-m'' switch, the setup will reject posts from non- + subscribers that are not in the ``allow'' database. ezmlm-both(1) + uses a set of similar ezmlm-make(1) invocations to create a list with + digest, optionally making you a remote admin, list owner, and + subscriber to both lists. + + + 99.. CCuussttoommiizziinngg oouuttggooiinngg mmeessssaaggeess.. + + + 99..11.. AAddddiinngg aa ttrraaiilleerr ttoo oouuttggooiinngg mmeessssaaggeess.. + + Put the text in DDIIRR//tteexxtt//ttrraaiilleerr. The text is NOT copied to the + archived version of the message. This works also for sublists. Tags + ``<#h#>'', ``<#l#>'', and ``<#n#>'' are replaced by the list host, + local name, and current message number, respectively. + + + 99..22.. AAddddiinngg aa ssuubbjjeecctt pprreeffiixx ttoo oouuttggooiinngg mmeessssaaggeess.. + + Put the exact text in DDIIRR//pprreeffiixx. You can include the message number + assigned to the post in the list archive by adding the ``#'' character + in the text in DDIIRR//pprreeffiixx (example: put ``lsqb;listname-#rsqb;'' in + DDIIRR//pprreeffiixx). ezmlm does not modify the subject other than by + prefixing it with the prefix. ezmlm knows about rfc2047 encoded + subject and can detect a prefix within an encoded word. However, ezmlm + will not modify the subject itself. It will add a prefix only of none + has been added before. A consequence of this is that a message will + have the message number prefix of the first message in the thread + rather than a prefix with the number of the message itself. The entire + thread can always be retrieved with a message to list-thread-x@host, + where ``x'' is the number in the prefix. + + We recommend against using the prefix feature and strongly against the + message number prefix. If you use it, make sure you understand the + drawbacks, of message modification and subjects that change between + message and reply. ezmlm can deal with this, but other programs may + not be able to. + + Sublists ignore DDIIRR//pprreeffiixx. + + If you add a prefix, especially if you previously added it by other + means (procmail, etc.), use ezmlm-idx to re-index the archive. Due to + the way ezmlm-get(1) does threading from the subject, it works best if + you use exactly the same prefix as you did before. + + + 99..33.. AAddddiinngg aa hheeaaddeerr ttoo oouuttggooiinngg mmeessssaaggeess.. + + Put the exact header text as a line in DDIIRR//hheeaaddeerraadddd. Thus, if you'd + like a ``Precedence: bulk'' header added to outgoing messages, put a + line ``Precedence: bulk'' into DDIIRR//hheeaaddeerraadddd. This particular header + is already added via the default ezmlmrc(5). Any modifications you + wish to be active for all future lists should be made via modification + of ezmlmrc(5) (see ``Customizing ezmlm-make operation''). As of + ezmlm-idx-0.32, the following tags can be used in DDIIRR//hheeaaddeerraadddd, and + will be substituted: <#n#> for the current message number, <#l#> for + the local part of the list (this will be the digest list for digests), + <#h#> for the host part of the list name. These substitutions are done + at the time of message delivery, in contrast to the ``capital letter'' + tags substituted by ezmlm-make(1) when the list is set up. + + + 99..44.. AAddddiinngg aa mmeessssaaggee nnuummbbeerr hheeaaddeerr.. + + Don't! A sequence header may be useful for users whose systems don't + pass on the ``Return-to:'' header to the MUA. + + Use DDIIRR//hheeaaddeerraadddd with a header of the type ``X-Sequence: <#n#>''. + + Bounced messages are identified by their local message numbers, i.e. + when ezmlm sends you a message about which messages bounced, it refers + to the message number of the sublist. To be consistent with these + numbers, and a local sublist archive, use DDIIRR//sseeqquueennccee on the sublist, + not the main list. To get consistent message numbering in digests, + digest have the message number of the first message in the digest. + + ezmlm-idx tries to make message numbering problems with sublists a + little easier: sublists use the incoming message number, but only when + the sublist is not archived and not indexed. This restriction is + necessary for security reasons. Otherwise, an attacker could wreak + havoc in the local message archive by sending messages with faked + message numbers in the SENDER. + + 99..55.. RReemmoovviinngg hheeaaddeerrss ffrroomm oouuttggooiinngg mmeessssaaggeess.. + + Put the header up to, but excluding the ``:'' in DDIIRR//hheeaaddeerrrreemmoovvee. + + + 99..66.. RReemmoovviinngg MMIIMMEE ppaarrttss ffrroomm mmeessssaaggeess.. + + ezmlm-idx>=0.30 can strip parts from composite mime messages based on + content type. Just put the appropriate content-types such as + ``text/ms-word'' or ``text/html'' into DDIIRR//mmiimmeerreemmoovvee. This is + automatically configured when using the ezmlm-make(1) ``-x'' switch. + + + 99..77.. LLiimmiittiinngg ````RReecceeiivveedd::'''' hheeaaddeerrss iinn oouuttggooiinngg mmeessssaaggeess.. + + Sendmail still is being used on the majority of mail hubs. Sendmail + has very primitive loop detection, bouncing messages based on + excessive ``hopcount''. The ``hopcount'' is determined by counting + ``Received:'' headers. ezmlm by default propagates ``Received:'' + headers to facilitate message tracking. Thus, messages, especially + from a sublist, can have a number of ``Received:'' headers that + exceeds the ``hopcount'' set on poorly configured sendmail hosts. + Subscription confirmation requests, warning, and probe messages have + fewer ``Received:'' headers. Thus, a user may be able to receive + these, but not (some of the) list messages. Of course, the best is to + correct the configuration on the bouncing host, but this is often + under the control of neither list owner nor user. + + To compensate for this problem, ezmlm-send(1) of ezmlm-idx->=0.313 by + default removes all ``Received:'' headers except the top one. They + are still written to the archive, an can be retrieved from there using + the ``-getv'' command. To cause ezmlm-send(1) to pass on all the + ``Received:'' headers, use the ezmlm-send(1) ``-r'' switch. + + + 99..88.. SSeettttiinngg ````RReeppllyy--TToo:: lliisstt@@hhoosstt''''.. + + This is not recommended, since it leads to dissemination via the list + of messages returned from bad auto-responders and MTAs. Also, it may + lead to public replies to the list where personal replies were + intended. In addition, the original ``Reply-To:'' header is lost. If + you do want to add a reply-to list header, put ``reply-to'' into + DDIIRR//hheeaaddeerrrreemmoovvee, and ``Reply-To: list@host.dom'' into DDIIRR//hheeaaddeerraadddd. + + + 99..99.. CCoonnffiigguurriinngg tthhee lliisstt ssoo ppoossttss aarree nnoott ccooppiieedd ttoo tthhee oorriiggiinnaall + sseennddeerr.. + + For most mailing lists, you want all subscribers, including the sender + of a particular message, to get all messages. This way, the sender + sees that the message reached the list. For small lists, such as a + project group, it may be annoying for the members to receive their own + posts. + + ezmlm-send(1) can be configured to exclude the sender from the + recipient E-mail addresses if configured with the ``-C'' switch. To + add this switch, edit the ezmlm-send(1) line of DDIIRR//eeddiittoorr. + + + 99..1100.. CCuussttoommiizziinngg eezzmmllmm nnoottiiffiiccaattiioonn mmeessssaaggeess.. + + Most of ezmlm's more commonly used messages are stored in DDIIRR//tteexxtt//. + These messages can be edited manually for a list once it is set up, or + on a global basis via modification of eezzmmllmmrrcc((55)). The messages may + also be edited via E-mail by remote administrators (remote admin must + also be enabled - ezmlm-make switch ``-r'') after the list is + established by creating the list using the ezmlm-make(1) ``-n'' (new + text files) (see ``How text file editing works'' and see ``Customizing + ezmlm-make operation''). + + The most useful messages are DDIIRR//tteexxtt//ssuubb--ookk (and for subscription + moderated lists DDIIRR//tteexxtt//mmoodd--ssuubb) for new subscriber information (such + as the traditional ``welcome'' message, or a list charter or list + posting rules/guidelines); DDIIRR//tteexxtt//uunnssuubb--nnoopp is useful for messages + to frustrated users unsuccessful in their unsubscribe attempts; + DDIIRR//tteexxtt//hheellpp for general help information in reply to list-help@host + or unrecognized commands, DDIIRR//tteexxtt//bboottttoomm for inclusion at the bottom + of virtually all ezmlm messages; DDIIRR//tteexxtt//mmoodd--hheellpp for moderator + information; DDIIRR//tteexxtt//ttrraaiilleerr for a (few) line(s) at the bottom of + each post; DDIIRR//tteexxtt//ddiiggeesstt for information in the ``Administrivia'' + section of digests. + + + 99..1111.. SSppeecciiffyyiinngg cchhaarraacctteerr sseett aanndd ccoonntteenntt--ttrraannssffeerr--eennccooddiinngg ffoorr oouutt-- + ggooiinngg eezzmmllmm mmeessssaaggeess.. + + All ezmlm replies, except errors handled directly by qmail, can be + sent in any character set and optionally with quoted-printable or + base64 content-transfer-encoding. DDIIRR//tteexxtt// files are always 8-bit + files, but even though qmail has no problems with 8-bit mail, other + MTAs and MUAs do. Problems due to this can be avoided by assuring + that outgoing ezmlm messages are 7bit by using the appropriate + content-transfer-encoding. + + To specify a character set, put the name in DDIIRR//cchhaarrsseett (default: us- + ascii). To specify quoted-printable or base64 content-transfer- + encoding, add ``:Q'' or ``:B'' after the character set name in + DDIIRR//cchhaarrsseett. + + + 1100.. CCuussttoommiizziinngg aarrcchhiivvee rreettrriieevvaall.. + + + 1100..11.. SSppeecciiffyyiinngg tthhee ffoorrmmaatt ffoorr rreettrriieevveedd mmeessssaaggeess.. + + Add a format (f) specifier after the archive retrieval command: + + + + list-getf@host + + + + + where ``f'' is ``r'' for rfc1153 format, ``m'' (mime; default) for + MIME multipart/digest with subset of ordered headers, and ``v'' (vir- + gin) MIME multipart/digest, i.e. with all headers retained from the + archive, and ``n'' (native) the same as ``v'' except that no threading + is performed and messages are returned in numerical order. Under some + circumstances, it may be preferable to have a digest in ``multi- + part/mixed''. The ``x'' (mixed) format is identical to ``m'' except + for this header. + + For ezmlm-cron(1), just suffix the format code to the digest code. + + + 1100..22.. SSppeecciiffyyiinngg tthhee ddeeffaauulltt ffoorrmmaatt ffoorr ddiiggeessttss aanndd aarrcchhiivvee + rreettrriieevvaall.. + + The ezmlm-get(1) ``-f'' switch can be used to change the default + format (MIME with removal of less relevant headers) to other formats. + The format specifiers are the same as for individual archive + retrievals (see ``Specifying the format for retrieved messages''). + + + 1100..33.. LLiimmiittiinngg tthhee nnuummbbeerr ooff mmeessssaaggeess ppeerr --ggeett//--iinnddeexx rreeqquueesstt.. + + By default, a single -get request returns a maximum of 100 messages, + and a single -index request 2000 subjects entries (20 files of 100 + subjects entries each). This can be changed by editing MAXGET, and + MAXINDEX in iiddxx..hh and recompiling. Remember to edit tteexxtt//bboottttoomm, + tteexxtt//bboouunnccee, and eezzmmllmmrrcc((55)) to reflect these changes so that your + users won't get confused. + + + 1111.. RReessttrriiccttiinngg aarrcchhiivvee rreettrriieevvaall.. + + + 1111..11.. RReessttrriiccttiinngg aarrcchhiivvee aacccceessss ttoo ssuubbssccrriibbeerrss.. + + If you use ezmlm-get(1), archive retrieval can be restricted by using + the ezmlm-make(1) ``-g'' (guard archive) switch. This in turn sets + ezmlm-get(1) up with its ``-s'' switch, allowing access only to + addresses that are subscribers of the list, or of the digest list, or + that are present in an extra address database stored in DDIIRR//aallllooww//. + Addresses can be added remotely by mailing list-allow- + useralias=userhost@listhost. Other commands, such as ``subscribe'' + work as expected. As you can see, the different programs have many + options and ezmlm-make(1) organizes most of them into the most useful + sets to make it easier. Don't hesitate to look at the ezmlmrc(5) man + page and man pages for individual commands. There are many useful + options to more finely tune your lists to your taste. Via modification + of ezmlmrc(5) you can make your favorite options the default! + + Since ezmlm-get always sends the reply to SENDER, this assures that + only subscribers can get archive excerpts. Since SENDER is easily + faked, anyone can still request archive info (and drain system + resources), but replies go only to subscriber E-mail addresses. The + DDIIRR//aallllooww// database can be used to manually add addresses that should + be given archive access, but are not subscribers. This may be an + address of a subscriber who posts from an address other than his or + her subscription address. + + + 1111..22.. RReessttrriiccttiinngg aavvaaiillaabbllee aarrcchhiivvee rreettrriieevvaall ccoommmmaannddss.. + + If you want to disable all archive retrieval except digest creation, + simply add the ``-C'' command line switch to the ezmlm-get(1) line in + DDIIRR//mmaannaaggeerr. If you don't want digest creation via trigger messages + and DDIIRR//mmaannaaggeerr, but use other means to created digests, you can + remove the ezmlm-get(1) line from DDIIRR//mmaannaaggeerr. + + + 1111..33.. RReessttrriiccttiinngg aarrcchhiivvee rreettrriieevvaall ttoo mmooddeerraattoorrss.. + + If DDIIRR//ppuubblliicc does not exist, ezmlm-manage(1) and ezmlm-get(1) modify + their behavior. They disallow user requests, but for remote + administration lists, honor moderator requests. Thus, for a remote + admin list without DDIIRR//ppuubblliicc, only subscription moderators or remote + administrators can receive archive retrievals and only remote + administrators can subscribe and unsubscribe user addresses. + + If you'd like this restriction of archive retrieval with maintained + user-initiated ezmlm-manage(1) subscription functions, use the ezmlm- + get(1) ``-P'' (not public) switch, and retain DDIIRR//ppuubblliicc. Also, look + at the ezmlm-make ``-b'' switch. + + + 1111..44.. AAlllloowwiinngg aarrcchhiivvee rreettrriieevvaall ffrroomm aa nnoonn--ppuubblliicc lliisstt.. + + A non-public list lacks DDIIRR//ppuubblliicc. ezmlm-manage(1) will reject user + requests for (un) subscription and for archive retrieval. The + restriction on archive retrieval can be removed with the ezmlm-get(1) + ``-p'' (public) switch. + + + 1122.. CCuussttoommiizziinngg ddiiggeessttss.. + + + 1122..11.. SSeettttiinngg uupp aa ddiiggeesstt lliisstt.. + + Digests are integrated with normal ezmlm lists if you use ezmlm- + idx>=0.30. Just add the ezmlm-make(1) ``-d'' switch to your list + setup. To add digests to an existing list created with ezmlm-idx>=0.23 + use: + + + % ezmlm-make -+d DIR + + + + + For ezmlm-0.53 or older lists, you just need to re-specify also other + switches and the other ezmlm-make(1) arguments. + + + 1122..22.. GGeenneerraattiinngg ddaaiillyy ddiiggeessttss.. + + The easiest way to generate trigger messages is to use crond(8) and + execute ezmlm-get(1) daily. To do this, create the list with: + + + ezmlm-make -d dir dot local host + + + + + and add a line to your crontab file: + + + 30 04 * * * ezmlm-get dir + + + + + and execute crontab(1). This will generate a digest each day at 04:30 + am. In addition, a digest will be generated at any time when the lat- + est post makes it more than 30 messages or more than 64 kbytes of mes- + sage body since the latest digest. If you do not want these extra + digests, edit DDIIRR//eeddiittoorr and remove the ezmlm-tstdig(1) and ezmlm- + get(1) lines. + + If you do not need the digests to go out at a particular time, use the + standard setup, but edit DDIIRR//eeddiittoorr to put ``-t 24'' on the ezmlm- + tstdig(1) line instead of the default ``-t 48'' for 48 hours. This is + even easier. You can modify all parameters by editing eezzmmllmmrrcc or by + using the ezmlm-make(1) ``-4'' argument when creating/editing the + list. This is described in the ezmlm-make(1) man page, and the options + etc, are described in the ezmlm-tstdig(1) man page. + + + + + + 1122..33.. GGeenneerraattiinngg tthhee ffiirrsstt ddiiggeesstt.. + + If you want the first digest to start with issue 1 and the first + message in your archive, no special action is required. + + If you want the first digest to start at message 123 and you have + shell access, put '122' into DDIIRR//ddiiggnnuumm. + + If you want the next digest to start at message 456, you can always + edit DDIIRR//ddiiggnnuumm to contain '455'. If you want the next digest to be + named issue 678, put '677' into DDIIRR//ddiiggiissssuuee. + + + 1122..44.. AAddddiinngg ssttaannddaarrdd aaddmmiinniissttrraattiivvee iinnffoorrmmaattiioonn ttoo ddiiggeessttss.. + + The text in DDIIRR//tteexxtt//ddiiggeesstt is copied into the ``Administrivia'' + section of the digest. This information can be customized on a + system-wide basis by editing //eettcc//eezzmmllmmrrcc, on a user-wide basis by + editing ~~//..eezzmmllmmrrcc, or for the list by directly editing the + DDIIRR//tteexxtt//ddiiggeesstt file, or by a remote administrator by editing the file + via e-mail, if the list has been set up using the ezmlm-make(1) + ``-nr'' switches (see ``How text file editing works''). + + + 1122..55.. CCoonnttrroolllliinngg tthhee ddiiggeesstt ffoorrmmaatt.. + + You can control the default format that ezmlm-get(1) uses for its + output by using the ``-f x'' switch. For individual digests triggered + by mail or other archive access, add a format specifier after the + digestcode: + + + + list-dig.codef@host + + + + + For example: + + + + joe-sos-dig.gagax@id.com + + + + + where ``x'' is ``r'' for rfc1153 format, ``m'' (default) for MIME mul- + tipart/digest with a subset of headers, ``v'' for virgin MIME multi- + part/digest, i.e. with all headers retained from the archive, ``n'' + produces format similar to ``v'', without threading and with messages + in numerical order. The ``x'' format is identical to the default ``m'' + format, but the digest content-type is ``multipart/alternative'' + rather than ``multipart/digest''. This helps with a pine bug if you + are using quoted-printable/base64 encoding of ezmlm messages. + + With digests triggered directly from crond(8), just use the ``-f'' + format specifier: + + + ezmlm-get -fx DIR + + + + + The same switch can also be used for standard digest triggering from + DDIIRR//eeddiittoorr. Just add the ``-fx'' switch to the ezmlm-get(1) command + line there. Edit ~~//eezzmmllmmrrcc to assure that such customizations will be + used for future list creations/edits. + + + 1122..66.. CCuussttoommiizziinngg bboouunnccee hhaannddlliinngg.. + + The time out for bounce messages is normally 11.6 days. This means + that a bad address will take longer that 3 weeks to be removed. + Usually, this delay is desirable. After all, it is much worse to + remove a subscriber just because the address had temporary problems + that to send a few extra messages and receive a few extra bounces. + + However, for large lists, bounce handling can consume a considerable + amount of resources. To decrease the load, remove all ezmlm-warn(1) + lines from the DDIIRR//eeddiittoorr, and DDIIRR//mmaannaaggeerr files. Instead, execute: + + + /path/ezmlm-warn DIR + /path/ezmlm-warn -d DIR + + + + + daily during off-peak hours via a cron script. The second line can be + omitted if you are not using the digest capability of the list. + + This should not be necessary for ezmlm-idx>=0.32. That version adds + much more efficient bounce handling, making this type of modification + usable only for extremely large lists with many bad addresses (unusual + for ezmlm lists) and for hosts that are working near the limit of + their capacity (where shifting some qmail load to off-peak hours is + worth the effort). + + In addition, you may want to reduce the time out for bounces from 11.6 + to a lower number of days, e.g. 5. To do so, add ``-t 5'' to the + ezmlm-warn(1) command line. + + If you start with a list from a list manager that does not have bounce + handling, chances are that you have many bad addresses in your list. + You can always execute: + + + /path/ezmlm-warn -t0 DIR + /path/ezmlm-warn -d -t0 DIR + + + + + to move bounce handling one step forward per execution. Users whose + mail has bounced will be sent a warning. Users for whom the warning + message has bounced will be sent a probe. + + + 1133.. RReemmoottee aaddmmiinniissttrraattiioonn.. + + + 1133..11.. HHooww ccaann II rreemmootteellyy aadddd mmooddeerraattoorrss,, ssuubbssccrriibbeerr aalliiaasseess,, eettcc?? + + On any list, the DDIIRR//aallllooww// database can be manipulated remotely via + mail to list-allow-subscribe@listhost, etc. The rules for + adding/removing/listing addresses to this database are the same as for + the main list. Thus, if a user on an open list wants to be able to + post from alias@al.host.com s/he can send a message to list-allow- + subscribe-alias=al.host.com@listhost and reply to the confirmation + request. Now, s/he can post from this address even on a subscriber- + only list and even though the address is not a real subscriber. + + It can be confusing to some users that you use ``subscribe'' here, but + you don't get any messages. If you explain to them that this is just + another collection of addresses they will understand. You can also + send the initial message on their behalf. If you are a remote admin, + you can even complete the transaction adding the alias without + subscriber participation. + + Addresses can also be unsubscribed from the ``allow'' database. + However, there is usually no good reason to do so. + + If configured, the DDIIRR//ddeennyy// database can be manipulated, but only by + remote administrators, by mail to e.g. list-deny- + baduser=badhost@listhost. Normal users cannot access this database. + + To remotely administrate the DDIIRR//mmoodd// databases (i.e., without shell + access), you need to set up a non-public, remotely administered list + which ``resides'' within the DDIIRR//mmoodd. _P_l_e_a_s_e _c_a_r_e_f_u_l_l_y _c_o_n_s_i_d_e_r _t_h_e + _i_m_p_l_i_c_a_t_i_o_n_s _o_f _m_a_k_i_n_g _i_t _p_o_s_s_i_b_l_e _t_o _r_e_m_o_t_e_l_y _a_d_d_, _r_e_m_o_v_e_, _a_n_d _l_i_s_t + _m_o_d_e_r_a_t_o_r_s_. _I_n _m_a_n_y _c_i_r_c_u_m_s_t_a_n_c_e_s_, _t_h_i_s _i_s _d_a_n_g_e_r_o_u_s_. + + After setting up your list with the specific functionality you need, + use the following command for DDIIRR//mmoodd//: + + + % ezmlm-make -ePrIAl ~/list/mod ~/.qmail-list-mod joe-list-mod host + + + + + The '-l' flag is not necessary, but makes it easier to administrate + your moderator database by permitting the ``supermoderator'' to see + who is on the list. + + The new list does not have a key. Using the key from the main list is + inadvisable. Instead, create a dummy list, copy the key from this list + to your ``moderator'' list: + + + % cp ~/DUMMY/key ~/DIR/mod/key + + + + + Erase the dummy list. Also, posts to this list should not be allowed. + Erase the ~~//..qqmmaaiill--lliisstt--mmoodd and ~~//DDIIRR//mmoodd//eeddiittoorr. Then add the remote + administrator of the ``moderator'' list: + + + % ezmlm-sub ~/list/mod/mod supermod@superhost + + + + + The ``supermoderator'' can now remotely administrate the moderators of + the main list. + + + 1133..22.. MMooddeerraattiinngg ppoossttss ffrroomm aa sseeccoonnddaarryy aaccccoouunntt.. + + Request for moderation of posts can be forwarded to any address and + acted on from that address. By default, all post moderation requests + have subjects starting with ``MODERATE for'' followed by the list + name. + + 1133..33.. MMooddeerraattiinngg ssuubbssccrriippttiioonn ffrroomm aa sseeccoonnddaarryy aaccccoouunntt.. + + Requests for moderator approval of user subscribe requests can be + forwarded to any address and acted on from that address. All + subscription moderation requests have subjects starting with + ``CONFIRM'' (or ``CONFIRM subscribe to listname'', since ``CONFIRM + unsubscribe from listname'' is sent to the moderator only in reply to + a moderator-initiated request on a list with remote admin). + + Remote administration (initiation by the moderator of (un)subscribe + requests on behalf of a user) CANNOT be initiated from an account that + is not listed in the moderator database. If such attempts are made, + these will be treated as regular requests, resulting in a confirm + request to the user (which includes a copy of the initial request, + revealing the moderator's address to the user). The user reply to a + confirm request will on a non-moderated list result in the addition of + the user address to the subscriber list, and in a moderated list a + CONFIRM request to all the moderators. Replies to unsubscribe confirm + requests always result in the removal of the address, without + moderator intervention (except in some cases when the ezmlm-manage -U + switch is used (see below)). With this caveat, moderation and remote + administration can be done from a secondary address. + + For the subscription moderator to temporarily use a different address, + s/he needs to forward all ``CONFIRM'' messages to the new address. For + a permanent move, it is better to remove the old moderator address and + add the new SENDER address to allow moderator-initiated (un)subscribes + without user intervention from the new address (of course, the list + has to be configured for remote administration with DDIIRR//rreemmoottee). + + + 1133..44.. AAuuttoommaattiiccaallllyy aapppprroovviinngg ppoossttss oorr ssuubbssccrriippttiioonnss.. + + Sometimes, it may be desirable for the moderator to automatically + approve all moderation requests. This may be appropriate for a single + moderator of a ``civilized'' list when away for the week. + + Set up your client to auto-reply to the ``Reply-To:'' address for all + messages with subjects ``CONFIRM subscribe to listname'' or ``MODERATE + for listname''. Beware that this can be used by malicious people to + trick your account to send mail anywhere. In practice, this should + not be a problem. If you are worried, forward the messages to a + (trusted) friend and ask him/her to appropriately reply to the + requests. + + + 1133..55.. AAlllloowwiinngg rreemmoottee aaddmmiinniissttrraattoorrss ttoo ggeett aa ssuubbssccrriibbeerr lliisstt.. + + Access to the subscriber list is sensitive. Thus, this option is + disabled by default. The ezmlm-manage(1) ``-l'' command line switch + enables this option, but will send a subscriber list only to a + moderator's address. This allows a moderator to also initiate a + subscriber list retrieval from a secondary account (i.e. one to which + the moderator's mail is delivered, but for which SENDER is not a + moderator). The latter option does not decrease security, as it is + trivial to fake SENDER (see ``Ezmlm-idx security'' for a discussion of + ezmlm-idx security aspects). + + For maximum subscriber list security, do not enable this feature. To + enable this feature by default, just modify eezzmmllmmrrcc((55)) (see + ``Customizing ezmlm-make operation''). + + + + + + 1133..66.. AAlllloowwiinngg rreemmoottee aaddmmiinniissttrraattoorrss ttoo rreettrriieevvee oorr sseeaarrcchh aa ssuubb-- + ssccrriippttiioonn lloogg.. + + This is restricted and works as the subscriber list, since it contains + information of equal sensitivity. To receive the entire log, mail + list-log@listhost. See ``Howto get a subscription log'' for more + details on the reply format. As of ezmlm-idx-0.32, the subscription + log also contains the From: line contents from the user's subscribe + confirmation. This usually contains the user's name and can be helpful + if the user cannot recall or determine the subscription address. To + make life easier for the remote admin, ezmlm-idx-0.32 also supports + searching the log, using exact matches for alphanumerics and ``_'' as + a wild card character. Thus, to find records matching ``Keith John*'', + the remote admin can mail list-log.Keith_John. See ``Howto get a + subscription log'' for more information. + + + 1133..77.. AAlllloowwiinngg uusseerrss ttoo ggeett aa ssuubbssccrriibbeerr lliisstt.. + + If you want any user to be able to get a subscriber list, you can set + up a separate link to DDIIRR//lliisstt and then put in a script using ezmlm- + list (See ``adding your own commands'' for more info.) . The authors + strongly urge against this, since a common method for spammers to get + valid E-mail addresses from mailing lists is to exploit unrestricted + -list commands. A subscriber with questions about who is on the list + should contact the list-owner@host. A subscriber wishing to confirm + that they are still on the list can just send a message to list- + subscribe@listhost, and reply to the confirm request. The following + message will be a ``ezmlm response'' if the user was already a + subscriber, and a ``WELCOME to listname'' if s/he was not. + + + 1133..88.. CChhaannggiinngg tthhee ttiimmeeoouutt ffoorr mmeessssaaggeess iinn tthhee mmooddeerraattiioonn qquueeuuee.. + + Put the time, in hours, into DDIIRR//mmooddttiimmee. This value may not exceed + the range of 24-120 h set at compile time by the defines in iiddxx..hh. + + + 1133..99.. FFiinnddiinngg oouutt hhooww mmaannyy mmeessssaaggeess aarree wwaaiittiinngg ffoorr mmooddeerraattiioonn.. + + + + % ls -l DIR/mod/pending + + + + + and count lines with the owner execute bit set (rwx------). Others + are remnants from failed ezmlm-store runs (ignore - ezmlm-clean(1) + will remove them). + + There is currently no way to see this remotely, although you could + easily install a script mailing the 'ls' output in response to a + message to e.g. lliisstt--cchhkkqquueeuuee@@hhoosstt. (See ezmlm-check(1) and ``adding + your own commands'' for examples.) + + + 1133..1100.. UUssiinngg tthhee ssaammee mmooddeerraattoorrss ffoorr mmuullttiippllee lliissttss.. + + Set up a moderator dir: + + + + + + + % mkdir /path/moddir /path/moddir/subscribers + % touch /path/moddir/lock + % chown -R user /path/moddir + + + + + For alias: + + + + # chown -R alias /path/moddir + + + + + For example: + + + + % mkdir ~joe/mods ~joe/mods/subscribers + % touch ~joe/mods/lock + + + + + Then for the lists, put //ppaatthh//mmooddddiirr into DDIIRR//mmooddssuubb (for moderation + of subscribes), DDIIRR//rreemmoottee (for remote admin if DDIIRR//mmooddssuubb does not + exist), and DDIIRR//mmooddppoosstt (for moderation of messages). + + For example: + + + + % echo "/home/joe/mods" > ~joe/DIR/modsub + + + + + _N_O_T_E_: The path must start with a '/'. + + + 1133..1111.. UUssiinngg ddiiffffeerreenntt mmooddeerraattoorrss ffoorr mmeessssaaggee aanndd ssuubbssccrriippttiioonn mmooddeerr-- + aattiioonn.. + + Proceed as in the previous point, but set up two different moddirs. + Naturally, one of these can be DDIIRR//mmoodd// (preferably the one for posts, + to keep it cleaner). Then modify the appropriate files (DDIIRR//mmooddppoosstt + and DDIIRR//mmooddssuubb) to contain absolute paths to the correct moddir. + + + 1133..1122.. tthhee ````ssuuppeerr mmooddeerraattoorr'''' aabbllee ttoo aadddd//rreemmoovvee mmooddeerraattoorrss + rreemmootteellyy.. SSeettttiinngg uupp mmooddeerraatteedd lliissttss wwiitthh tthhee lliisstt oowwnneerr aass + + This is done by crating a list that has DDIIRR//mmoodd// as it's main list + directory, then adding the ``super moderator'' to DDIIRR//mmoodd//mmoodd// (see + ``remotely adding moderators''). + + If this is a common setup for you, you can write a simple script + creating both lists (plus a digest list, if desired) with one simple + action (see ezmlm-both(1) for an example). + + + + + + 1133..1133.. CCuussttoommiizziinngg eezzmmllmm aaddmmiinniissttrraattiivvee mmeessssaaggeess.. + + Subject lines, and other ezmlm output for moderation are controlled by + defines in iiddxx..hh and by files in DDIIRR//tteexxtt. To customize these, change + iiddxx..hh and recompile or for DDIIRR//tteexxtt files, edit eezzmmllmmrrcc((55)) (see + ``Customizing ezmlm-make operation''). + + You can also configure the list to allow remote administrators to edit + files in DDIIRR//tteexxtt// via E-mail (see ``How text file editing works''). + + + 1133..1144.. MMaannuuaallllyy aapppprroovviinngg aa mmeessssaaggee aawwaaiittiinngg mmooddeerraattiioonn.. + + All you have to do is to pipe the corresponding message to ``ezmlm- + send DIR''. Messages awaiting moderation are kept in DDIIRR//mmoodd//ppeennddiinngg//. + To find a particular file, grep the contents. Thus, to find a file + from user@host.dom, try: + + + + % grep 'user@host\.dom' DIR/mod/pending/* + + + + + (Depending on your setup, you may not have to escape the period.) + Check the files for the owner execute (``x'') bit. It is set on all + messages queued successfully. Ignore other files! + + To then accept the message (change the ezmlm-send(1) path if you've + installed in a non-default directory): + + + + % cat DIR/mod/pending/filename \ + % /usr/local/bin/ezmlm/ezmlm-send DIR + + + + + Alternatively, use ezmlm-accept(1). It checks the 'x' bit, ezmlm- + send(1) return codes, removes the file, etc. + + For example: + + + + % ezmlm-accept ~joe/SOS ~joe/SOS/pending/* + + + + + will accept all messages in the queue of the list in ~~jjooee//SSOOSS//. + + + 1133..1155.. MMaannuuaallllyy rreejjeeccttiinngg aa mmeessssaaggee aawwaaiittiinngg mmooddeerraattiioonn.. + + Simply deleting the file from DDIIRR//mmoodd//ppeennddiinngg// will do it. If you want + to notify the sender, just send him/her an E-mail. There is an easy + way to get ezmlm-idx programs to do it for you: just wait and let + ezmlm-clean(1) take care of it for you, once the message has timed out + (number of hours settable within 24-240 in DDIIRR//mmooddttiimmee; default 120). + + + + + 1144.. SSuubblliissttss.. + + A sublist is a list that receives its input from another mailing list, + rather than from users directly. The sublist is just a regular + subscriber of the main list. A sublist in e.g. Tasmania is very useful + since only one message is sent from the main list and then the + sublists servers all subscribers in Tasmania. Bounces and all + administration is handled locally. The local sublist can have a + digest, even though the main list may not. (See ``How sublists work'' + for more info on how sublists work). + + + 1144..11.. SSuubblliissttss ooff eezzmmllmm lliissttss.. + + To set up a sublist to an ezmlm list, just use the ezmlm-make ``-5 + mainlist@mainhost'' switch. This will configure your list as a sublist + to the mainlist@mainhost mailing list. + + + 1144..22.. SSuubblliissttss ooff nnoonn--eezzmmllmm lliissttss.. + + To set up a sublist to an ezmlm list, just use the ezmlm-make ``-5 + mainlist@mainhost'' switch. This will configure your list as a sublist + to the mainlist@mainhost mailing list. Since the main list may not use + the ``Mailing-List'' header, you must identify another header that the + main list adds to all messages. See the ezmlm-reject(1) man page for + examples. Next, edit DDIIRR//eeddiittoorr of your sublist and add a ``-h + _L_i_s_t_p_r_o_c_e_s_s_o_r_-_V_e_r_s_i_o_n_:'' option to the ezmlm-send(1) line, but + replacing ``_L_i_s_t_p_r_o_c_e_s_s_o_r_-_V_e_r_s_i_o_n_:'' with your mainlist header. + + Now your list will accept only messages from mainlist@mainhost and + with the header specified. + + + 1144..33.. HHooww ttoo sseett uupp aa cclluusstteerr ooff lliisstt aanndd ssuubblliissttss wwiitthh ssttaannddaarrdd + ddaattaabbaasseess.. + + ezmlm-0.53 allows sublists. The difference between a sublist and a + main list is that the sublist requires that the SENDER of the message + is the main list and that the message has a ``Mailing-List:'' header. + Sublist messages have their own subscriber database and subscription + mechanism, and use their own message number. This is very convenient + if you want to create a private sublist. Since the subscribers have + to interact with the appropriate sublist, it is difficult to + administrate if you want to use it to distribute the load of a very + large list, since users will have to address administrative requests + such as unsubscribe to the correct sublist. Also, bounce messages + refer to the sublist archive with sublist message numbers. + + ezmlm-idx modifies this in several ways: First, the message number of + the incoming message is used also for the outgoing message so that + subscribers see the same message number no matter which sublist they + get it from. For security reasons, this is enabled only if the sublist + is NOT ARCHIVED. With this feature, bounce messages can refer the user + to the main list archive instead, obviating multiple archives. + + Second, ezmlm-split(1) can be used to forward administrative requests + sent to the main list, to the appropriate sublist. Thus, subscribers + interact only with the main list, and do not need to know which + sublist that servers them. With bounce and administrative messages + referring them to the main list, subscribers will usually be unaware + of the sublisting. + + To set this up: + + + +o + + ccrreeaattee tthhee mmaaiinn lliisstt + + + ezmlm-make dir dot local host + + + + + +o + + aadddd aann eezzmmllmm--sspplliitt((11)) iinnvvooccaattiioonn + Before the ezmlm-manage(1) line in DDIIRR//mmaannaaggeerr add: + + + |/path/ezmlm-split dir + + + + + +o + + ddeecciiddee hhooww ttoo sspplliitt tthhee llooaadd + The main list sends to sublists and to any addresses not covered + by the split table. You can split the load by domain + (``geographically''), and any domain (including '') can be + subdivided by ``hash'' by using different parts of the 0-52 + range. Of course, you can also use hash alone. The request will + go to the first row that matches, so although overlaps are not + advisable (in case you later want to add sublists of switch to + an SQL server-based system (see ``'')), they have no negative + effects. The domain for ezmlm-split can be the last TWO parts, + i.e. ``edu.wustl'' to handle all *.wustl.edu subscribers. This + is useful, but remember that the SQL version supports only one + level. + + An example: + + + domain:hash_lo:hash_hi:sublistname + edu:0:52:sub1@here.edu + com:0:26:sub2@there.net + com:27:52:sub3@some.com + :0:13:sub4@what.org + :14:39:sub5@what.org + + + + + As you can see, the entire ``edu'' domain is handled by + sub1@here.edu. The ``com'' domain is about evenly split between + sub2@there.net and sub3@some.com. Everything else is split so that + approximately 1/4 goes to sub4@what.org, 1/2 to sub5@what.org and + the rest falls through, i.e. is handled by the main list. + + Why are there 2 sublists on the same host? This is in preparation + of adding a host. It easy to just move the entire sub5@what.org + list to a new host. All we have to do it to set up the new list, + copy over the subscribers, and change the name in the split table + entry. + + To split the split the sub5@what.org load onto 2 lists requires a + little more work. First, create a dummy split table in a directory + ``temp'': + + :14:26:new1@new.net + :27:39:new1@other.net + + + + + Next, split the subscribers of sub5@what.org into these 2 groups, + as detailed in the ezmlm-split(1) man page. Create the two new + lists, add the respective subscribers, and replace the + sub5@what.org line with the two lines above. + + To add a totally new domain, e.g. jp:0:52:sub6@niko.jp requires + collection or subscribers from all lists that currently handle + these subscribers, (the ones with blank domain in the example), re- + splitting them, and adjusting the subscribers. Easiest here is to + just unsubscribe the sub6@niko.jp subscribers to be from the other + list with ezmlm-sub(1). Since that program will silently ignore + any addresses that are not on the respective list, it will work + fine. + + +o + + CCrreeaattee tthhee ssuubblliissttss + Use ezmlmsubrc which sets up a minimal non-archived sublist with + bounce texts pointing to the main list: + + + + % ezmlm-make -Cezmlmsubrc -3mainlocal -4mainhost \ + DIR dot sub1local sub1host + + + + + +o + + ssuubbssccrriibbee tthhee rreessppeeccttiivvee ssuubblliissttss ttoo tthhee mmaaiinn lliisstt + If you forget, the sublist will not get any messages to + distribute. Add these addresses with ezmlm-sub(1) as subscribers + to the main list. + + A strong point of this system is that it is relatively simple and that + only a fraction of the addresses are available to any given sublist. + Thus, compromised security at a sublist threatens only the addresses + and functions handled by that sublist. + + As you can see, this works quite well, but it's not trivial to change + the setup. If you modify it while the list is running, some + subscribers may get duplicate messages or miss messages. Therefore, + you should disable deliveries to the main list before the final step + of the changes (removal of subscribers from old lists and adding new + lists as subscribers to the main list). For most lists, this should + work flawlessly, and some minimal planning and extra lines in + ``split'' can markedly facilitate future expansion. + + Another weak point is the authentication of messages between list and + sublist. The requirements the sublist places on the message can be + easily faked. This allows injection of messages at the sublist level + as a way to circumvent moderation or other access control. + + An associated disadvantage is that not even the main list has access + to all the addresses. Thus, SENDER checks for archive access + (relatively secure) and posts (relatively insecure) cannot directly be + used. Also, sublist cooperation is required to determine the number of + subscribers, or to access subscriber addresses for a purpose other + than distribution of list messages. + 1155.. MMiiggrraattiioonn ttoo EEzzmmllmm ffrroomm ootthheerr MMaaiilliinngg LLiisstt MMaannaaggeerrss.. + + This section describes differences and similarities between ezmlm and + other mailing list managers. It also details functions of ezmlm-idx + that allow you to configure ezmlm to respond to commands utilized by + such other mailing list managers so the command syntax will be + familiar to such users. Contributions to complete this sections are + welcome. + + + 1155..11.. BBaassiicc CCoonncceeppttss.. + + Ezmlm is different from other mailing list managers in that it is + _l_i_s_t_-_c_e_n_t_r_i_c rather than _h_o_s_t_-_c_e_n_t_r_i_c. With a _l_i_s_t_-_c_e_n_t_r_i_c interface, + you address the list directly with administrative commands. With + ezmlm, the command is embedded in the list address thus becoming part + of it (i.e., the ``command address''.) With smartlist, again you + address the list, but send all administrative commands to the list- + request address. Ezmlm lists can support this if you use the ezmlm- + make(1) ``-q'' switch to configure ezmlm-request(1) in DDIIRR//mmaannaaggeerr. + + Other mailing list managers are _h_o_s_t_-_c_e_n_t_r_i_c, i.e. administrative + commands for any list on that particular host are addressed to a + central address such as majordomo@host, listserv@host, or + listproc@host. Then the user is required to place the command in + either the subject header or more commonly in the body text of the + message. The listname has to be included with the command. [_N_o_t_e_: The + above concept is not universally applicable to all host-centric + mailing lists. While intended to to used in a host-centric manner, + many such mailing list managers also support listname-request@host + addressing. See the applicable list manger documentation for details. + Coverage of this aspect of other mailing list manager functionality is + beyond the scope of this FAQ.] To make the migration to ezmlm easier, + support for a _h_o_s_t_-_c_e_n_t_r_i_c style mailing list manger is available. + This is based on the use of ezmlm-request(1) with the ``-f + ccoonnffiigg__ffiillee'' switch. + + + 1155..22.. SSeettttiinngg uupp eezzmmllmm ttoo rreessppoonndd ttoo hhoosstt--cceennttrriicc ccoommmmaannddss.. + + ezmlm-request(1) can be used a a ``majordomo/listserv-emulator''. You + can create the necessary accessory files manually. However, ezmlm- + idx>=0.32 contains ezmlmglrc(5) which makes is very easy for you: + + + % su + # su alias + # ezmlm-make -C/usr/local/bin/ezmlmglrc dir dot local host + + + + + where ``local'' may be e.g. ``majordomo''. Even easier is to set it up + under a virtual domain ``host'' controlled by a user ``user''. Just + put ``user'' in place of ``alias'' in the example. + + If you use a character set other than US-ASCII, put it's name, + optionally followed by ``:'' and the desired content-transfer-encoding + character (``Q'' for quoted-printable and ``B'' for base64) into + eezzddoommoo//cchhaarrsseett. + + All that remains is to set up DDIIRR//eezzddoommoo..ccff with information on the + lists (local and/or remote) that you want to make accessible via this + interface. Another script, ezmlm-glconf(1) can help you with this for + your local lists. To configure for all your lists: + + ezmlm-glmake ~/ > ~/dir/ezdomo.cf + + + + + See man page for details. Alternatively, do it manually: + + The DDIIRR//eezzddoommoo..ccff contains a list of mailing lists which the + ``majordomo'' (in this case) can provide information about in the + following syntax: + + + list@host:listdir:description + + + + + To show a list in ``lists'', but not include it in a ``which'' search, + simply omit the ``listdir'' for that line: + + + list@host::description + + + + + For the ``which'' command to work, the DDIIRR//, which contains the + subscriber database, must be readable by the user under which mail is + delivered. This means that ``which'' is usually limited to lists owned + by the user or virtual domain under which the ``ezdomo'' interface is + set up. + + + 1155..33.. CCoommmmaannddss ooff ootthheerr mmaaiilliinngglliisstt mmaannaaggeerrss rreeccooggnniizzeedd bbyy eezzmmllmm.. + + + 1155..33..11.. LLiissttpprroocc//LLiissttsseerrvv.. + + When set up as above, substituting ``listproc'' or ``listserv'' for + ``majordomo'' as appropriate, ezmlm will recognize and respond to the + following commands placed in the body of the e-mail with the syntax + below. NNoottee:: eezzmmllmm wwiillll oonnllyy rreessppoonndd ttoo oonnee ccoommmmaanndd ppeerr mmeessssaaggee.. + + ssyynnttaaxx:: ccoommmmaanndd lliissttnnaammee [[ssuubbssccrriibbeerr@@hhoosstt]] + + + SSuuppppoorrtteedd ccoommmmaannddss + subscribe, sub, unsubscribe, unsub, list, help, review. + + AAddddiittiioonnaall ssuuppppoorrtteedd ccoommmmaannddss + All ezmlm commands, such as ``thread'', ``index'' and ``get'' as + well as the list owner's commands. + + This interfaced makes information available via command messages to + the appropriate mailing list. Thus, ``list'' and ``review'' will send + a subscriber list only to remote administrators and only if + specifically allowed by the list owner. + + + 1155..33..22.. MMaajjoorrddoommoo.. + + ssyynnttaaxx:: ccoommmmaanndd lliissttnnaammee [[ssuubbssccrriibbeerr@@hhoosstt]] + + + SSuuppppoorrtteedd ccoommmmaannddss + lists, subscribe, unsubscribe, help, which, who. + AAddddiittiioonnaall ssuuppppoorrtteedd ccoommmmaannddss + All ezmlm user and ezmlm owner commands. + + This interfaced makes information available via command messages to + the appropriate mailing list. Thus, ``who'' will send a subscriber + list only to remote administrators and only if specifically allowed by + the list owner. + + + 1155..33..33.. SSmmaarrttlliisstt.. + + Unlike ``listproc/listserv'' or ``majordomo'', ``smart-list'' does not + provide ``host-centric'' services. Rather, commands are addressed to + listname-request@host and the command placed on the ``Subject:'' line: + + + To: listname-request@host + Subject: command [subscriber@host] + + + + + The body of the message is normally ignored. If the subject is empty, + the first body line that starts with a letter is interpreted. + + + SSuuppppoorrtteedd ccoommmmaannddss + subscribe, unsubscribe. + + AAddddiittiioonnaall SSuuppppoorrtteedd CCoommmmaannddss + All ezmlm user and ezmlm owner commands. + + + 1166.. OOppttiimmiizziinngg lliisstt ppeerrffoorrmmaannccee.. + + Ezmlm-idx is designed to make it as easy as possible to set up mailing + lists. The default setup works well for small and medium-sized lists. + For large lists, the lists can be made more efficient with a few + simple changes. + + + 1166..11.. CCrroonndd--ggeenneerraatteedd ddiiggeessttss ffoorr bbeetttteerr ppeerrffoorrmmaannccee.. + + With the default setup, ezmlm-tstdig(1) in DDIIRR//eeddiittoorr tests if a + digest should be sent out. On lists with a lot of traffic this is + inefficient. Also, you may want digests to be delivered as a specific + time. To do this, use crond(8) to execute ezmlm-get(1) directly, as + described elsewhere. + + + 1166..22.. OOppttiimmiizziinngg eexxeeccuuttiioonn ooff eezzmmllmm--wwaarrnn((11)).. + + ezmlm-idx>=0.32 comes with much improved bounce handling. Modification + as described below should be considered only when you expect thousands + of bouncing addresses (virtually never). The description remains, for + users of ezmlm-0.53 or earlier versions of ezmlm-idx. For users of + ezmlm-0.53 alone, we recommend a patch ( + which fixes a + bug in ezmlm-0.53 bounce handling. The patch is superseded by ezmlm- + idx. + + To redistribute the load of bounce warning and probe addresses to off- + peak hours, you may want to set up the list without ezmlm-warn(1) by + using the ezmlm-make ``-w'' switch, and instead execute ``ezmlm-warn + DIR'' via crond(8). You also need to run ``ezmlm-warn -d DIR'' for + digest bounces if your list is configured with digests. Normal ezmlm + list with ezmlm-idx>=0.32 will have an insignificant bounce load, + except if you bulk add addresses, e.g. from a MLM without bounce + handling. In the latter case, the load will be higher for the first + 2-4 weeks, then decrease drastically. If you feel you need to run + ezmlm-warn(1) from crond(8), you should seriously consider sublisting + your lists. + + _N_o_t_e_: the ezmlm-make(1) ``-w'' switch has a special meaning if used at + the same time as enabling SQL-support (``-6''; see man pages). + + + 1166..33.. DDeeccrreeaassiinngg eezzmmllmm--wwaarrnn ttiimmee oouutt ttoo iinnccrreeaassee ppeerrffoorrmmaannccee.. + + With ezmlm-idx, you may alter the ezmlm-warn(1) timeout to a number of + seconds with the ``-t seconds'' switch. The default is 1,000,000 + seconds or about 11.6 days. This is the time from the first bounce + until ezmlm-warn(1) sends a warning message and the time from the + warning message bounce until ezmlm-warn(1) sends a probe (which if + bounced leads to removal of the address from the subscriber list). If + you have a digest list, remember to execute ezmlm-warn(1) with the + ``-d'' switch as well. + + Decreasing the default to e.g. 5 days will cut in half the average + number of files in the bounce directory and the number of messages + sent at each crond(8)-directed invocation of ezmlm-warn(1). The trade- + off is that worst case, a subscriber may be unsubscribed if his/her + mail path is defective for more than twice the timeout. Removing a + subscriber after 10 days seems reasonable on a busy list. Do this by + adding the ``-t'' switch to all the ezmlm-warn(1) invocations. This + timeout should be larger than the interval between ezmlm-warn(1) + invocation. + + To be aggressive, use ``ezmlm-warn -t0''. This will minimize the time + your lists spends servicing bounces, but will for some errors lead to + subscribers to be also lead to subscribers being removed if messages + to them bounce for two consecutive ezmlm-warn(1) runs. This is useful + to rapidly clean up a low quality address collection. + + + 1166..44.. UUssee eezzmmllmm wwiitthhoouutt eezzmmllmm--iiddxx ffoorr mmaaxxiimmuumm ppeerrffoorrmmaannccee.. + + ezmlm-idx adds a number of functions to ezmlm. It indexes the archive, + and adds an index entry for each message, it can remove MIME parts, it + can add a subject prefix and message trailer, decode rfc2047-encoded + subjects, etc. Although designed to impact minimally on performance, + these options when used take time. Even when they are not used, time + is spent looking for e.g. the prefix. However, the performance penalty + is small, as the absolutely dominating cost of a mailing list is the + work qmail does to deliver the messages to subscribers. + + In bench marking, we have not found a significant difference in + performance between ezmlm-0.53 and ezmlm-0.53+ezmlm-idx-0.32 when + ezmlm-idx features are not used. Thus, a non-indexed list with ezmlm- + idx-0.32 performs the same as the corresponding ezmlm-0.53 list. + Adding an index adds the overhead of another safe write (the index + file). Use of other features adds very marginally to execution time. + For virtually all lists, the ezmlm execution time is negligible + compared to the resources needed by qmail to disseminate the message + to the subscribers. + + + 1166..55.. NNoott aarrcchhiivviinngg ttoo mmaaxxiimmiizzee ppeerrffoorrmmaannccee.. + + An archived list needs to write the message to the archive. If you + don't need an archive, don't archive. However, the archive is very + useful to allow users to catch up on messages that they didn't receive + due to delivery problems. + + + 1166..66.. SSuubblliissttss ttoo mmaaxxiimmiizzee ppeerrffoorrmmaannccee.. + + Consider splitting your list into sublists, ideally geographically. + The main list deals only with a subset of subscribers (or only the + sublists), and each sublist deals with a subset of subscribers, + bounces, etc. This is the most rational way to scale ezmlm to large + lists (see ``How sublists work'' for more info on how sublists work + and ``Sublists'' on how to set up sublists). + + + 1177.. MMiisscceellllaanneeoouuss.. + + + 1177..11.. HHooww ddoo II qquuiicckkllyy cchhaannggee tthhee pprrooppeerrttiieess ooff mmyy lliisstt?? + + + + ezmlm-make -+ [changed_switches] dir + + + + + ezmlm-make(1) stores configuration info in DDIIRR//ccoonnffiigg and uses that + info as the default when you use the ``-+'' switch. If the list was + created with a very old version or ezmlm-0.53 ezmlm-make(1) you have + to restate all arguments the first time you edit the list. + + The ``-e'' switch works the same, without stickiness for switches. + + A message arriving during reconfiguration may be handled incorrectly. + The prudent user will set the sticky bit on the home directory to + prevent delivery, then clear it after the list has been changed. + + + 1177..22.. OOppeenn aarrcchhiivveedd lliisstt wwiitthh ddaaiillyy ddiiggeessttss.. + + This is the default setup. The main list generates digests in response + to a mailed request or when a message arrives and the amount of + messages since the last digest exceeds set limits (see ezmlm- + tstdig(1)). Alternatively, ezmlm-get(1) can be invoked from the + command line. In both cases, the generated digest message is + disseminated to the subscribers stored in DDIIRR//ddiiggeesstt//ssuubbssccrriibbeerrss//, + i.e. the subscriber database with the base directory DDIIRR//ddiiggeesstt//. + + +o See ``setting up a digest list'' on how to set up the lists. + + + 1177..33.. VVaarriiaattiioonnss iinn mmooddeerraattiioonn + + You can set up lists with combinations of message moderation, + subscription moderation, and remote administration, easiest by + combining ezmlm-make(1) ``-m'' ,``-s'', and ``-r'' switches. You can + use a non-default moderator db, by specifying a directory starting + with a slash in DDIIRR//mmooddssuubb or DDIIRR//rreemmoottee (for remote admin and + subscription moderation - always the same db for both functions) or in + DDIIRR//mmooddppoosstt for message moderation. You can point several lists to the + same moderator db, thus using the same moderators for several lists. + _N_O_T_E_: The user controlling the list must have read/write access to the + files (specifically, must be able to write the lock file). + + Some of these setups are not trivial. However, you can make them + trivial by modifying ezmlmrc(5) so that ezmlm-make(1) can set up the + desired lists by default or when the user uses e.g. the ``-y'' or + ``-z'' switches (see ``Customizing ezmlm-make operation''). + + + 1177..44.. LLiissttss tthhaatt aallllooww rreemmoottee aaddmmiinn,, bbuutt nnoott uusseerr iinniittiiaatteedd ssuubbssccrriipp-- + ttiioonn oorr aarrcchhiivvee rreettrriieevvaall.. + + Create a regular remote admin list, but remove DDIIRR//ppuubblliicc. This + allows moderators to (un)subscribe users and have archive access, but + rejects all user requests. Posts work as usual. Naturally, this can + be combined with message moderation or ezmlm-issub SENDER checks (see + ``Restricting message posting to the list''). + + + 1177..55.. LLiissttss tthhaatt aallllooww rreemmoottee aaddmmiinn,, uusseerr aarrcchhiivvee rreettrriieevvaall,, bbuutt nnoott + uusseerr--iinniittiiaatteedd ssuubbssccrriippttiioonn.. + + Create a regular remote admin list, remove DDIIRR//ppuubblliicc, and add the + ``-p'' [public] switch to the ezmlm-get(1) command line in + DDIIRR//mmaannaaggeerr. This overrides the normal DDIIRR//ppuubblliicc effect on ezmlm- + get(1) and archive retrieval, allowing full archive access to anyone, + but rejecting user -help and subscription commands. It is assumed + that the users know archive retrieval commands without help. If you + want to provide specific help, just link ~~//..qqmmaaiill--lliissttnnaammee--hheellpp to + DDIIRR//hheellpp, and invoke a script that copies help info from there. See + ezmlm-check(1) for an example. + + + 1177..66.. LLiissttss tthhaatt rreessttrriicctt aarrcchhiivvee rreettrriieevvaall ttoo ssuubbssccrriibbeerrss.. + + Use a standard list, but add the ezmlm-get(1) ``-s'' command line + switch in DDIIRR//mmaannaaggeerr. Only subscribers can receive archive excerpts. + Digests work as usual. This can be set up using the ezmlm-make(1) + ``-g'' switch. + + + 1177..77.. LLiissttss tthhaatt ddoo nnoott aallllooww aarrcchhiivvee rreettrriieevvaall aatt aallll.. + + Use a standard list, but add the ``-C'' switch to both the ezmlm- + get(1) and ezmlm-manage(1) command lines in DDIIRR//mmaannaaggeerr. No archive + retrieval commands will be honored. Digest can be created as usual + (See ``Restricting archive retrieval''). + + + 1177..88.. LLiissttss tthhaatt ddoo nnoott aallllooww aarrcchhiivvee rreettrriieevvaall aanndd ddoo nnoott aallllooww + ddiiggeesstt ttrriiggggeerriinngg ppeerr mmaaiill.. + + For maximal archive security, set up a normal indexed and archived + list, then remove the ezmlm-get(1) line from DDIIRR//mmaannaaggeerr and add the + ``-C'' switch to the ezmlm-manage(1) command line. You can still + create digests by direct invocation of ezmlm-get(1) from a script or + crontab entry. + + + 1177..99.. LLiissttss tthhaatt aallllooww aarrcchhiivvee rreettrriieevvaall oonnllyy ttoo mmooddeerraattoorrss,, bbuutt + aallllooww uusseerr--iinniittiiaatteedd ssuubbssccrriippttiioonn.. + + Create a normal remote admin (+ subscription moderated) list, and add + the ``-P'' (not public) switch to the ezmlm-get(1) command line in + DDIIRR//mmaannaaggeerr. Subscription will not be affected, but ezmlm-get(1) will + send archive excerpts only to moderators. Digests are unaffected. + + + 1177..1100.. LLiissttss tthhaatt ddoo nnoott rreeqquuiirree uusseerr ccoonnffiirrmmaattiioonn ffoorr ((uunn))ssuubbssccrriipp-- + ttiioonn.. + + + The need for a user handshake can be eliminated by the ezmlm-manage(1) + ``-S'' (subscribe) and/or ``-U'' (unsubscribe) switches. Alone, this + is very insecure. However, there may be some use for it in local lists + with subscription moderation, or alone for notifications where ease of + use is more important than preventing users from (un)subscribing + others. If the list has subscription moderation or remote + administration, any user subscribe or unsubscribe request is forwarded + to the moderators if the SENDER and target address do not match, even + if the ``-U/-S'' switches are specified. This is put in place to make + a ``-U/-S'' list similar to other list managers, not for security + (it's not secure, since a malicious outsider can easily fake the + SENDER address). Unsubscribe confirmations are sent also to the target + in this case, to avoid situations where the user needs moderator + ``permission'' to get off the list. + + + 1177..1111.. AAnnnnoouunncceemmeenntt lliissttss ffoorr aa ssmmaallll sseett ooff ttrruusstteedd ppoosstteerrss + + Set up the list with ezmlm-make ``-om'' and add the ``trusted E-mail + addresses'' to DDIIRR//mmoodd// with + + + % ezmlm-sub DIR/mod address@host + + + + + A post from a ``trusted address'' is sent back to that address for + approval, assuring that the user at that address really sent the post. + Posts from other e-mail addresses are rejected. + + + 1177..1122.. AAnnnnoouunncceemmeenntt lliissttss aalllloowwiinngg mmooddeerraatteedd ppoossttss ffrroomm aannyyoonnee.. + + This is useful in many circumstances. A list announcing new programs + for a system, where both the main developers and other users may have + contributed programs. + + Set up the list with ezmlm-make ``-m'' and the main developers as + moderators. When any of these posts, that user alone is asked to + confirm. Posts from other E-mail addresses are sent to all + moderators/developers. To use a different set of E-mail addresses as + ``trusted e-mail addresses'' and moderators for other posts, use the + ezmlm-store(1) ``-S'' switch and make a separate address database for + the ``trusted E-mail addresses''. Put the name of the basedir for the + ``trusted e-mail addresses'' database in DDIIRR//mmooddppoosstt (needs leading + ``/''), and add the post moderator(s) to DDIIRR//mmoodd// using ezmlm-sub(1) + as shown above. + + + 1177..1133.. AAnnnnoouunncceemmeenntt lliissttss wwiitthh lleessss sseeccuurriittyy aanndd mmoorree ccoonnvveenniieennccee.. + + A general solution for SENDER checking is to configure list with + ezmlm-gate(1). ezmlm-gate(1) takes as arguments any number of + basedirs for subscriber lists. Posts from SENDERs that are found are + posted. For others ezmlm-store(1) is invoked. If DDIIRR//mmooddppoosstt exists, + ezmlm-store(1) will send out other messages for moderation. To bounce + such messages, create DDIIRR//mmooddppoosstt, and use the ezmlm-gate(1) ``-P'' + switch (will be passed on to ezmlm-store(1) to bounce any posts not + from a moderator). + + By default, ezmlm-gate(1) accepts messages from subscribers. However, + this is overridden if any ``basedirs'' are put on the ezmlm-gate(1) + command line. Common would be to create a address list and put its + ``basedir'' on the ezmlm-gate(1) command line. Trusted E-mail + addresses can then be added with: + % ezmlm-sub basedir trusted@host + + + + + As this relies on SENDER checks it is less secure than the ezmlm-store + based confirmation-requiring setup. + + + 1188.. EEzzmmllmm--iiddxx ccoommppiillee ttiimmee ooppttiioonnss.. + + + 1188..11.. LLooccaattiioonn ooff bbiinnaarriieess.. + + This is configured via ccoonnff--bbiinn as for other ezmlm programs. The + default is //uussrr//llooccaall//bbiinn//eezzmmllmm. + + + 1188..22.. LLooccaattiioonn ooff mmaann ppaaggeess.. + + This is configured via ccoonnff--mmaann as for other ezmlm programs. The + default is //uussrr//llooccaall//mmaann. + + + 1188..33.. BBaassee ddiirreeccttoorryy ooff qqmmaaiill--iinnssttaallllaattiioonn.. + + This is configured via ccoonnff--qqmmaaiill as for other ezmlm programs. The + default is //vvaarr//qqmmaaiill. + + + 1188..44.. SShhoorrtt hheeaaddeerr tteexxttss,, eettcc.. + + Ezmlm-idx text (short lines, such as ``Administrivia'' for digests), + command names, etc, are defined in iiddxx..hh, used at compile time. You + can change them by changing the defines in this file. + + + 1188..55.. AArrbbiittrraarryy lliimmiittss.. + + iiddxx..hh contains defines for some ezmlm-idx arbitrary limits, such as + the maximum number of messages per ``-get'' request. They can be + changed here. + + + 1188..66.. CCoommmmaanndd nnaammeess.. + + There is support for one alias per user command for + internationalization. (See ``Multiple language support''.) + + + 1188..77.. EErrrroorr mmeessssaaggeess.. + + All ezmlm-idx error messages are defines in eerrrrttxxtt..hh, used at compile + time. These can be changed for special situations, but we would advise + against doing so. If you do for some reason produce such a translated + file, we would appreciate if you sent a copy to the authors. NOTE: + These do not affect error messages from programs that are not part of + the ezmlm-idx package, nor of some subroutines used by ezmlm-idx + programs (getconf_line.c comes to mind). + + Hopefully, the error messages for all parts will be synchronized in + later versions of ezmlm, and possibly handled from a run-time + changeable separate file (maybe as a .cdb database). + + + + 1188..88.. PPaatthhss aanndd ootthheerr oodddd ccoonnffiigguurraattiioonn iitteemmss.. + + idx.h also has defines for //eettcc//eezzmmllmmrrcc, default formats for + moderation enclosures, default character set, default digest format, + etc. Since most of these items are easily changed at run time, there + is usually no need to change the compiled-in defaults. If you do need + to, this is where they are. + + + 1199.. MMuullttiippllee llaanngguuaaggee ssuuppppoorrtt.. + + + 1199..11.. CCoommmmaanndd nnaammeess.. + + ezmlm commands can have aliases for use in translations for non- + English use. Due to the use of commands in mail e-mail addresses, the + character set is limited by rfc822 to us-ascii. To enable the command + aliases, remove the comment marks around the INTL_CMDS define in + idx.h. Also, remove the comments from the define corresponding to one + language (currently, only LANG_FR - French) available. + + The INTL_CMDS define results in the compilation of all ezmlm programs + with support for alias commands for those commands listed in the INTL + section (all that are used directly by users). All aliases MUST be + defined, but should be the normal English commands. The language- + specific sections un-define and redefine the commands for which + alternative names should be used. This allows use of e.g. + ``inscription'' as an alias in addition to the standard ``subscribe''. + + + 1199..22.. TTeexxtt ffiilleess.. + + Most ezmlm responses are made from text files in DDIIRR//tteexxtt//. These are + created from the template file ``ezmlmrc''. Thanks to Frank Denis, and + Masashi Fujita, Wanderlei Antonio Cavassin, Sergiusz Pawlowicz, Frank + Tegtmeyer, Torben Fjerdingstad, Jan Kasprzak, and Sebastian Andersson, + French, Japanese, Portuguese (var. Brazil), Polish, German, Danish, + Czech, and Swedish versions are available. Just: + + + % make jp + + + + + before + + + # make setup + + + + + or just copy eezzmmllmmrrcc..jjpp to //eettcc//eezzmmllmmrrcc, where it will override the + copy installed in the ezmlm binary directory. For rpm packages, the + en_US version is installed, but the other versions are available in + the //uussrr//ddoocc// hierarchy. + + If you have made an eezzmmllmmrrcc((55)) version for another language, please + make it public domain and E-mail it as an attachment to + lindberg@id.wustl.edu. It will then be put into the eezzmmllmmrrcc directory + of the distribution site. Please take advantage of the ``Content- + transfer-encoding'' capability of ezmlm-idx>=0.30, if needed, as this + avoids problems when messages are sent via non-8-bit MUAs. + + + Other ezmlm responses, such as words in subject lines, are defines in + iiddxx..hh and can be changed there. Error messages should ideally not be + altered. However, it may make sense to change a few of them which are + used as messages to e.g. remote administrators. The defines for all + error messages are in eerrrrttxxtt..hh. + + + 1199..33.. MMuullttii--bbyyttee cchhaarraacctteerr ccooddee ssuuppppoorrtt.. + + ezmlm, as far as we know, places no restrictions on character sets. + The configurable default character set allows you to use other + character sets for out going ezmlm messages. ezmlm-make does not _p_e_r + _s_e support other character sets. However, any single-byte character + set is supported, as long as the us-ascii character sequence ``'' (where ``x'' is any number, or A, B, C, + D, F, H, L, R, T) does not occur anywhere is text (if it does, it + risks being substituted). Also, any occurrence or ``<#A#>'' and + ``<#R#>'' that is the first on any text line will be substituted by + ezmlm-manage and ezmlm-store. Any occurrence of ``!A'' and ``!R'' as + the first characters on a line will be substituted by ezmlm-manage and + ezmlm-store. + + For multi-byte character codes, the same restrictions apply. Thus, + ``'' sequence within the text risks substitution. In practice, + both of these should be very rare and easily avoidable when setting up + an ezmlmrc(5). + + + 2200.. SSuubbssccrriibbeerr nnoottiiffiiccaattiioonn ooff mmooddeerraattiioonn eevveennttss.. + + + 2200..11.. GGeenneerraall ooppiinniioonnss.. + + This is a collection of the authors opinions and an explanation of + ezmlm-idx moderation design, which you may or may not agree with. + + + 2200..22.. UUsseerrss sshhoouulldd kknnooww tthhaatt tthhee lliisstt iiss ssuubbssccrriippttiioonn mmooddeerraatteedd.. + + List subscribers should be informed that subscriptions to the list are + controlled by a moderator. ezmlm-idx in its default setup handles + this notification during and after the subscribe handshake. Most of + this can be disabled by manipulation of the DDIIRR//tteexxtt// files. + + + 2200..33.. SSuubbssccrriibbeerrss sshhoouulldd kknnooww tthhaatt ppoossttss aarree mmooddeerraatteedd.. + + List subscribers should be informed that posts to the list are + moderated. ezmlm-idx does this by adding the ``Delivered-To: moderator + for ...'' header, but IOHO, the list owner should make the fact of + list moderation plain in introductory messages, or other means, to the + list subscribers. + + + 2200..44.. SSeennddeerrss ooff ppoossttss sshhoouulldd bbee nnoottiiffiieedd ooff rreejjeeccttiioonnss.. + + With normal use of ezmlm-idx, the sender of a rejected post is + notified that the post has been rejected and if the moderators chooses + to comment, the sender receives this comment, usually describing why + the post was rejected. This ezmlm behavior cannot be disabled at run + time. + + If post are neither accepted or rejected, they time out. ezmlm- + clean(1) notifies the sender when this happens. This behavior can be + disabled with the ezmlm-clean(1) ``-R'' (not return) switch, which has + to be placed on the command line of all invocations of ezmlm-clean(1) + (normally in DDIIRR//eeddiittoorr and DDIIRR//mmooddeerraattoorr). If you for some reason do + not wish to inform the sender of your editorial decision, you can use + this switch and let undesirable posts time out, rather than actively + rejecting them. IOHO, it is better to be "above board" and use the + normal notification mechanisms, together with active rejection and + informative rejection comments. + + The ezmlm-make(1) ``-u'' switch uses moderation in a slightly + different way. Here, posts are restricted to subscribers, but posts + from non-subscribers are sent to the moderator(s) rather that being + ignored. This to help the subscriber that posts from an alias of the + subscribed address, or the occasional non-subscriber. In this case it + is perfectly acceptable to just ignore non-accepted posts. Thus, using + the ezmlm-make(1) ``-u'' switch configures the ezmlm-clean(1) + invocations with the ``-R'' switch. + + + 2211.. EEzzmmllmm--iiddxx sseeccuurriittyy.. + + + 2211..11.. GGeenneerraall aassssuummppttiioonnss.. + + This document discusses security aspects of ezmlm-idx addition to the + ezmlm-0.53 mailing list manager. This is the authors' understanding of + security aspects of ezmlm-idx functions and not to be taken as a + warranty. If you find any errors in this document or the ezmlm-idx + package in general, please inform the authors. + + In general, ezmlm with or without the ezmlm-idx package is more secure + and less resource hungry than most other mailing list managers. Better + security than afforded by ezmlm +/- ezmlm-idx would require encryption + or PGP/digital signatures. Such an addition would make it difficult, + if not impossible, to run the mailing list from a standard MUA. The + ezmlm-idx package adds a number of functions and options, which under + some conditions may decrease security. The purpose of this document is + to discuss security aspects of using/enabling these different + functions. + + + 2211..22.. SSEENNDDEERR mmaanniippuullaattiioonn.. + + We assume that the cost of manipulating/falsifying the SENDER address + of a message is zero. Thus, any mechanism relying on SENDER alone is + insecure. However, such a mechanism may help in case of simple mailer + or user errors. We also assume that the "cookies" used by ezmlm are + secure, i.e. that it is very hard for someone to generate a valid + cookie for a given address. SENDER is used to identify a moderator for + remote administration of subscriptions. The result of the action or + the confirmation request are sent back to that moderator address. + Thus, providing a false SENDER is useless, unless the attacker can + also read that moderator's mail. + + + 2211..33.. eezzmmllmm ccooookkiieess.. + + Since ezmlm doesn't rely on the SENDER, the security lies entirely + within the action-time-cookie-address combination. Anyone obtaining a + valid "combination" can do whatever the combination is meant to do, + but nothing else. Also, the cookie times out 1000000 seconds + (approximately 11.6 days) after it was issued. Since the + "combinations" are specific for a particular action and address, they + can only be reused for that particular purpose, and within 11.6 days. + Ezmlm (un)subscriptions for a given address are usually pointless to + repeat. Message moderation "combinations" are useless after they've + been used, since the message is no longer in the moderation queue. + + + 2211..44.. LLiissttss wwiitthhoouutt rreemmoottee aaddmmiinn//ssuubbssccrriippttiioonn mmooddeerraattiioonn.. + + Maliciously (un)subscribing an address with ezmlm-0.53 requires that + the attacker is able to read mail sent to the subscription address. + + With the ezmlm-idx add-on, a non-moderated list works exactly the same + way. Ezmlm-idx introduces the moderator for moderated and remote admin + lists. For any moderator functions, an attacker needs to be able to + read mail sent to a moderator's address. If s/he can do this, the + attacker can affect anything the moderator is allowed to do (since + falsifying SENDER is trivial). To minimize risks, give moderators only + the power they need, do not use more moderators than necessary, and + use moderators whose mail is hard to intercept (on the same + machine/same internal/secure network or by encryption via e.g. ssh). + + + 2211..55.. MMeessssaaggee mmooddeerraattiioonn.. + + A basic message moderated list keeps ezmlm subscriber security, but + interpolates the moderator(s) between the address of the list and the + list itself. An attacker able to read moderator mail can accept/reject + a post, if s/he can do it before a regular moderator has taken action. + The potential for abuse can be minimized by using few and local + moderators. Mail logs are needed to trace which moderator address was + misused. + + + 2211..66.. SSuubbssccrriippttiioonn mmooddeerraattiioonn.. + + A basic subscription moderated list retains ezmlm subscriber security, + but adds a moderator handshake. An attacker would need to be able to + both read mail to the subscriber address and to at least one + moderator. + + + 2211..77.. RReemmoottee aaddmmiinniissttrraattiioonn.. + + A remote admin (-r) list adds the ability of the moderator to + (un)subscribe any address. The price of this is that an attacker able + to read moderator mail can (un)subscribe any address. The moderator + handshake message will be delivered to the abused moderator address, + which will alert that moderator and reveal the compromise. Another + basic assumption is that action-date-cookie-address combinations are + only sent to the target address or a moderator and that moderator + action "combinations" are never sent to non-moderators. + + + 2211..88.. RReemmoottee eeddiittiinngg ooff eezzmmllmm tteexxtt ffiilleess.. + + ezmlm-manage(1) can allow remote administrators to edit files in + DDIIRR//tteexxtt. First, this option is disabled by default. Second, the + ``-edit'' command is accepted only when the target (the recipient) is + a remote administrator. Third, only existing files within DDIIRR//tteexxtt + are editable. It is not possible to create files. + + ezmlm replies to a valid request with an informative message and the + contents of the file. In addition, the ``Reply-To:'' address contains + a cookie based on the file name and contents, as well as the current + time. Anyone possessing this cookie can save a new version of the + text file. As with other ezmlm security, the security of this process + depends on only the remote administrator receiving remote + administrator mail. If this is not sufficiently secure for you, do not + enable this option. As always, an increase in accessibility results + results in a decrease in security. + + Cookies for editing expire in approximately 27 hours. Also, as soon as + a file is changed, the cookie is invalidated since the file contents + change. This also means that an outstanding edit request cannot be + completed if the files has been updated in the interim. + + A potential attacker obtaining a valid cookie has a window of + opportunity while you edit the file, or for at most 27 hours. S/he can + overwrite and existing text file with potentially offensive material. + Usually, this can be achieved more easily by posting to the list. S/he + can also potentially fill your disk with a large amount of data (up to + two times 10240 bytes (limited by MAXEDIT in iiddxx..hh)) and could put + part of this data onto messages leaving the list. Again, this is much + more easily achieved by e.g. sending the equivalently sized message to + your list. + + + 2211..99.. DDiiggeesstt ggeenneerraattiioonn aanndd aarrcchhiivvee rreettrriieevvaall.. + + The archive retrieval functions added by ezmlm-idx are digests + (protected by a "code") and other functions. Anyone who knows the + digest code (through reading mail logs, reading DDIIRR//mmaannaaggeerr of the + list, or reading any scripts used to send digest triggering messages) + can trigger a digest. Protect these locations accordingly! For + default lists with digests triggered from DDIIRR//eeddiittoorr via ezmlm- + tstdig(1) and ezmlm-get(1), you do not need the digest code and can + thus disable the possibility to trigger digest by mail. For other + functions, the output is sent to SENDER and can be restricted to + subscribers (the ``-s'' switch). ezmlm-get(1) functions (apart from + digest) can be entirely disabled with the i``-C'' switch, or + restricted to moderators with the ``-P'' switch or by removing + DDIIRR//ppuubblliicc. Other sections of this document discuss several other + options. All switches are documented in the man pages. + + The moderator support functions added by the ezmlm-idx package + (extended help and subscriber list) are sent only to a moderator + address, i.e. an attacker again needs to be able to read moderator + mail to read the output. The help info (DDIIRR//tteexxtt//mmoodd--hheellpp) should not + contain secrets. The ``-list'' function is normally disabled, but can + be enabled with the ezmlm-manage -l switch to aid the remote + administrator(s). + + + 2211..1100.. CCoonnvveenniieennccee ffoorr sseeccuurriittyy:: tthhee eezzmmllmm--mmaannaaggee ````--SS'''' aanndd ````--UU'''' + sswwiittcchheess.. + + ezmlm-manage(1) functions can be made more convenient, at the expense + of security. There have been many requests for these options, so they + have been added, although we recommend against using them: + + The ezmlm-manage(1) ``-S'' switch eliminates the subscriber handshake + from subscribe requests. Thus, it is no longer necessary for the + subscriber to confirm the subscription. This is not secure, but may be + convenient for some moderated lists. Use only with extreme caution. + The ezmlm-manage(1) ``-U'' switch similarly eliminates subscriber + confirmation from unsubscribe requests. Again, this is insecure and + useful only under special circumstances. If the list has any + moderators (remote or modsub), requests to (un)subscribe an address + other than sender are still routed to a moderator. This is similar to + how some other lists work. Naturally, this is insecure because it + relies on SENDER. Unsubscribe requests are always non-moderated, + since, IOHO, it seems un-ethical to force a subscriber to remain on a + list. Where an unsubscribe confirm request is sent out it is (also) + sent to the target, except when the request was initiated by a + moderator on a list with remote administration (DDIIRR//rreemmoottee exists). + The (un)subscription target is always informed about completed + (un)subscribe request, whether initiated by that address, another + address, or by a moderator. Thus, attempts of a user or moderator to + subscribe an address will be brought to the attention of the user + receiving mail at that address. + + + 2211..1111.. DDeenniiaall ooff sseerrvviiccee.. + + ezmlm-get(1) archive retrieval functions can be used to deplete system + resources. However, this can also be done by posting messages to + lists, mail bombing, etc. If you are worried about this, you can use a + combination of ezmlm-manage/ezmlm-get ``-C'', ``-s'', and ``-P'' + switches, removal of DDIIRR//ppuubblliicc, and removal of the mail-triggered + digest function (by removing the digest code from the ezmlm-get(1) + command line) to decrease availability of these functions (see man + pages). Digest can also be triggered by direct execution of ezmlm-get + from within a script from DDIIRR//eeddiittoorr as in the default setup with the + ezmlm-make(1) ``-d'' switch. + + + 2211..1122.. MMooddeerraattoorr aannoonnyymmiittyy.. + + Anyone getting messages from the list can see the ``Delivered-To: + Moderator for ...'' header and realize that the list is moderated. In + the authors opinion, this is fair and appropriate. If this bothers + you, edit the source of eezzmmllmm--ssttoorree..cc. + + While the fact that the list is moderated will be disclosed by the + headers, the moderator(s)' identity will not be disclosed by the + header. Moderators are anonymous to anyone who cannot directly read + the mail log, the moderator list, or monitor your outgoing and + incoming mail. Anyone intercepting the acting moderators' mail or able + to read the mail log can determine who took a particular action. + + Moderator E-mail addresses are not (to our knowledge) disclosed by any + ezmlm mechanism. Thus, the poster does not know who rejected/accepted + the message. Other moderators can find out that the message was + accepted (by seeing it on the list or by themselves committing to a + reject/accept reply) or rejected (by being informed by the poster or + by themselves committing to a reject/accept reply). If no moderator + takes any action for a given time (120 h - configurable to anything + 24-240 h via DDIIRR//mmooddttiimmee - and the parameters are likewise + configurable at compile time via iiddxx..hh) the message times out, an act + for which no particular moderator can be held accountable. + + Subscription requests are acted upon only if a moderator completes the + transaction by approving the requests. Requests can not be directly + disapproved, but the associated cookie becomes invalid after + approximately 11.6 days. Neither the subscriber nor the other + moderators know which moderator accepted the subscription request. + Requests to unsubscribe from the list are never moderated or otherwise + controlled, except by requiring confirmation from the subscriber + (normal unsubscribe) or the moderator that initiated the request + (remote administration). If several moderators approve the same + subscribe request, the user gets multiple notifications. + + The triggering message (the moderation approval or the moderator's + completion of the subscription request) are not returned or logged. + This protects moderator anonymity, but makes it harder to track down + the offender in case of abuse. Only a good mail log will help. IOHO, + abuse of these mechanisms requires considerably more effort that it is + worth to (un)subscribe someone to a list. Also, IOHO, moderator + anonymity is more important. If this increased difficulty in tracking + down abusive behavior bothers you, don't use the remote administration + and moderated subscription features. + 2211..1133.. CCoonnffiiddeennttiiaalliittyy ooff ssuubbssccrriibbeerr EE--mmaaiill aaddddrreesssseess.. + + The optional ``-list'' command enabled by the ``-l'' ezmlm-manage(1) + command line switch returns a subscriber list to the moderator. Again, + anyone who can intercept a moderators' mail can fake SENDER and use + this command to obtain a subscriber list. The use of local moderators + minimize the risk. If the risk of subscriber disclosure is not worth + this convenience, do not enable this feature. + + + 2211..1144.. HHeellpp mmeessssaaggee ffoorr mmooddeerraattoorrss.. + + ezmlm-manage sends DDIIRR//tteexxtt//mmoodd--hheellpp, rather than DDIIRR//tteexxtt//hheellpp in + reply to messages to list-help@host if the target address is a + moderator. DDIIRR//tteexxtt//mmoodd--hheellpp should not contain secrets or other + confidential information. + + + 2211..1155.. SSuubblliissttss.. + + ezmlm sublists require that the message envelope sender is the main + list, and that the message has a ``Mailing-List:'' header. Both are + easy to fake, allowing an attacker to inject messages at the sublist + level. Other than the possible ramifications of only a subset of + subscribers seeing the message, this is of no concern for open lists. + For a ``subscriber-only'' list based on SENDER checks, it is no harder + to set SENDER to the address of a subscriber than to fake the headers + required by the sublist. However, for a moderated list the mainlist to + sublist communication becomes the weakest link. Sublists using a SQL + database also use better authentication in this step (see ``SQL- + enabled ezmlm lists''). + + A sublist user can unsubscribe a normal ezmlm sublist from the main + list. To guard against this, you need to prevent propagation of + unsubscribe confirm requests by the sublist. Easiest is to add a line + to DDIIRR//eeddiittoorr before the ezmlm-send(1) line: + + + |grep -i '^Subject: CONFIRM' >/dev/null 2>&1 && exit 99; exit 0 + + + + + Another option would be to take advantage of the fact that DDIIRR//hheeaaddeerr-- + aadddd headers at the main list are added to normal messages, but not to + administrative messages. Thus, one could discard messages that lack + the default ``Precedence: bulk'' header: + + + |grep -i '^Precedence: bulk' >/dev/null 2>&1 || exit 99; exit 0 + + + + + For lists with SQL-support, users cannot unsubscribe sublists (see + ``SQL-enabled ezmlm lists''). + + Break-in at a sublist host for normal ezmlm lists leads to + loss/compromise of the addresses handled by the sublist. For MySQL- + enabled lists, the sublist access credentials give DELETE and SELECT + access to all addresses serviced by the list. Thus, a successful + sublist attacker can completely disable the list. The MySQL log (if + used) will reveal from which host the attack was done. Although the + potential damage to a SQL-enabled list is greater, the results are of + the same order of magnitude. The risk in minimized by keeping control + over all sublist hosts. A successful sublist attacker cannot normally + add addresses, since the sublist users by default are set up without + INSERT privileges to the address database. + + + 2211..1166.. SSQQLL ddaattaabbaasseess.. + + For SQL-enabled lists, the database contains all list information. + Subversion of your database server allows an attacker to add/remove + addresses at will. This is also true for normal ezmlm lists. In + addition, modification of the ``*_name'', ``*_cookie'', and ``*_mlog'' + tables can cause the list to misbehave in a manner that doesn't + immediately suggest a security breach. Keep your ezmlm list and + database servers secure. + + + 2211..1177.. RReeppoorrttiinngg sseeccuurriittyy pprroobblleemmss.. + + Please send private E-mail about any security problems with the ezmlm- + idx additions to Fred Lindberg, lindberg@id.wustl.edu. For ezmlm, + please send them via private E-mail to Dan J. Bernstein, the author of + ezmlm proper. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -crN ../ezmlm-0.53/FILES.idx ./FILES.idx *** ../ezmlm-0.53/FILES.idx Wed Dec 31 18:00:00 1969 --- ./FILES.idx Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,165 ---- + CHANGES.idx + DOWNGRADE.idx + FAQ.idx + FILES.idx + INSTALL.idx + LICENCE.TXT + README.idx + TARGETS + UPGRADE.idx + author.c + auto_cron.h + case_diffs.c + case_starts.c + checktag.c + concatHDR.c + conf-cron + conf-sqlcc + conf-sqlld + copy.c + copy.h + date2yyyymm.c + dateline.c + decodeB.c + decodeHDR.c + decodeQ.c + encodeB.c + encodeQ.c + env.c + errtxt.h + ezcgi.css + ezcgirc + ezmlm-accept.1 + ezmlm-accept.sh + ezmlm-archive.1 + ezmlm-archive.c + ezmlm-cgi.1 + ezmlm-cgi.c + ezmlm-check.1 + ezmlm-check.sh + ezmlm-clean.1 + ezmlm-clean.c + ezmlm-cron.1 + ezmlm-cron.c + ezmlm-gate.1 + ezmlm-gate.c + ezmlm-get.1 + ezmlm-get.c + ezmlm-glconf.1 + ezmlm-glconf.sh + ezmlm-idx.1 + ezmlm-idx.c + ezmlm-issubn.1 + ezmlm-issubn.c + ezmlm-limit.1 + ezmlm-limit.c + ezmlm-list.c + ezmlm-make.1 + ezmlm-make.c + ezmlm-manage.1 + ezmlm-manage.c + ezmlm-mktab + ezmlm-mktab.1 + ezmlm-moderate.1 + ezmlm-moderate.c + ezmlm-receipt.1 + ezmlm-receipt.c + ezmlm-reject.1 + ezmlm-reject.c + ezmlm-request.1 + ezmlm-request.c + ezmlm-return.c + ezmlm-send.c + ezmlm-split.1 + ezmlm-split.c + ezmlm-store.1 + ezmlm-store.c + ezmlm-sub.c + ezmlm-test.1 + ezmlm-test.sh + ezmlm-tstdig.1 + ezmlm-tstdig.c + ezmlm-unsub.c + ezmlm-warn.c + ezmlmglrc + ezmlmglrc.5 + ezmlmrc.5 + ezmlmrc.cs + ezmlmrc.da + ezmlmrc.de + ezmlmrc.en_US + ezmlmrc.es + ezmlmrc.fr + ezmlmrc.id + ezmlmrc.it + ezmlmrc.jp + ezmlmrc.pl + ezmlmrc.pt_BR + ezmlmrc.ru + ezmlmrc.sv + ezmlmsubrc + ezmlmsubrc.5 + idx.h + idx.patch + idxthread.c + idxthread.h + issub.c + logmsg.c + makehash.c + makehash.h + mime.h + opensql.c + putsubs.c + qmail-qmqpc.tar.gz + qmail-verh.tar.gz + qmail.c + qmail.h + searchlog.c + subscribe.c + subscribe.h + tagmsg.c + unfoldHDR.c + yyyymm.h + + sub_mysql: + README + checktag.c + conf-sqlcc + conf-sqlld + ezmlm-mktab + issub.c + logmsg.c + opensql.c + putsubs.c + searchlog.c + subscribe.c + tagmsg.c + to40x + + sub_pgsql: + README + checktag.c + conf-sqlcc + conf-sqlld + ezmlm-mktab + issub.c + logmsg.c + opensql.c + putsubs.c + searchlog.c + subscribe.c + tagmsg.c + + sub_std: + README + checktag.c + conf-sqlcc + conf-sqlld + ezmlm-mktab + issub.c + logmsg.c + opensql.c + putsubs.c + searchlog.c + subscribe.c + tagmsg.c diff -crN ../ezmlm-0.53/INSTALL.idx ./INSTALL.idx *** ../ezmlm-0.53/INSTALL.idx Wed Dec 31 18:00:00 1969 --- ./INSTALL.idx Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,274 ---- + $Id: INSTALL.idx,v 1.49 1999/12/24 20:12:57 lindberg Exp $ + $Name: ezmlm-idx-040 $ + + Like any other piece of software (and information generally), ezmlm-idx + comes with NO WARRANTY. + + This file is for installing ezmlm-idx for the first time on a system + that may have ezmlm-0.53. If you're already using ezmlm-idx, see + UPGRADE.idx instead. + + Things you have to decide before starting: + + Common for ezmlm-0.53: + Put the desired ezmlm bin path into conf-bin. Default "/usr/local/bin/ezmlm", + but for e.g. rpm packages it's "/usr/bin". Adjust conf-man accordingly. + For installations (e.g. Debian) where qmail is not in "/var/qmail", adjust + conf-qmail. + + NOTE: If you follow the test instructions in INSTALL of ezmlm-0.53 after + adding ezmlm-idx, step 6 will fail. Before this step, edit + ~/testlist/editor and remove the ezmlm-reject line. + + HOW TO BUILD, TEST, AND INSTALL: + + 1. Expand the ezmlm-0.53.tar.gz archive. expand the ezmlm-idx-0.xx.tar.gz + archive: + % zcat ezmlm-0.53.tar.gz | tar -xvf + % zcat ezmlm-idx-0.xx.tar.gz | tar -xvf + + 2. Copy the contents of the archive to your ezmlm-0.53 directory. + % mv ezmlm-idx-0.xx/* ezmlm-0.53/ + + 3. Patch the ezmlm-0.53 source: + % cd ezmlm-0.53 + % patch < idx.patch + + If you patch utility failes with this, get GNU patch. + [ezmlm-issubn, an enhanced version of ezmlm-issub is part of this package. + The patch for the ezmlm-return bug is also part of this package.] + + 4. If your 'crontab' binary does not live in '/usr/bin' edit 'conf-cron' + now to reflect the correct path. + + 5. RDBM Support. + + MySQL: + If you want to compile ezmlm with MySQL support (http://www.tcx.se), + edit sub_mysql/conf-sqlcc (include files) and mysql/conf-sqlld (libraries) + to reflect your MySQL installation (see MySQL documentation). The files + are preset for RedHat Linux-i386. On some systems, the ``-lnsl'' should + be removed from conf-sqlld. The package has been tested with MySQL 3.22. + + (Programs compiled with MySQL support will work like + their non-MySQL counterparts for lists that are not specifically + set up to take advantage of MySQL support.) Do: + % make mysql + + PostgresSQL: + If you want to compile ezmlm with PostgreSQL support + (http://www.postgreSQL.org), edit sub_pgsql/conf-sqlcc (include files) + and pgsql/conf-sqlld (libraries) to reflect your PostgreSQL installation + (see PostgreSQL documentation). Do: + % make pgsql + + Others: + If you're familiar with C programming for the particular RDBMS, it will + take you no more than a few hours to adapt the files in sub_mysql (see + docs there). Create a new sub_????, tar and gzip it and send it to + lindberg#@id.wustl.edu for inclusion into the package. + + 6. Compile the programs and man pages: + % make clean + % make; make man + + 7. To use a language other than US English as the default for list texts: + % make ISO + + where ``iso'' is the ISO language designation. Currently supported + are: cz, da, de, en_US, fr, jp, pl, pt_BR, sv. NOTE: A normal ``make'' sets + up the en_US version (as before). ezmlmrc files for your language + may be available via ftp://id.wustl.edu/pub/patches/ezmlmrc. If not, + please feel free to contribute one (translate ezmlmrc.en_US, but leave + comments intact for "diff"). + + 8. Test the programs: + a. Create a user ``eztest'' or edit ezmlm-test to use another user name. + This user should be able to execute the new binaries and also needs + to have read access to ezmlm-test (chmod 755 ezmlm-test). + b. Change to that user. + c. From the build directory, execute ezmlm-test: + % ./ezmlm-test + + ezmlm-test will set up a test list, execute the various programs, and + test most functions of most programs. It works only if your qmail + installation works and allows sending mail to the local user. If you + use another user name, add ``-u other_user_name''. NOTE that the + arguments must be separated by a space from the switches. + + Occasionally, ezmlm-test fails. This is usually due to problems with + ezmlm-test on your particular platform/installation and not due to + problems in ezmlm-idx. Please report problems with ezmlm-test, and if + you can, patches for correcting it. + + + 9. To test the SQL functions, set up a mysql database ``ezmlm'' accessible + to a user at this host (see MySQL/PostgreSQL docs; the ezmlm-mktab script + creates the necessary tables (see man page) but you must first create a + database and a user with sufficient access. + + The following command creates a database for use with ezmlm-test. + NOTE that ezmlm-mktab and ezmlm-test options must be separated from the + switch, whereas the passwd argument for mysql -p must immediately + follow the switch. + % ./ezmlm-mktab -d list | mysql -hhost -uuser -ppasswd -f ezmlm + + or for PostgresSQL: + % ./ezmlm-mktab -d list | pgsql [...] ezmlm + + Now, as the ``eztest'' user, execute: + % ./ezmlm-test -l user -p passwd -h host + + This will test the SQL part of the binaries. ``host'' defaults to + ``localhost'' and ``user'' defaults to ``ezmlm''. There is no default + for passwd and indeed ezmlm-test uses this switch to know to work + with SQL support. To execute under a user other than ``eztest'', + add a ``-u testuser'' switch. Note that -p has to be specified even if + the database has no password. In this case, use -p ''. + + 10. If you for some reason want to rebuild binaries without MySQL support, do: + % make std + % make + + 11. Copy binaries and man pages to the correct locations. + # make setup + (or copy manually). + If you'd like to retest the installation, change uid to the test user + ``eztest'' and change to the ezmlm binary directory. Now run ezmlm-test + as before. + + + 12. Your lists will run as before. To enable ezmlm-idx features like + threaded archive access, digest, etc, use: + + % ezmlm-make -e [switches] DIR dot local host + + where ``DIR dot local host'' are the arguments used to create the list, + and ``switches'' are desired options (see ezmlm-make man page). Future + adjustments can be made with: + + % ezmlm-make -+ [switches] DIR + + where ``switches'' are desired _changes_ from the previous configuration. + + ------ OPTIONAL ------ + + 13. If you want qmail to add a subscriber-adapted List-Unsubscribe header to + outgoing messages, apply the enclosed qmail-verh-0.03.tar.gz patch to + qmail-1.03 and follow the documentation in that archive. This is a + failsafe way in which to unsubscribe, even if subscriber or list have + changed address. + + 14. If you want to use large lists with custom QMQP servers, apply the + qmail-qmqp.tar.gz patch per instructions in the archive. You need this + only if you want per-[sub]list control over the QMQP servers used. + + 15. (This can be done later if you decide to use ezmlm-cron(1). It is not + needed for normal lists and mainly for ``legacy installations''.) + The ezmlm-cron(1) program can be run SUID/SGID a special user with crond + access. This allows your users to use ezmlm-cron to generate digest + trigger messages, without being able to directly use crond. To enable + this feature create a special user, e.g. "ezmlm". Then: + + # chown ezmlm /usr/local/bin/ezmlm-cron + # chmod 4555 /usr/local/bin/ezmlm-cron + + and create ~ezmlm/ezcronrc as described in the ezmlm-cron(1) man + page. You may need to modify the path in the commands above if + you have installed ezmlm in a non-default location. ezmlm-cron refuses + to run SUID root. + + This user can read its crontab file which may contain digest codes from + other users. Thus, this should be a reserved user name, not one of an + ordinary user. + + + 16. If you would like to make your archived lists available via the World + Wide Web, you must install the ezmlm-cgi program which comes with + ezmlm-idx versions starting with ezmlm-idx-0.40. When ezmlm-idx is compiled + with the 'make' command, ezmlm-cgi is compiled also, however, it is not + installed. Installation of the program allows one to view the archives by + date, thread and author. See, ezmlm-cgi.1 for more details. + + 17. ezmlm-cgi must be installed where all other common gateway interface + ("CGI") programs are installed on your system. For most Un*x based system, + this will be in a directory titled 'cgi-bin' which is also, generally + speaking, in the root directory for your web server. For example, for apache + installations where /usr/local/apache is the root directory for the web + server, the directory /usr/local/apache/cgi-bin is where globally availably + CGI programs are located. You must copy the ezmlm-cgi program to this + location: + + % cp /ezmlm-0.53/ezmlm-cgi /usr/local/apache/cgi-bin + + 18. ezmlm-cgi should be installed SUID root. Examine the source code to make + yourself comfortable that the program is safe. After copying the program to + the 'cgi-bin' directory, change the ownerships and permissions as follows: + + % chown root.root ezmlm-cgi + % chmod 4755 ezmlm-cgi + + If you are using ezmlm-cgi for a single user, you can install it SUID that + user and place the config file (see below) as .ezcgirc in the same directory + as the program. If the list archive is readable to the httpd user, you do + not have to install it SUID at all (see man page for details). + + 19. ezmlm-cgi uses a configuration files called 'ezcgirc' which must reside + in the /etc/ezmlm directory. First create the directory: + + % mkdir /etc/ezmlm + + Then use your favorite text editor to create the ezcgirc file. + + The file parameters are set forth on the first line. Comments are + allowed if preceded by the '#' in position 1. Lists are input by number + which is an arbitrary identifier with the exception of list '0' which is the + default list shown on the web page. As an example, the following utilizes a + list 'test@example.com' which is owned by the 'alias' user with a UID of + 7827. The list resides in the directory '/var/qmail/alias/test' and its home + page is at 'http://www.example.com/test'. With the foregoing setup, the + ezcgirc file's contents are as follows: + + # Format for ezcgirc file + #listno;uid;listdir;listaddr;buttonbar;charset;style;bannerprog + 0;7827;/var/qmail/alias/test;test@example.com;[Home]=http://www.example.com/test + + Note there are no entries for 'charset', 'style' and 'bannerprog' Where + no entries are made, the default variables are assumed. The above + configuration assumes that the character set 'iso-8859-1' and that no + style sheet is used. Since formatting is largely controlled by the + style sheet, the output doesn't look exciting on a GUI browser. Start with + ezcgi.css in the distribution, and modify to taste. See www.ezmlm.org + for URLs to archives using different style sheets/banners. + + 20. Finally, before accessing the list via the web, you must archive any + existing list and add an entry to listdir/editor to archive future posts. + You must also run ezmlm-idx (first see man pages for both programs): + + % ezmlm-idx DIR + % ezmlm-archive -c DIR + + 21. For any existing lists which you would like to archive, + add the following line after the call to ezmlm-send in listdir/editor: + + | /usr/local/ezmlm/ezmlm-archive listdir/DIR || exit 0 + + This is automatically done when running: + + % ezmlm-make -+i DIR + + 22. To display your web based archive, open your browser as follows: + + %lynx http://localhost/cgi-bin/ezmlm-cgi + + ------------- End Optional items ----------- + + 23. That's it! To report success (helps to track platform-specific problems): + + % ( echo 'First M. Last'; cat `cat SYSDEPS` ) \ + | mail cfl-src@id.wustl.edu + + Replace First M. Last with your name. + + Send bugs reports, ideally with patch, to 'lindberg@id.wustl.edu'. + diff -crN ../ezmlm-0.53/LICENCE.TXT ./LICENCE.TXT *** ../ezmlm-0.53/LICENCE.TXT Wed Dec 31 18:00:00 1969 --- ./LICENCE.TXT Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,339 ---- + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 + the 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 -crN ../ezmlm-0.53/MAN ./MAN *** ../ezmlm-0.53/MAN Sun Jun 29 22:11:54 1997 --- ./MAN Fri Dec 21 12:17:35 2001 *************** *** 1,27 **** --- 1,67 ---- d:::755::: d:::755:/man1:: d:::755:/man5:: + c:::644:/man1/:ezmlm-accept.1: + c:::644:/man1/:ezmlm-archive.1: + c:::644:/man1/:ezmlm-issubn.1: c:::644:/man5/:ezmlm.5: + c:::644:/man5/:ezmlmrc.5: + c:::644:/man5/:ezmlmglrc.5: + c:::644:/man5/:ezmlmsubrc.5: c:::644:/man1/:ezmlm-list.1: + c:::644:/man1/:ezmlm-glconf.1: c:::644:/man1/:ezmlm-make.1: + c:::644:/man1/:ezmlm-mktab.1: c:::644:/man1/:ezmlm-manage.1: + c:::644:/man1/:ezmlm-moderate.1: c:::644:/man1/:ezmlm-reject.1: + c:::644:/man1/:ezmlm-request.1: c:::644:/man1/:ezmlm-return.1: c:::644:/man1/:ezmlm-send.1: + c:::644:/man1/:ezmlm-split.1: + c:::644:/man1/:ezmlm-store.1: c:::644:/man1/:ezmlm-sub.1: c:::644:/man1/:ezmlm-unsub.1: c:::644:/man1/:ezmlm-warn.1: c:::644:/man1/:ezmlm-weed.1: + c:::644:/man1/:ezmlm-idx.1: + c:::644:/man1/:ezmlm-gate.1: + c:::644:/man1/:ezmlm-tstdig.1: + c:::644:/man1/:ezmlm-get.1: + c:::644:/man1/:ezmlm-check.1: + c:::644:/man1/:ezmlm-clean.1: + c:::644:/man1/:ezmlm-limit.1: + c:::644:/man1/:ezmlm-cron.1: d:::755:/cat1:: d:::755:/cat5:: c:::644:/cat5/:ezmlm.0: + c:::644:/cat5/:ezmlmrc.0: + c:::644:/cat5/:ezmlmglrc.0: + c:::644:/cat5/:ezmlmsubrc.0: c:::644:/cat1/:ezmlm-list.0: + c:::644:/cat1/:ezmlm-glconf.0: c:::644:/cat1/:ezmlm-make.0: + c:::644:/cat1/:ezmlm-mktab.0: c:::644:/cat1/:ezmlm-manage.0: + c:::644:/cat1/:ezmlm-moderate.0: + c:::644:/cat1/:ezmlm-request.0: c:::644:/cat1/:ezmlm-reject.0: c:::644:/cat1/:ezmlm-return.0: c:::644:/cat1/:ezmlm-send.0: + c:::644:/cat1/:ezmlm-store.0: + c:::644:/cat1/:ezmlm-split.0: c:::644:/cat1/:ezmlm-sub.0: c:::644:/cat1/:ezmlm-unsub.0: c:::644:/cat1/:ezmlm-warn.0: c:::644:/cat1/:ezmlm-weed.0: + c:::644:/cat1/:ezmlm-idx.0: + c:::644:/cat1/:ezmlm-gate.0: + c:::644:/cat1/:ezmlm-tstdig.0: + c:::644:/cat1/:ezmlm-get.0: + c:::644:/cat1/:ezmlm-check.0: + c:::644:/cat1/:ezmlm-clean.0: + c:::644:/cat1/:ezmlm-limit.0: + c:::644:/cat1/:ezmlm-cron.0: + c:::644:/cat1/:ezmlm-accept.0: + c:::644:/cat1/:ezmlm-archive.0: + c:::644:/cat1/:ezmlm-issubn.0: diff -crN ../ezmlm-0.53/Makefile ./Makefile *** ../ezmlm-0.53/Makefile Sun Jun 29 22:11:54 1997 --- ./Makefile Fri Dec 21 12:17:35 2001 *************** *** 1,7 **** SHELL=/bin/sh ! default: it alloc.0: \ alloc.3 nroff -man alloc.3 > alloc.0 --- 1,14 ---- + #$Id: Makefile,v 1.117 1999/12/23 02:42:12 lindberg Exp $ + #$Name: ezmlm-idx-040 $ SHELL=/bin/sh ! SQLCC=`head -1 conf-sqlcc` ! SQLLD=`head -1 conf-sqlld` default: it + clean: \ + TARGETS + rm -f `cat TARGETS` + alloc.0: \ alloc.3 nroff -man alloc.3 > alloc.0 *************** *** 18,23 **** --- 25,34 ---- compile alloc_re.c alloc.h alloc_re.c byte.h alloc_re.c ./compile alloc_re.c + author.o: \ + compile author.c mime.h + ./compile author.c + auto-ccld.sh: \ conf-cc conf-ld warn-auto.sh ( cat warn-auto.sh; \ *************** *** 34,39 **** --- 45,58 ---- exit.h auto-str.c ./compile auto-str.c + auto_cron.c: \ + auto-str conf-cron + ./auto-str auto_cron `head -1 conf-cron` > auto_cron.c + + auto_cron.o: \ + compile auto_cron.c + ./compile auto_cron.c + auto_bin.c: \ auto-str conf-bin ./auto-str auto_bin `head -1 conf-bin` > auto_bin.c *************** *** 79,91 **** nroff -man case.3 > case.0 case.a: \ ! makelib case_diffb.o case_lowerb.o case_startb.o ! ./makelib case.a case_diffb.o case_lowerb.o case_startb.o case_diffb.o: \ compile case_diffb.c case.h case_diffb.c ./compile case_diffb.c case_lowerb.o: \ compile case_lowerb.c case.h case_lowerb.c ./compile case_lowerb.c --- 98,115 ---- nroff -man case.3 > case.0 case.a: \ ! makelib case_diffb.o case_diffs.o case_starts.o case_lowerb.o case_startb.o ! ./makelib case.a case_diffb.o case_lowerb.o case_startb.o \ ! case_diffs.o case_starts.o case_diffb.o: \ compile case_diffb.c case.h case_diffb.c ./compile case_diffb.c + case_diffs.o: \ + compile case_diffs.c case.h + ./compile case_diffs.c + case_lowerb.o: \ compile case_lowerb.c case.h case_lowerb.c ./compile case_lowerb.c *************** *** 94,99 **** --- 118,132 ---- compile case_startb.c case.h case_startb.c ./compile case_startb.c + checktag.o: \ + compile checktag.c stralloc.h scan.h fmt.h strerr.h cookie.h \ + errtxt.h subscribe.h conf-sqlcc + ./compile checktag.c ${SQLCC} + + case_starts.o: \ + compile case_starts.c case.h + ./compile case_starts.c + compile: \ make-compile warn-auto.sh systype ( cat warn-auto.sh; ./make-compile "`cat systype`" ) > \ *************** *** 110,115 **** --- 143,161 ---- surfpcs.h uint32.h surfpcs.h cookie.c ./compile cookie.c + copy.o: \ + compile copy.c copy.h stralloc.h substdio.h str.h readwrite.h open.h qmail.h \ + strerr.h getln.h case.h errtxt.h mime.h error.h quote.h + ./compile copy.c + + date2yyyymm.o:\ + compile date2yyyymm.c yyyymm.h + ./compile date2yyyymm.c + + dateline.o:\ + compile dateline.c yyyymm.h stralloc.h fmt.h + ./compile dateline.c + date822fmt.o: \ compile date822fmt.c datetime.h date822fmt.c fmt.h date822fmt.c \ date822fmt.h date822fmt.c *************** *** 133,145 **** && cat direntry.h2 || cat direntry.h1 ) > direntry.h rm -f trydrent.o env.0: \ env.3 nroff -man env.3 > env.0 env.a: \ ! makelib envread.o ! ./makelib env.a envread.o envread.o: \ compile envread.c env.h envread.c str.h envread.c --- 179,224 ---- && cat direntry.h2 || cat direntry.h1 ) > direntry.h rm -f trydrent.o + concatHDR.o: \ + compile concatHDR.c mime.h stralloc.h strerr.h byte.h errtxt.h + ./compile concatHDR.c + + decodeB.o: \ + compile decodeB.c mime.h uint32.h stralloc.h strerr.h errtxt.h + ./compile decodeB.c + + decodeHDR.o: \ + compile decodeHDR.c mime.h stralloc.h strerr.h error.h case.h byte.h \ + uint32.h errtxt.h + ./compile decodeHDR.c + + decodeQ.o: \ + compile decodeQ.c mime.h stralloc.h strerr.h errtxt.h + ./compile decodeQ.c + + encodeB.o: \ + compile encodeB.c mime.h uint32.h stralloc.h strerr.h errtxt.h + ./compile encodeB.c + + encodeQ.o: \ + compile encodeQ.c mime.h stralloc.h strerr.h errtxt.h + ./compile encodeQ.c + + unfoldHDR.o: \ + compile unfoldHDR.c mime.h stralloc.h strerr.h errtxt.h + ./compile unfoldHDR.c + env.0: \ env.3 nroff -man env.3 > env.0 env.a: \ ! makelib env.o envread.o ! ./makelib env.a env.o envread.o ! ! env.o: \ ! compile env.c env.h str.h ! ./compile env.c envread.o: \ compile envread.c env.h envread.c str.h envread.c *************** *** 169,196 **** error_temp.3 nroff -man error_temp.3 > error_temp.0 ezmlm-list: \ ! load ezmlm-list.o strerr.a getln.a substdio.a stralloc.a alloc.a \ ! error.a open.a str.a ! ./load ezmlm-list strerr.a getln.a substdio.a stralloc.a \ ! alloc.a error.a open.a str.a ezmlm-list.0: \ ezmlm-list.1 nroff -man ezmlm-list.1 > ezmlm-list.0 ezmlm-list.o: \ ! compile ezmlm-list.c stralloc.h gen_alloc.h stralloc.h ezmlm-list.c \ ! substdio.h ezmlm-list.c getln.h ezmlm-list.c strerr.h ezmlm-list.c \ ! error.h ezmlm-list.c readwrite.h ezmlm-list.c exit.h ezmlm-list.c \ ! open.h ezmlm-list.c ./compile ezmlm-list.c ezmlm-make: \ ! load ezmlm-make.o auto_bin.o open.a getopt.a substdio.a strerr.a \ ! stralloc.a alloc.a error.a str.a ! ./load ezmlm-make auto_bin.o open.a getopt.a substdio.a \ ! strerr.a stralloc.a alloc.a error.a str.a ezmlm-make.0: \ ezmlm-make.1 --- 248,528 ---- error_temp.3 nroff -man error_temp.3 > error_temp.0 + ezmlm-accept: \ + ezmlm-accept.sh warn-auto.sh conf-bin + (cat warn-auto.sh; \ + echo EZPATH=\'`head -1 conf-bin`\'; \ + cat ezmlm-accept.sh ) > ezmlm-accept + + ezmlm-accept.0: \ + ezmlm-accept.1 + nroff -man ezmlm-accept.1 > ezmlm-accept.0 + + ezmlm-archive: \ + load ezmlm-archive.o getconf.o slurpclose.o slurp.o getln.a sig.a \ + strerr.a substdio.a stralloc.a alloc.a error.a str.a fs.a open.a \ + lock.a fd.a getopt.a idxthread.o yyyymm.a + ./load ezmlm-archive getconf.o slurpclose.o slurp.o getln.a sig.a \ + idxthread.o yyyymm.a strerr.a substdio.a stralloc.a alloc.a \ + error.a str.a fs.a open.a lock.a fd.a getopt.a + + ezmlm-archive.0: \ + ezmlm-archive.1 + nroff -man ezmlm-archive.1 > ezmlm-archive.0 + + ezmlm-archive.o: \ + compile ezmlm-archive.c alloc.h error.h stralloc.h gen_alloc.h str.h \ + sig.h slurp.h getconf.h strerr.h getln.h substdio.h readwrite.h \ + makehash.h fmt.h strerr.h errtxt.h idx.h idxthread.h sgetopt.h subgetopt.h + ./compile ezmlm-archive.c + + ezmlm-cgi: \ + load ezmlm-cgi.o getconf.o slurpclose.o slurp.o constmap.o getln.a sig.a \ + mime.a strerr.a substdio.a stralloc.a alloc.a error.a str.a fs.a open.a \ + lock.a fd.a getopt.a env.a case.a datetime.o now.o mime.a wait.a yyyymm.a + ./load ezmlm-cgi getconf.o slurpclose.o slurp.o constmap.o getln.a \ + mime.a sig.a env.a case.a datetime.o now.o mime.a wait.a yyyymm.a \ + strerr.a substdio.a stralloc.a alloc.a error.a str.a fs.a open.a \ + lock.a fd.a getopt.a + + ezmlm-cgi.0: \ + ezmlm-cgi.1 + nroff -man ezmlm-cgi.1 > ezmlm-cgi.0 + + ezmlm-cgi.o: \ + compile ezmlm-cgi.c alloc.h error.h stralloc.h gen_alloc.h str.h \ + sig.h slurp.h getconf.h strerr.h getln.h substdio.h readwrite.h env.h \ + makehash.h fmt.h strerr.h errtxt.h idx.h idxthread.h mime.h \ + constmap.h sgetopt.h subgetopt.h datetime.h now.h fork.h wait.h + ./compile ezmlm-cgi.c + + ezmlm-check: \ + ezmlm-check.sh warn-auto.sh conf-bin + (cat warn-auto.sh; \ + echo EZPATH=\'`head -1 conf-bin`\'; \ + echo QMPATH=\'`head -1 conf-qmail`\'; \ + cat ezmlm-check.sh ) > ezmlm-check + + ezmlm-check.0: \ + ezmlm-check.1 + nroff -man ezmlm-check.1 > ezmlm-check.0 + + ezmlm-clean: \ + load ezmlm-clean.o auto_qmail.o getconf.o copy.o mime.a \ + now.o datetime.o date822fmt.o slurpclose.o slurp.o qmail.o quote.o \ + getln.a env.a sig.a strerr.a substdio.a stralloc.a alloc.a surf.a \ + error.a str.a fs.a case.a open.a seek.a wait.a lock.a fd.a cookie.o getopt.a + ./load ezmlm-clean auto_qmail.o getconf.o copy.o mime.a \ + now.o datetime.o date822fmt.o slurpclose.o \ + slurp.o qmail.o quote.o getln.a env.a sig.a strerr.a \ + substdio.a stralloc.a alloc.a error.a str.a fs.a case.a \ + open.a seek.a wait.a lock.a fd.a cookie.o getopt.a surf.a + + ezmlm-clean.0: \ + ezmlm-clean.1 + nroff -man ezmlm-clean.1 > ezmlm-clean.0 + + ezmlm-clean.o: \ + compile ezmlm-clean.c error.h stralloc.h gen_alloc.h str.h \ + env.h sig.h slurp.h getconf.h strerr.h byte.h getln.h case.h copy.h mime.h \ + qmail.h substdio.h readwrite.h seek.h quote.h datetime.h now.h cookie.h \ + date822fmt.h direntry.h fmt.h strerr.h errtxt.h idx.h sgetopt.h subgetopt.h + ./compile ezmlm-clean.c + + ezmlm-cron: \ + load ezmlm-cron.o strerr.a stralloc.a alloc.a error.a open.a auto_qmail.o \ + getopt.a getln.a str.a substdio.a sig.a fs.a open.a fd.a lock.a wait.a \ + case.a auto_cron.o + ./load ezmlm-cron getopt.a getln.a strerr.a substdio.a \ + stralloc.a alloc.a sig.a fs.a open.a fd.a lock.a error.a \ + wait.a case.a str.a auto_qmail.o auto_cron.o + + ezmlm-cron.0: \ + ezmlm-cron.1 + nroff -man ezmlm-cron.1 > ezmlm-cron.0 + + ezmlm-cron.o: \ + compile ezmlm-cron.c strerr.h substdio.h stralloc.h error.h str.h \ + fork.h readwrite.h wait.h errtxt.h idx.h sgetopt.h auto_qmail.h \ + fmt.h auto_cron.h + ./compile ezmlm-cron.c + + ezmlm-gate: \ + load ezmlm-gate.o subdb.a auto_bin.o getopt.a getln.a env.a sig.a strerr.a \ + stralloc.a alloc.a error.a str.a case.a wait.a substdio.a open.a lock.a \ + fs.a getconf.o slurpclose.o slurp.o seek.a conf-sqlld + ./load ezmlm-gate subdb.a getconf.o slurpclose.o slurp.o \ + getopt.a getln.a auto_bin.o env.a sig.a fs.a \ + strerr.a substdio.a stralloc.a alloc.a error.a str.a case.a wait.a \ + open.a lock.a seek.a ${SQLLD} + + ezmlm-gate.0: \ + ezmlm-gate.1 + nroff -man ezmlm-gate.1 > ezmlm-gate.0 + + ezmlm-gate.o: \ + compile ezmlm-gate.c idx.h errtxt.h subscribe.h auto_bin.h \ + sgetopt.h subgetopt.h substdio.h getconf.h \ + env.h sig.h strerr.h stralloc.h alloc.h error.h str.h case.h \ + fork.h wait.h exit.h getln.h open.h + ./compile ezmlm-gate.c + + ezmlm-get: \ + load ezmlm-get.o idxthread.o subdb.a auto_qmail.o getopt.a now.o getconf.o \ + datetime.o date822fmt.o slurpclose.o slurp.o qmail.o quote.o makehash.o \ + cookie.o surf.a yyyymm.a \ + constmap.o getln.a env.a sig.a strerr.a substdio.a mime.a stralloc.a alloc.a \ + error.a str.a fs.a case.a open.a seek.a wait.a lock.a fd.a copy.o conf-sqlld + ./load ezmlm-get idxthread.o subdb.a auto_qmail.o getopt.a getconf.o \ + now.o datetime.o date822fmt.o cookie.o makehash.o slurpclose.o slurp.o \ + yyyymm.a \ + constmap.o substdio.a copy.o mime.a strerr.a stralloc.a alloc.a \ + qmail.o quote.o surf.a getln.a env.a sig.a \ + error.a str.a fs.a case.a \ + open.a seek.a wait.a lock.a fd.a ${SQLLD} + + ezmlm-get.o: \ + compile ezmlm-get.c idx.h errtxt.h error.h getconf.h stralloc.h gen_alloc.h \ + str.h cookie.h env.h sig.h slurp.h strerr.h byte.h getln.h case.h qmail.h \ + substdio.h readwrite.h seek.h quote.h sgetopt.h subgetopt.h datetime.h now.h \ + date822fmt.h fmt.h strerr.h copy.h errtxt.h idx.h idxthread.h mime.h \ + constmap.h makehash.h + ./compile ezmlm-get.c + + ezmlm-get.0: \ + ezmlm-get.1 + nroff -man ezmlm-get.1 > ezmlm-get.0 + + ezmlm-greturn: \ + load ezmlm-greturn.o quote.o getconf.o subdb.a log.o \ + slurpclose.o slurp.o now.o cookie.o surf.a lock.a env.a sig.a \ + strerr.a getln.a substdio.a stralloc.a alloc.a error.a str.a fs.a \ + case.a open.a conf-sqlld + ./load ezmlm-greturn quote.o getconf.o subdb.a \ + log.o slurpclose.o slurp.o now.o cookie.o surf.a lock.a \ + env.a sig.a strerr.a getln.a substdio.a stralloc.a alloc.a \ + error.a str.a fs.a case.a open.a ${SQLLD} + + ezmlm-greturn.0: \ + ezmlm-greturn.1 + nroff -man ezmlm-greturn.1 > ezmlm-greturn.0 + + ezmlm-greturn.o: \ + compile ezmlm-greturn.c stralloc.h gen_alloc.h stralloc.h str.h env.h sig.h \ + slurp.h getconf.h strerr.h byte.h case.h getln.h substdio.h error.h \ + quote.h readwrite.h fmt.h datetime.h now.h cookie.h \ + strerr.h subscribe.h + ./compile ezmlm-greturn.c + + ezmlm-gwarn: \ + load ezmlm-gwarn.o auto_qmail.o getconf.o mime.a cookie.o subdb.a now.o \ + slurpclose.o slurp.o quote.o datetime.o date822fmt.o qmail.o surf.a \ + case.a strerr.a sig.a getln.a substdio.a stralloc.a alloc.a error.a \ + open.a lock.a str.a fs.a fd.a wait.a copy.o getopt.a conf-sqlld + ./load ezmlm-gwarn auto_qmail.o getconf.o mime.a \ + cookie.o subdb.a getopt.a \ + now.o slurpclose.o slurp.o quote.o datetime.o date822fmt.o \ + qmail.o surf.a case.a strerr.a sig.a getln.a substdio.a \ + stralloc.a alloc.a error.a open.a lock.a str.a fs.a fd.a \ + wait.a copy.o ${SQLLD} + + ezmlm-gwarn.0: \ + ezmlm-gwarn.1 + nroff -man ezmlm-gwarn.1 > ezmlm-gwarn.0 + + ezmlm-gwarn.o: \ + compile ezmlm-gwarn.c direntry.h readwrite.h getln.h \ + substdio.h stralloc.h gen_alloc.h slurp.h getconf.h byte.h error.h str.h \ + sig.h now.h datetime.h date822fmt.h fmt.h cookie.h qmail.h substdio.h \ + qmail.h copy.h mime.h idx.h errtxt.h sgetopt.h subgetopt.h + ./compile ezmlm-gwarn.c + + ezmlm-idx: \ + load ezmlm-idx.o slurp.o slurpclose.o mime.a wait.a getopt.a \ + getln.a strerr.a sig.h sig.a open.a lock.a substdio.a stralloc.a \ + alloc.a error.a str.a fd.a case.a fs.a getconf.o makehash.o surf.o mime.a + ./load ezmlm-idx \ + mime.a slurp.o slurpclose.o wait.a getln.a strerr.a sig.a open.a \ + lock.a mime.a substdio.a stralloc.a alloc.a error.a str.a fd.a \ + getopt.a case.a fs.a getconf.o makehash.o surf.o + + ezmlm-idx.o: \ + compile ezmlm-idx.c stralloc.h getconf.h \ + substdio.h subfd.h strerr.h error.h sgetopt.h \ + lock.h sig.h slurp.h open.h getln.h case.h \ + str.h fmt.h readwrite.h exit.h idx.h mime.h errtxt.h uint32.h + ./compile ezmlm-idx.c + + ezmlm-idx.0: \ + ezmlm-idx.1 + nroff -man ezmlm-idx.1 > ezmlm-idx.0 + + ezmlm-glconf: \ + ezmlm-glconf.sh warn-auto.sh conf-bin + (cat warn-auto.sh; \ + echo EZPATH=\'`head -1 conf-bin`\'; \ + cat ezmlm-glconf.sh ) > ezmlm-glconf + + ezmlm-glconf.0: \ + ezmlm-glconf.1 + nroff -man ezmlm-glconf.1 > ezmlm-glconf.0 + + ezmlm-issubn: \ + load ezmlm-issubn.o subdb.a getconf.o slurpclose.o slurp.o \ + env.a fs.a strerr.a getln.a getopt.a conf-sqlld \ + substdio.a stralloc.a alloc.a error.a str.a case.a open.a lock.a + ./load ezmlm-issubn subdb.a getconf.o slurpclose.o slurp.o \ + getopt.a env.a fs.a strerr.a \ + getln.a substdio.a stralloc.a alloc.a error.a str.a case.a \ + open.a lock.a ${SQLLD} + + ezmlm-issubn.0: \ + ezmlm-issubn.1 + nroff -man ezmlm-issubn.1 > ezmlm-issubn.0 + + ezmlm-issubn.o: \ + compile ezmlm-issubn.c strerr.h subscribe.h env.h errtxt.h sgetopt.h idx.h + ./compile ezmlm-issubn.c + + ezmlm-limit: \ + load ezmlm-limit.o getconf.o slurpclose.o slurp.o substdio.a stralloc.a \ + alloc.a error.a str.a case.a open.a lock.a getopt.a fs.a sig.a now.o + ./load ezmlm-limit getconf.o slurpclose.o slurp.o getopt.a \ + strerr.a substdio.a stralloc.a alloc.a error.a str.a case.a \ + open.a lock.a fs.a sig.a now.o + + ezmlm-limit.0: \ + ezmlm-limit.1 + nroff -man ezmlm-limit.1 > ezmlm-limit.0 + + ezmlm-limit.o: \ + compile ezmlm-limit.c stralloc.h strerr.h substdio.h readwrite.h sig.h lock.h \ + getconf.h fmt.h now.h sgetopt.h error.h errtxt.h idx.h datetime.h + ./compile ezmlm-limit.c + ezmlm-list: \ ! load ezmlm-list.o subdb.a fs.a getconf.o slurpclose.o slurp.o \ ! strerr.a getln.a substdio.a stralloc.a alloc.a \ ! error.a open.a str.a case.a getopt.a conf-sqlld ! ./load ezmlm-list subdb.a fs.a getconf.o slurpclose.o slurp.o \ ! strerr.a getln.a getopt.a substdio.a stralloc.a \ ! alloc.a error.a open.a str.a case.a ${SQLLD} ezmlm-list.0: \ ezmlm-list.1 nroff -man ezmlm-list.1 > ezmlm-list.0 ezmlm-list.o: \ ! compile ezmlm-list.c stralloc.h gen_alloc.h substdio.h getln.h strerr.h \ ! error.h readwrite.h exit.h open.h errtxt.h subscribe.h exit.h sgetopt.h \ ! idx.h fmt.h ./compile ezmlm-list.c ezmlm-make: \ ! load ezmlm-make.o auto_bin.o open.a getln.a getopt.a substdio.a strerr.a \ ! stralloc.a alloc.a error.a lock.a str.a ! ./load ezmlm-make auto_bin.o open.a getln.a getopt.a substdio.a \ ! strerr.a stralloc.a alloc.a error.a lock.a str.a ezmlm-make.0: \ ezmlm-make.1 *************** *** 202,220 **** strerr.h ezmlm-make.c exit.h ezmlm-make.c readwrite.h ezmlm-make.c \ open.h ezmlm-make.c substdio.h ezmlm-make.c str.h ezmlm-make.c \ auto_bin.h ezmlm-make.c ezmlm-make.c ezmlm-make.c ezmlm-make.c \ ! ezmlm-make.c ./compile ezmlm-make.c ezmlm-manage: \ ! load ezmlm-manage.o auto_qmail.o getconf.o subscribe.o log.o cookie.o \ now.o datetime.o date822fmt.o slurpclose.o slurp.o qmail.o quote.o \ surf.a getln.a env.a sig.a strerr.a substdio.a stralloc.a alloc.a \ ! error.a str.a fs.a case.a open.a seek.a wait.a lock.a fd.a ! ./load ezmlm-manage auto_qmail.o getconf.o subscribe.o \ ! log.o cookie.o now.o datetime.o date822fmt.o slurpclose.o \ slurp.o qmail.o quote.o surf.a getln.a env.a sig.a strerr.a \ substdio.a stralloc.a alloc.a error.a str.a fs.a case.a \ ! open.a seek.a wait.a lock.a fd.a ezmlm-manage.0: \ ezmlm-manage.1 --- 534,553 ---- strerr.h ezmlm-make.c exit.h ezmlm-make.c readwrite.h ezmlm-make.c \ open.h ezmlm-make.c substdio.h ezmlm-make.c str.h ezmlm-make.c \ auto_bin.h ezmlm-make.c ezmlm-make.c ezmlm-make.c ezmlm-make.c \ ! errtxt.h idx.h getln.h lock.h ./compile ezmlm-make.c ezmlm-manage: \ ! load ezmlm-manage.o auto_qmail.o getconf.o subdb.a log.o cookie.o \ now.o datetime.o date822fmt.o slurpclose.o slurp.o qmail.o quote.o \ surf.a getln.a env.a sig.a strerr.a substdio.a stralloc.a alloc.a \ ! error.a str.a fs.a case.a open.a seek.a wait.a lock.a fd.a getopt.a \ ! mime.a copy.o conf-sqlld ! ./load ezmlm-manage subdb.a auto_qmail.o getconf.o copy.o \ ! mime.a log.o cookie.o now.o datetime.o date822fmt.o slurpclose.o \ slurp.o qmail.o quote.o surf.a getln.a env.a sig.a strerr.a \ substdio.a stralloc.a alloc.a error.a str.a fs.a case.a \ ! open.a seek.a wait.a lock.a fd.a getopt.a ${SQLLD} ezmlm-manage.0: \ ezmlm-manage.1 *************** *** 231,265 **** quote.h ezmlm-manage.c datetime.h ezmlm-manage.c now.h datetime.h \ datetime.h now.h ezmlm-manage.c date822fmt.h ezmlm-manage.c fmt.h \ ezmlm-manage.c subscribe.h strerr.h strerr.h subscribe.h \ ! ezmlm-manage.c cookie.h ezmlm-manage.c ./compile ezmlm-manage.c ezmlm-reject: \ ! load ezmlm-reject.o getln.a strerr.a substdio.a error.a stralloc.a \ ! alloc.a str.a getopt.a case.a ! ./load ezmlm-reject getln.a strerr.a substdio.a error.a \ ! stralloc.a alloc.a str.a getopt.a case.a ezmlm-reject.0: \ ezmlm-reject.1 nroff -man ezmlm-reject.1 > ezmlm-reject.0 ezmlm-reject.o: \ ! compile ezmlm-reject.c strerr.h ezmlm-reject.c substdio.h \ ! ezmlm-reject.c readwrite.h ezmlm-reject.c stralloc.h gen_alloc.h \ ! stralloc.h ezmlm-reject.c getln.h ezmlm-reject.c sgetopt.h \ ! subgetopt.h sgetopt.h ezmlm-reject.c ./compile ezmlm-reject.c ezmlm-return: \ ! load ezmlm-return.o quote.o getconf.o issub.o subscribe.o log.o \ slurpclose.o slurp.o now.o cookie.o surf.a lock.a env.a sig.a \ strerr.a getln.a substdio.a stralloc.a alloc.a error.a str.a fs.a \ ! case.a open.a ! ./load ezmlm-return quote.o getconf.o issub.o subscribe.o \ log.o slurpclose.o slurp.o now.o cookie.o surf.a lock.a \ env.a sig.a strerr.a getln.a substdio.a stralloc.a alloc.a \ ! error.a str.a fs.a case.a open.a ezmlm-return.0: \ ezmlm-return.1 --- 564,647 ---- quote.h ezmlm-manage.c datetime.h ezmlm-manage.c now.h datetime.h \ datetime.h now.h ezmlm-manage.c date822fmt.h ezmlm-manage.c fmt.h \ ezmlm-manage.c subscribe.h strerr.h strerr.h subscribe.h \ ! sgetopt.h subgetopt.h cookie.h idx.h errtxt.h copy.h ./compile ezmlm-manage.c + ezmlm-mktab.0: \ + ezmlm-mktab.1 + nroff -man ezmlm-mktab.1 > ezmlm-mktab.0 + + ezmlm-moderate: \ + load ezmlm-moderate.o auto_qmail.o getconf.o auto_bin.o copy.o mime.a \ + cookie.o now.o datetime.o date822fmt.o slurpclose.o slurp.o qmail.o quote.o \ + surf.a getln.a env.a sig.a strerr.a substdio.a stralloc.a alloc.a \ + error.a str.a fs.a case.a open.a seek.a wait.a lock.a fd.a getopt.a + ./load ezmlm-moderate auto_qmail.o getconf.o copy.o mime.a \ + cookie.o now.o datetime.o date822fmt.o slurpclose.o \ + slurp.o qmail.o quote.o surf.a getln.a env.a sig.a strerr.a \ + substdio.a stralloc.a alloc.a error.a str.a fs.a case.a \ + auto_bin.o open.a seek.a wait.a lock.a fd.a getopt.a + + ezmlm-moderate.0: \ + ezmlm-moderate.1 + nroff -man ezmlm-moderate.1 > ezmlm-moderate.0 + + ezmlm-moderate.o: \ + compile ezmlm-moderate.c error.h stralloc.h gen_alloc.h str.h \ + env.h sig.h slurp.h getconf.h strerr.h byte.h getln.h case.h \ + qmail.h substdio.h readwrite.h seek.h quote.h datetime.h now.h \ + date822fmt.h fmt.h strerr.h cookie.h errtxt.h idx.h copy.h mime.h \ + subgetopt.h sgetopt.h auto_bin.h fork.h wait.h + ./compile ezmlm-moderate.c + + ezmlm-request: \ + load ezmlm-request.o subdb.a getconf.o constmap.o getln.a auto_qmail.o qmail.o \ + strerr.a slurpclose.o slurp.o getopt.a env.a open.a fd.a sig.a case.a \ + substdio.a error.a stralloc.a alloc.a str.a case.a fs.a wait.a seek.a \ + date822fmt.o now.o datetime.o quote.o copy.o mime.a conf-sqlld + ./load ezmlm-request subdb.a getconf.o constmap.o getln.a auto_qmail.o \ + qmail.o date822fmt.o datetime.o now.o quote.o \ + slurpclose.o slurp.o env.a open.a sig.a wait.a getopt.a \ + strerr.a substdio.a error.a copy.o stralloc.a alloc.a substdio.a \ + str.a case.a fs.a fd.a sig.a wait.a seek.a mime.a ${SQLLD} + + ezmlm-request.0: + nroff -man ezmlm-request.1 > ezmlm-request.0 + + ezmlm-request.o: \ + compile ezmlm-request.c stralloc.h subfd.h strerr.h error.h qmail.h env.h \ + sig.h open.h getln.h case.h str.h readwrite.h exit.h substdio.h quote.h \ + getconf.h constmap.h fmt.h byte.h errtxt.h idx.h datetime.h date822fmt.h \ + subscribe.h now.h copy.h + ./compile ezmlm-request.c + ezmlm-reject: \ ! load ezmlm-reject.o getln.a strerr.a substdio.a error.a stralloc.a open.a \ ! qmail.o env.a seek.a fd.a wait.a auto_qmail.o \ ! alloc.a getconf.o slurp.o slurpclose.o str.a getopt.a case.a constmap.o fs.a ! ./load ezmlm-reject qmail.o getln.a strerr.a substdio.a error.a fs.a \ ! env.a constmap.o getconf.o slurp.o slurpclose.o stralloc.a alloc.a \ ! seek.a str.a getopt.a case.a open.a fd.a wait.a auto_qmail.o ezmlm-reject.0: \ ezmlm-reject.1 nroff -man ezmlm-reject.1 > ezmlm-reject.0 ezmlm-reject.o: \ ! compile ezmlm-reject.c strerr.h substdio.h readwrite.h stralloc.h gen_alloc.h \ ! stralloc.h getln.h sgetopt.h subgetopt.h constmap.h getconf.h errtxt.h \ ! scan.h fmt.h idx.h qmail.h env.h seek.h ./compile ezmlm-reject.c ezmlm-return: \ ! load ezmlm-return.o quote.o getconf.o subdb.a log.o \ slurpclose.o slurp.o now.o cookie.o surf.a lock.a env.a sig.a \ strerr.a getln.a substdio.a stralloc.a alloc.a error.a str.a fs.a \ ! case.a open.a conf-sqlld ! ./load ezmlm-return quote.o getconf.o subdb.a \ log.o slurpclose.o slurp.o now.o cookie.o surf.a lock.a \ env.a sig.a strerr.a getln.a substdio.a stralloc.a alloc.a \ ! error.a str.a fs.a case.a open.a ${SQLLD} ezmlm-return.0: \ ezmlm-return.1 *************** *** 270,312 **** ezmlm-return.c str.h ezmlm-return.c env.h ezmlm-return.c sig.h \ ezmlm-return.c slurp.h ezmlm-return.c getconf.h ezmlm-return.c \ strerr.h ezmlm-return.c byte.h ezmlm-return.c case.h ezmlm-return.c \ ! getln.h ezmlm-return.c substdio.h ezmlm-return.c error.h \ ezmlm-return.c quote.h ezmlm-return.c readwrite.h ezmlm-return.c \ fmt.h ezmlm-return.c now.h datetime.h now.h ezmlm-return.c cookie.h \ ezmlm-return.c subscribe.h strerr.h strerr.h subscribe.h \ ! ezmlm-return.c issub.h strerr.h strerr.h issub.h ezmlm-return.c ./compile ezmlm-return.c ezmlm-send: \ load ezmlm-send.o auto_qmail.o getconf.o qmail.o constmap.o slurp.o \ ! slurpclose.o wait.a getln.a strerr.a sig.a env.a open.a lock.a \ ! substdio.a stralloc.a alloc.a error.a str.a fd.a case.a fs.a ! ./load ezmlm-send auto_qmail.o getconf.o qmail.o \ ! constmap.o slurp.o slurpclose.o wait.a getln.a strerr.a \ ! sig.a env.a open.a lock.a substdio.a stralloc.a alloc.a \ ! error.a str.a fd.a case.a fs.a ezmlm-send.0: \ ezmlm-send.1 nroff -man ezmlm-send.1 > ezmlm-send.0 ezmlm-send.o: \ ! compile ezmlm-send.c stralloc.h gen_alloc.h stralloc.h ezmlm-send.c \ ! subfd.h substdio.h subfd.h ezmlm-send.c strerr.h ezmlm-send.c error.h \ ! ezmlm-send.c qmail.h substdio.h substdio.h qmail.h ezmlm-send.c env.h \ ! ezmlm-send.c lock.h ezmlm-send.c sig.h ezmlm-send.c open.h \ ! ezmlm-send.c getln.h ezmlm-send.c case.h ezmlm-send.c scan.h \ ! ezmlm-send.c str.h ezmlm-send.c fmt.h ezmlm-send.c readwrite.h \ ! ezmlm-send.c exit.h ezmlm-send.c substdio.h substdio.h ezmlm-send.c \ ! getconf.h ezmlm-send.c constmap.h ezmlm-send.c ./compile ezmlm-send.c ezmlm-sub: \ ! load ezmlm-sub.o subscribe.o log.o now.o fs.a strerr.a getln.a \ substdio.a stralloc.a alloc.a error.a str.a case.a open.a lock.a ! ./load ezmlm-sub subscribe.o log.o now.o fs.a strerr.a \ getln.a substdio.a stralloc.a alloc.a error.a str.a case.a \ ! open.a lock.a ezmlm-sub.0: \ ezmlm-sub.1 --- 652,785 ---- ezmlm-return.c str.h ezmlm-return.c env.h ezmlm-return.c sig.h \ ezmlm-return.c slurp.h ezmlm-return.c getconf.h ezmlm-return.c \ strerr.h ezmlm-return.c byte.h ezmlm-return.c case.h ezmlm-return.c \ ! getln.h ezmlm-return.c substdio.h ezmlm-return.c error.h direntry.h \ ezmlm-return.c quote.h ezmlm-return.c readwrite.h ezmlm-return.c \ fmt.h ezmlm-return.c now.h datetime.h now.h ezmlm-return.c cookie.h \ ezmlm-return.c subscribe.h strerr.h strerr.h subscribe.h \ ! strerr.h strerr.h ./compile ezmlm-return.c ezmlm-send: \ load ezmlm-send.o auto_qmail.o getconf.o qmail.o constmap.o slurp.o \ ! slurpclose.o wait.a getln.a strerr.a sig.a env.a open.a lock.a conf-sqlld \ ! substdio.a cookie.o stralloc.a alloc.a error.a str.a fd.a case.a fs.a surf.a \ ! getopt.a copy.o mime.a subdb.a makehash.o surf.o makehash.o str.a quote.o ! ./load ezmlm-send subdb.a cookie.o surf.a auto_qmail.o getconf.o \ ! getopt.a qmail.o quote.o constmap.o slurp.o slurpclose.o \ ! wait.a getln.a strerr.a \ ! sig.a env.a open.a lock.a substdio.a stralloc.a alloc.a error.a \ ! fd.a case.a fs.a getopt.a copy.o mime.a makehash.o str.a ${SQLLD} ezmlm-send.0: \ ezmlm-send.1 nroff -man ezmlm-send.1 > ezmlm-send.0 ezmlm-send.o: \ ! compile ezmlm-send.c stralloc.h gen_alloc.h copy.h \ ! subfd.h substdio.h strerr.h error.h qmail.h env.h makehash.h sgetopt.h \ ! lock.h sig.h open.h getln.h case.h scan.h str.h fmt.h readwrite.h quote.h \ ! exit.h getconf.h constmap.h byte.h errtxt.h idx.h mime.h subscribe.h \ ! uint32.h ./compile ezmlm-send.c + ezmlm-master: \ + load ezmlm-master.o auto_qmail.o getconf.o qmail.o constmap.o slurp.o \ + slurpclose.o wait.a getln.a strerr.a sig.a env.a open.a lock.a conf-sqlld \ + substdio.a cookie.o stralloc.a alloc.a error.a str.a fd.a case.a fs.a surf.a\ + getopt.a copy.o mime.a subdb.a makehash.o surf.o makehash.o str.a quote.o + ./load ezmlm-master subdb.a cookie.o surf.a auto_qmail.o getconf.o \ + getopt.a qmail.o quote.o constmap.o slurp.o slurpclose.o \ + wait.a getln.a strerr.a \ + sig.a env.a open.a lock.a substdio.a stralloc.a alloc.a error.a \ + fd.a case.a fs.a getopt.a copy.o mime.a makehash.o str.a ${SQLLD} + + ezmlm-master.0: \ + ezmlm-master.1 + nroff -man ezmlm-master.1 > ezmlm-master.0 + + ezmlm-master.o: \ + compile ezmlm-master.c stralloc.h gen_alloc.h copy.h \ + subfd.h substdio.h strerr.h error.h qmail.h env.h makehash.h sgetopt.h \ + lock.h sig.h open.h getln.h case.h scan.h str.h fmt.h readwrite.h quote.h \ + exit.h getconf.h constmap.h byte.h errtxt.h idx.h mime.h subscribe.h \ + uint32.h + ./compile ezmlm-master.c + + ezmlm-slave: \ + load ezmlm-slave.o auto_qmail.o getconf.o qmail.o constmap.o slurp.o \ + slurpclose.o wait.a getln.a strerr.a sig.a env.a open.a lock.a conf-sqlld \ + substdio.a cookie.o stralloc.a alloc.a error.a str.a fd.a case.a fs.a surf.a \ + getopt.a copy.o mime.a subdb.a makehash.o surf.o makehash.o str.a quote.o + ./load ezmlm-slave subdb.a cookie.o surf.a auto_qmail.o getconf.o \ + getopt.a qmail.o quote.o constmap.o slurp.o slurpclose.o \ + wait.a getln.a strerr.a \ + sig.a env.a open.a lock.a substdio.a stralloc.a alloc.a error.a \ + fd.a case.a fs.a getopt.a copy.o mime.a makehash.o str.a ${SQLLD} + + ezmlm-slave.0: \ + ezmlm-slave.1 + nroff -man ezmlm-slave.1 > ezmlm-slave.0 + + ezmlm-slave.o: \ + compile ezmlm-slave.c stralloc.h gen_alloc.h copy.h \ + subfd.h substdio.h strerr.h error.h qmail.h env.h makehash.h sgetopt.h \ + lock.h sig.h open.h getln.h case.h scan.h str.h fmt.h readwrite.h quote.h \ + exit.h getconf.h constmap.h byte.h errtxt.h idx.h mime.h subscribe.h \ + uint32.h + ./compile ezmlm-slave.c + + ezmlm-split: \ + load ezmlm-split.o auto_qmail.o getconf.o \ + slurpclose.o slurp.o qmail.o quote.o wait.a \ + getln.a env.a sig.a strerr.a substdio.a stralloc.a alloc.a \ + error.a str.a fs.a case.a open.a fd.a + ./load ezmlm-split auto_qmail.o getconf.o slurpclose.o \ + slurp.o qmail.o quote.o getln.a env.a sig.a strerr.a \ + substdio.a stralloc.a alloc.a error.a str.a fs.a case.a \ + open.a fd.a wait.a + + ezmlm-split.0: \ + ezmlm-split.1 + nroff -man ezmlm-split.1 > ezmlm-split.0 + + ezmlm-split.o: \ + compile ezmlm-split.c error.h stralloc.h gen_alloc.h str.h \ + env.h sig.h getconf.h strerr.h byte.h getln.h case.h \ + qmail.h substdio.h readwrite.h quote.h \ + fmt.h errtxt.h idx.h uint32.h + ./compile ezmlm-split.c + + ezmlm-store: \ + load ezmlm-store.o auto_qmail.o getconf.o subdb.a log.o auto_bin.o mime.a \ + cookie.o now.o datetime.o date822fmt.o slurpclose.o slurp.o qmail.o quote.o \ + surf.a getln.a env.a sig.a strerr.a substdio.a stralloc.a alloc.a conf-sqlld \ + error.a str.a fs.a case.a open.a seek.a wait.a lock.a fd.a getopt.a copy.o + ./load ezmlm-store auto_qmail.o getconf.o subdb.a copy.o mime.a \ + log.o cookie.o now.o datetime.o date822fmt.o slurpclose.o \ + slurp.o qmail.o quote.o surf.a getln.a env.a sig.a strerr.a \ + substdio.a stralloc.a alloc.a error.a str.a fs.a case.a \ + open.a seek.a wait.a lock.a fd.a getopt.a auto_bin.o ${SQLLD} + + ezmlm-store.0: \ + ezmlm-store.1 + nroff -man ezmlm-store.1 > ezmlm-store.0 + + ezmlm-store.o: \ + compile ezmlm-store.c error.h stralloc.h gen_alloc.h str.h \ + sgetopt.h subgetopt.h fork.h wait.h auto_bin.h lock.h mime.h \ + env.h sig.h slurp.h getconf.h strerr.h byte.h getln.h case.h \ + qmail.h substdio.h readwrite.h seek.h quote.h datetime.h now.h \ + date822fmt.h fmt.h subscribe.h strerr.h cookie.h errtxt.h idx.h copy.h + ./compile ezmlm-store.c + ezmlm-sub: \ ! load ezmlm-sub.o subdb.a getconf.o slurpclose.o slurp.o \ ! log.o now.o fs.a strerr.a getln.a getopt.a fs.a conf-sqlld \ substdio.a stralloc.a alloc.a error.a str.a case.a open.a lock.a ! ./load ezmlm-sub subdb.a getconf.o slurpclose.o slurp.o \ ! log.o now.o fs.a strerr.a getopt.a fs.a \ getln.a substdio.a stralloc.a alloc.a error.a str.a case.a \ ! open.a lock.a ${SQLLD} ezmlm-sub.0: \ ezmlm-sub.1 *************** *** 314,370 **** ezmlm-sub.o: \ compile ezmlm-sub.c strerr.h ezmlm-sub.c subscribe.h strerr.h \ ! strerr.h subscribe.h ezmlm-sub.c log.h ezmlm-sub.c ./compile ezmlm-sub.c ezmlm-unsub: \ ! load ezmlm-unsub.o subscribe.o log.o now.o fs.a strerr.a getln.a \ substdio.a stralloc.a alloc.a error.a str.a case.a open.a lock.a ! ./load ezmlm-unsub subscribe.o log.o now.o fs.a strerr.a \ getln.a substdio.a stralloc.a alloc.a error.a str.a case.a \ ! open.a lock.a ezmlm-unsub.0: \ ezmlm-unsub.1 nroff -man ezmlm-unsub.1 > ezmlm-unsub.0 ezmlm-unsub.o: \ ! compile ezmlm-unsub.c strerr.h ezmlm-unsub.c subscribe.h strerr.h \ ! strerr.h subscribe.h ezmlm-unsub.c log.h ezmlm-unsub.c ./compile ezmlm-unsub.c ezmlm-warn: \ ! load ezmlm-warn.o auto_qmail.o getconf.o cookie.o issub.o now.o \ slurpclose.o slurp.o quote.o datetime.o date822fmt.o qmail.o surf.a \ case.a strerr.a sig.a getln.a substdio.a stralloc.a alloc.a error.a \ ! open.a lock.a str.a fs.a fd.a wait.a ! ./load ezmlm-warn auto_qmail.o getconf.o cookie.o issub.o \ now.o slurpclose.o slurp.o quote.o datetime.o date822fmt.o \ qmail.o surf.a case.a strerr.a sig.a getln.a substdio.a \ stralloc.a alloc.a error.a open.a lock.a str.a fs.a fd.a \ ! wait.a ezmlm-warn.0: \ ezmlm-warn.1 nroff -man ezmlm-warn.1 > ezmlm-warn.0 ezmlm-warn.o: \ ! compile ezmlm-warn.c ezmlm-warn.c ezmlm-warn.c direntry.h direntry.h \ ! direntry.h ezmlm-warn.c readwrite.h ezmlm-warn.c getln.h ezmlm-warn.c \ ! substdio.h ezmlm-warn.c stralloc.h gen_alloc.h stralloc.h \ ! ezmlm-warn.c slurp.h ezmlm-warn.c getconf.h ezmlm-warn.c byte.h \ ! ezmlm-warn.c error.h ezmlm-warn.c str.h ezmlm-warn.c strerr.h \ ! ezmlm-warn.c sig.h ezmlm-warn.c now.h datetime.h now.h ezmlm-warn.c \ ! datetime.h datetime.h ezmlm-warn.c date822fmt.h ezmlm-warn.c fmt.h \ ! ezmlm-warn.c cookie.h ezmlm-warn.c qmail.h substdio.h substdio.h \ ! qmail.h ezmlm-warn.c ./compile ezmlm-warn.c ezmlm-weed: \ ! load ezmlm-weed.o getln.a strerr.a substdio.a error.a stralloc.a \ alloc.a str.a ./load ezmlm-weed getln.a strerr.a substdio.a error.a \ ! stralloc.a alloc.a str.a ezmlm-weed.0: \ ezmlm-weed.1 --- 787,872 ---- ezmlm-sub.o: \ compile ezmlm-sub.c strerr.h ezmlm-sub.c subscribe.h strerr.h \ ! getln.h substdio.h stralloc.h readwrite.h \ ! strerr.h subscribe.h log.h errtxt.h sgetopt.h scan.h idx.h ./compile ezmlm-sub.c + ezmlm-test: \ + ezmlm-test.sh warn-auto.sh conf-bin + (cat warn-auto.sh; \ + echo QMPATH=\'`head -1 conf-qmail`\'; \ + cat ezmlm-test.sh ) > ezmlm-test; \ + chmod 755 ezmlm-test + + ezmlm-test.0: \ + ezmlm-test.1 + nroff -man ezmlm-test.1 > ezmlm-test.0 + + ezmlm-tstdig: \ + load ezmlm-tstdig.o getopt.a getconf.o now.o fs.a strerr.a getln.a \ + lock.a \ + substdio.a stralloc.a alloc.a error.a str.a case.a sig.a \ + open.a slurpclose.o slurp.o env.a + ./load ezmlm-tstdig getopt.a getconf.o env.a now.o fs.a strerr.a \ + lock.a getln.a substdio.a stralloc.a alloc.a error.a str.a case.a \ + sig.a slurpclose.o slurp.o open.a + + ezmlm-tstdig.0: \ + ezmlm-tstdig.1 + nroff -man ezmlm-tstdig.1 > ezmlm-tstdig.0 + + ezmlm-tstdig.o: \ + compile ezmlm-tstdig.c strerr.h sgetopt.h getconf.h \ + sig.h now.h errtxt.h stralloc.h sig.h env.h fmt.h substdio.h readwrite.h \ + now.h idx.h + ./compile ezmlm-tstdig.c + ezmlm-unsub: \ ! load ezmlm-unsub.o subdb.a getconf.o slurpclose.o slurp.o \ ! log.o now.o fs.a strerr.a getln.a getopt.a fs.a conf-sqlld \ substdio.a stralloc.a alloc.a error.a str.a case.a open.a lock.a ! ./load ezmlm-unsub subdb.a getopt.a getconf.o slurpclose.o slurp.o \ ! log.o now.o fs.a strerr.a fs.a \ getln.a substdio.a stralloc.a alloc.a error.a str.a case.a \ ! open.a lock.a ${SQLLD} ezmlm-unsub.0: \ ezmlm-unsub.1 nroff -man ezmlm-unsub.1 > ezmlm-unsub.0 ezmlm-unsub.o: \ ! compile ezmlm-unsub.c strerr.h subscribe.h \ ! log.h errtxt.h sgetopt.h scan.h idx.h readwrite.h stralloc.h substdio.h ./compile ezmlm-unsub.c ezmlm-warn: \ ! load ezmlm-warn.o auto_qmail.o getconf.o mime.a cookie.o subdb.a now.o \ slurpclose.o slurp.o quote.o datetime.o date822fmt.o qmail.o surf.a \ case.a strerr.a sig.a getln.a substdio.a stralloc.a alloc.a error.a \ ! open.a lock.a str.a fs.a fd.a wait.a copy.o getopt.a conf-sqlld ! ./load ezmlm-warn auto_qmail.o getconf.o mime.a \ ! cookie.o subdb.a getopt.a \ now.o slurpclose.o slurp.o quote.o datetime.o date822fmt.o \ qmail.o surf.a case.a strerr.a sig.a getln.a substdio.a \ stralloc.a alloc.a error.a open.a lock.a str.a fs.a fd.a \ ! wait.a copy.o ${SQLLD} ezmlm-warn.0: \ ezmlm-warn.1 nroff -man ezmlm-warn.1 > ezmlm-warn.0 ezmlm-warn.o: \ ! compile ezmlm-warn.c direntry.h readwrite.h getln.h \ ! substdio.h stralloc.h gen_alloc.h slurp.h getconf.h byte.h error.h str.h \ ! sig.h now.h datetime.h date822fmt.h fmt.h cookie.h qmail.h substdio.h \ ! qmail.h copy.h mime.h idx.h errtxt.h sgetopt.h subgetopt.h ./compile ezmlm-warn.c ezmlm-weed: \ ! load ezmlm-weed.o getln.a strerr.a substdio.a error.a case.a stralloc.a \ alloc.a str.a ./load ezmlm-weed getln.a strerr.a substdio.a error.a \ ! case.a stralloc.a alloc.a str.a ezmlm-weed.0: \ ezmlm-weed.1 *************** *** 380,385 **** --- 882,899 ---- ezmlm.5 nroff -man ezmlm.5 > ezmlm.0 + ezmlmglrc.0: \ + ezmlmglrc.5 + nroff -man ezmlmglrc.5 > ezmlmglrc.0 + + ezmlmrc.0: \ + ezmlmrc.5 + nroff -man ezmlmrc.5 > ezmlmrc.0 + + ezmlmsubrc.0: \ + ezmlmsubrc.5 + nroff -man ezmlmsubrc.5 > ezmlmsubrc.0 + fd.a: \ makelib fd_copy.o fd_move.o ./makelib fd.a fd_copy.o fd_move.o *************** *** 496,511 **** byte.h install.c ./compile install.c issub.o: \ ! compile issub.c stralloc.h gen_alloc.h stralloc.h issub.c getln.h \ ! issub.c readwrite.h issub.c substdio.h issub.c open.h issub.c byte.h \ ! issub.c case.h issub.c lock.h issub.c error.h issub.c issub.h \ ! strerr.h issub.h issub.c uint32.h issub.c ! ./compile issub.c it: \ ezmlm-make ezmlm-manage ezmlm-send ezmlm-reject ezmlm-return \ ! ezmlm-warn ezmlm-weed ezmlm-list ezmlm-sub ezmlm-unsub load: \ make-load warn-auto.sh systype --- 1010,1032 ---- byte.h install.c ./compile install.c + idxthread.o: \ + compile idxthread.c idxthread.h alloc.h error.h stralloc.h str.h lock.h idx.h \ + substdio.h fmt.h readwrite.h idx.h errtxt.h substdio.h byte.h yyyymm.h + ./compile idxthread.c + issub.o: \ ! compile issub.c stralloc.h gen_alloc.h getln.h readwrite.h substdio.h \ ! open.h byte.h case.h lock.h error.h subscribe.h strerr.h uint32.h fmt.h \ ! conf-sqlcc ! ./compile issub.c ${SQLCC} it: \ + ezmlm-idx ezmlm-accept ezmlm-archive ezmlm-check ezmlm-gate ezmlm-get \ + ezmlm-clean ezmlm-glconf ezmlm-moderate ezmlm-store ezmlm-tstdig \ ezmlm-make ezmlm-manage ezmlm-send ezmlm-reject ezmlm-return \ ! ezmlm-warn ezmlm-weed ezmlm-list ezmlm-sub ezmlm-unsub ezmlm-cgi ezmlm-limit \ ! ezmlm-issubn ezmlm-cron ezmlm-request ezmlm-test ezmlm-split ezmlmrc load: \ make-load warn-auto.sh systype *************** *** 527,532 **** --- 1048,1057 ---- fmt.h log.c open.h log.c ./compile log.c + logmsg.o: \ + compile logmsg.c stralloc.h fmt.h conf-sqlcc + ./compile logmsg.c ${SQLCC} + make-compile: \ make-compile.sh auto-ccld.sh cat auto-ccld.sh make-compile.sh > make-compile *************** *** 542,547 **** --- 1067,1076 ---- cat auto-ccld.sh make-makelib.sh > make-makelib chmod 755 make-makelib + makehash.o: \ + makehash.c makehash.h surf.h uint32.h stralloc.h + ./compile makehash.c + makelib: \ make-makelib warn-auto.sh systype ( cat warn-auto.sh; ./make-makelib "`cat systype`" ) > \ *************** *** 549,560 **** chmod 755 makelib man: \ ! ezmlm.0 ezmlm-make.0 ezmlm-manage.0 ezmlm-send.0 ezmlm-reject.0 \ ezmlm-return.0 ezmlm-warn.0 ezmlm-weed.0 ezmlm-list.0 ezmlm-sub.0 \ ezmlm-unsub.0 alloc.0 case.0 datetime.0 direntry.0 env.0 error.0 \ error_str.0 error_temp.0 ezmlm.0 fd_copy.0 fd_move.0 getln.0 getln2.0 \ getopt.0 now.0 sgetopt.0 stralloc.0 subfd.0 subgetopt.0 substdio.0 \ ! substdio_copy.0 substdio_in.0 substdio_out.0 surf.0 surfpcs.0 wait.0 now.0: \ now.3 --- 1078,1100 ---- chmod 755 makelib man: \ ! ezmlm.0 ezmlm-gate.0 ezmlm-idx.0 ezmlm-get.0 ezmlm-check.0 ezmlm-tstdig.0 \ ! ezmlm-make.0 ezmlm-manage.0 ezmlm-send.0 ezmlm-reject.0 ezmlm-accept.0 \ ezmlm-return.0 ezmlm-warn.0 ezmlm-weed.0 ezmlm-list.0 ezmlm-sub.0 \ ezmlm-unsub.0 alloc.0 case.0 datetime.0 direntry.0 env.0 error.0 \ error_str.0 error_temp.0 ezmlm.0 fd_copy.0 fd_move.0 getln.0 getln2.0 \ + ezmlm-issubn.0 ezmlm-cron.0 ezmlm-glconf.0 ezmlmglrc.0 ezmlm-test.0 \ + ezmlmsubrc.0 ezmlm-mktab.0 ezmlm-split.0 ezmlm-archive.0 ezmlm-cgi.0 \ getopt.0 now.0 sgetopt.0 stralloc.0 subfd.0 subgetopt.0 substdio.0 \ ! substdio_copy.0 substdio_in.0 substdio_out.0 surf.0 surfpcs.0 wait.0 \ ! ezmlm-clean.0 ezmlm-moderate.0 ezmlm-store.0 ezmlm-request.0 ezmlmrc.0 \ ! ezmlm-limit.0 ! ! mime.a: \ ! makelib concatHDR.o decodeHDR.o unfoldHDR.o \ ! decodeQ.o encodeQ.o decodeB.o encodeB.o author.o ! ./makelib mime.a concatHDR.o decodeHDR.o decodeQ.o encodeQ.o \ ! decodeB.o encodeB.o unfoldHDR.o author.o now.0: \ now.3 *************** *** 582,587 **** --- 1122,1137 ---- compile open_trunc.c open_trunc.c open_trunc.c open.h open_trunc.c ./compile open_trunc.c + opensql.o: \ + compile opensql.c error.h strerr.h errtxt.h \ + str.h case.h stralloc.h subscribe.h conf-sqlcc + ./compile opensql.c ${SQLCC} + + putsubs.o: \ + compile putsubs.c error.h substdio.h strerr.h readwrite.h \ + str.h open.h case.h errtxt.h stralloc.h subscribe.h qmail.h fmt.h conf-sqlcc + ./compile putsubs.c ${SQLCC} + qmail.o: \ compile qmail.c substdio.h qmail.c readwrite.h qmail.c wait.h qmail.c \ exit.h qmail.c fork.h qmail.c fd.h qmail.c qmail.h substdio.h \ *************** *** 601,606 **** --- 1151,1162 ---- compile scan_ulong.c scan.h scan_ulong.c ./compile scan_ulong.c + searchlog.o: \ + compile searchlog.c case.h stralloc.h scan.h open.h datetime.h errtxt.h str.h \ + datetime.h date822fmt.h substdio.h readwrite.h strerr.h error.h \ + subscribe.h conf-sqlcc + ./compile searchlog.c ${SQLCC} + seek.a: \ makelib seek_set.o ./makelib seek.a seek_set.o *************** *** 800,805 **** --- 1356,1367 ---- compile strerr_sys.c error.h strerr_sys.c strerr.h strerr_sys.c ./compile strerr_sys.c + subdb.a: \ + makelib checktag.o issub.o logmsg.o subscribe.o opensql.o putsubs.o \ + tagmsg.o searchlog.o + ./makelib subdb.a checktag.o issub.o logmsg.o subscribe.o \ + opensql.o putsubs.o tagmsg.o searchlog.o + subfd.0: \ subfd.3 nroff -man subfd.3 > subfd.0 *************** *** 818,829 **** ./compile subgetopt.c subscribe.o: \ ! compile subscribe.c stralloc.h gen_alloc.h stralloc.h subscribe.c \ ! getln.h subscribe.c readwrite.h subscribe.c substdio.h subscribe.c \ ! strerr.h subscribe.c open.h subscribe.c byte.h subscribe.c case.h \ ! subscribe.c lock.h subscribe.c error.h subscribe.c uint32.h \ ! subscribe.c subscribe.h strerr.h strerr.h subscribe.h subscribe.c ! ./compile subscribe.c substdi.o: \ compile substdi.c substdio.h substdi.c byte.h substdi.c error.h \ --- 1380,1389 ---- ./compile subgetopt.c subscribe.o: \ ! compile subscribe.c stralloc.h gen_alloc.h stralloc.h \ ! getln.h readwrite.h substdio.h strerr.h open.h byte.h case.h \ ! lock.h error.h uint32.h subscribe.h idx.h fmt.h conf-sqlcc ! ./compile subscribe.c ${SQLCC} substdi.o: \ compile substdi.c substdio.h substdi.c byte.h substdi.c error.h \ *************** *** 889,894 **** --- 1449,1458 ---- find-systype trycpp.c ./find-systype > systype + tagmsg.o: \ + compile tagmsg.c stralloc.h slurp.h scan.h fmt.h strerr.h cookie.h conf-sqlcc + ./compile tagmsg.c ${SQLCC} + uint32.h: \ tryulong32.c compile load uint32.h1 uint32.h2 ( ( ./compile tryulong32.c && ./load tryulong32 && \ *************** *** 907,909 **** --- 1471,1594 ---- wait_pid.o: \ compile wait_pid.c wait_pid.c wait_pid.c error.h wait_pid.c ./compile wait_pid.c + + yyyymm.a: \ + makelib date2yyyymm.o dateline.o + ./makelib yyyymm.a date2yyyymm.o dateline.o + + ch: \ + ezmlmrc.ch + cp -f ezmlmrc.ch_GB ezmlmrc + + ch_GB: \ + ezmlmrc.ch_GB + cp -f ezmlmrc.ch_GB ezmlmrc + + cs: \ + ezmlmrc.cs + cp -f ezmlmrc.cs ezmlmrc + + da: \ + ezmlmrc.da + cp -f ezmlmrc.da ezmlmrc + + de: \ + ezmlmrc.de + cp -f ezmlmrc.de ezmlmrc + + en_US: \ + ezmlmrc.en_US + cp -f ezmlmrc.en_US ezmlmrc + + en: \ + ezmlmrc.en_US + cp -f ezmlmrc.en_US ezmlmrc + + es: \ + ezmlmrc.es + cp -f ezmlmrc.es ezmlmrc + + us: \ + ezmlmrc.en_US + cp -f ezmlmrc.en_US ezmlmrc + + ezmlmrc: \ + ezmlmrc.en_US + cp -f ezmlmrc.en_US ezmlmrc + + fr: \ + ezmlmrc.fr + cp -f ezmlmrc.fr ezmlmrc + + id: \ + ezmlmrc.id + cp -f ezmlmrc.id ezmlmrc + + ita: \ + ezmlmrc.it + cp -f ezmlmrc.it ezmlmrc + + jp: \ + ezmlmrc.jp + cp -f ezmlmrc.jp ezmlmrc + + pl: \ + ezmlmrc.pl + cp -f ezmlmrc.pl ezmlmrc + + pt: \ + ezmlmrc.pt + cp -f ezmlmrc.pt ezmlmrc + + pt_BR: \ + ezmlmrc.pt_BR + cp -f ezmlmrc.pt_BR ezmlmrc + + ru: \ + ezmlmrc.ru + cp -f ezmlmrc.ru ezmlmrc + + sv: \ + ezmlmrc.sv + cp -f ezmlmrc.sv ezmlmrc + + mysql: + ln -sf sub_mysql/ezmlm-mktab ezmlm-mktab + ln -sf sub_mysql/checktag.c checktag.c; rm -f checktag.o + ln -sf sub_mysql/issub.c issub.c; rm -f issub.o + ln -sf sub_mysql/logmsg.c logmsg.c; rm -f logmsg.o + ln -sf sub_mysql/subscribe.c subscribe.c; rm -f subscribe.o + ln -sf sub_mysql/opensql.c opensql.c; rm -f opensql.o + ln -sf sub_mysql/putsubs.c putsubs.c; rm -f putsubs.o + ln -sf sub_mysql/tagmsg.c tagmsg.c; rm -f tagmsg.o + ln -sf sub_mysql/searchlog.c searchlog.c; rm -f searchlog.o + ln -sf sub_mysql/conf-sqlld conf-sqlld; touch conf-sqlld + ln -sf sub_mysql/conf-sqlcc conf-sqlcc; touch conf-sqlcc + + pgsql: + ln -sf sub_pgsql/ezmlm-mktab ezmlm-mktab + ln -sf sub_pgsql/checktag.c checktag.c; rm -f checktag.o + ln -sf sub_pgsql/issub.c issub.c; rm -f issub.o + ln -sf sub_pgsql/logmsg.c logmsg.c; rm -f logmsg.o + ln -sf sub_pgsql/subscribe.c subscribe.c; rm -f subscribe.o + ln -sf sub_pgsql/opensql.c opensql.c; rm -f opensql.o + ln -sf sub_pgsql/putsubs.c putsubs.c; rm -f putsubs.o + ln -sf sub_pgsql/tagmsg.c tagmsg.c; rm -f tagmsg.o + ln -sf sub_pgsql/searchlog.c searchlog.c; rm -f searchlog.o + ln -sf sub_pgsql/conf-sqlld conf-sqlld; touch conf-sqlld + ln -sf sub_pgsql/conf-sqlcc conf-sqlcc; touch conf-sqlcc + + std: + ln -sf sub_std/ezmlm-mktab ezmlm-mktab + ln -sf sub_std/checktag.c checktag.c; rm -f checktag.o + ln -sf sub_std/issub.c issub.c; rm -f issub.o + ln -sf sub_std/logmsg.c logmsg.c; rm -f logmsg.o + ln -sf sub_std/subscribe.c subscribe.c; rm -f subscribe.o + ln -sf sub_std/opensql.c opensql.c; rm -f opensql.o + ln -sf sub_std/putsubs.c putsubs.c; rm -f putsubs.o + ln -sf sub_std/tagmsg.c tagmsg.c; rm -f tagmsg.o + ln -sf sub_std/searchlog.c searchlog.c; rm -f searchlog.o + ln -sf sub_std/conf-sqlld conf-sqlld; touch conf-sqlld + ln -sf sub_std/conf-sqlcc conf-sqlcc; touch conf-sqlcc + + diff -crN ../ezmlm-0.53/README.idx ./README.idx *** ../ezmlm-0.53/README.idx Wed Dec 31 18:00:00 1969 --- ./README.idx Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,337 ---- + $Id: README.idx,v 1.70 1999/12/24 04:20:45 lindberg Exp $ + $Name: ezmlm-idx-040 $ + + (c) 1997, 1998, 1999 Fred Lindberg, lindberg@id.wustl.edu (code+docs+faq) + Fred B. Ringel, fredr@rivertown.net (faq) + + This software is distributed under the GNU General Public Licence as + published by the Free Software Foundation. See the file LICENCE.TXT for + the conditions under which this software is made available. + + Like any other piece of software (and information generally), ezmlm-idx + comes with NO WARRANTY. + + This is an addition and patch to ezmlm-0.53 [(c) Dan J. Bernstein]. + Ezmlm-idx uses Dan's libraries and heavily relies on ezmlm-0.53 code. + ezmlm-idx does not function without ezmlm-0.53. + + ezmlm-0.53 provides basic message distribution, subscriber address handling, + message archiving (single quoted message retrieval only), and bounce + handling. ezmlm-idx adds multi-message threaded archive retrieval, digests, + remote administration, message and subscription moderation, subscriber-only + restrictions, message trailer, subject prefix, subscriber name storage, + customizable setup, multi-language and MIME support and more. In addition, + improved bounce handling, case-insensitive subscriber address storage, + and support for distributed lists (main + sublist transparent to the + subscriber). Ezmlm-idx can now be compiled with MySQL or Postgres support. + + See INSTALL.idx for installation instructions. + See UPGRADE.idx to upgrade from a previous version of ezmlm-idx. + See CHANGES.idx to see what's new in this version. + See FILES.idx for a list of files in this package. + See FAQ.idx for more info on ezmlm(-idx) functions and setup (see below on + how to get the latest version). + See ezman-0.xx* for a user's/administrator's manual to ezmlm/idx. Available + on line at http://www.ezmlm.org/ and for download at + ftp://ftp.ezmlm.org/pub/patches/ezman/ and mirrors. + + NOTE: Some ezmlmrc translations may not be up-to-date. ezmlm-make will + complain and the results may not match the documentation. Changes required + are small. If you correct a translation, please submit it for inclusion + in the next ezmlm-idx version. + + *.rpm will put ezmlm-cgi in the bin directory. To use it, you must manually + move it to a cgi-bin directory, set ownership and SUID (if needed), and + set up /ezmlm/ezcgirc. + + See http://pobox.com/~djb/ezmlm.html for the latest information about + ezmlm. + + See ftp://ftp.id.wustl.edu/pub/patches for the latest version of ezmlm-idx and + downloadable versions of the FAQ. + + See http://www.ezmlm.org/ for ezmlm FAQ and docs on line. + + Mail ``ezmlm-subscribe@list.cr.yp.to'' to join the ezmlm mailing + list (averages 3 messages per day). This list is run by Dan J. Bernstein + using ezmlm-0.53. + + Send general comments and questions to: + lindberg@id.wustl.edu or fredr@rivertown.net. + + Send bug reports and patches to: + lindberg@id.wustl.edu. + + Below, acknowledgements and a list of systems where ezmlm-idx has been reported + to work. + + ACKNOWLEDGEMENTS + - Fred B. Ringel, first and foremost, for a great collaboration, ideas, testing, + docs clarification. This makes it so much more fun. + - Dan J. Bernstein for qmail, ezmlm, and great libraries. + - Toshinori Maeno (TM; tmaeno@hpcl.titech.ac.jp) for finding an ezmlm-idx-0.20 + bug, and MIME suggestions, suggestions about hopcount and received headers, + return-path header in archive, sublist loop detection, ezmlm-limit suggestion, + many other suggestions and explanations, help to get ezmlm-cgi Japanese + support to work, as well as pre-release testing. + - Frank Tegtmeyer for inciting digests and format info/suggestions, and for + ezmlmrc.de. + - Magnus Stålåker (MAS; stalaker@umc.se) for the PostgresSQL interface. + - Mark Delany for the original ezmlm-issub and for suggesting reordering + unlink() and doit() in ezmlm-warn. + - Raul Miller and Chris Garrigues for format info/suggestions. + - Thomas Erskine (TEE; tom@crc.doc.ca) for fix to clean sunos-4.1.3 compiles + and pre-release compilation on many platforms, fixes for bash-isms in + ezmlm-check, and testing. + - Shuhei Kobayashi (SK; shuhei-k@jaist.ac.jp) for MIME corrections/suggestions, + X-sequence suggestions, ezmlm-check/make corrections, and pre-release testing. + - Yusuf Goolamabbas (YG; yusufg@krdl.org.sg) and the Mutt developers for + pointing out outdated MIME, ezmlmrc improvements, outformat bug, suggestion + about ezmlm-moderate -r switch, and pre-release testing. + - Brian Gentry (BG; gentry@usaccess-inc.com) for reporting the + ezmlm-moderate-0.12 exit code bug. + - Anand R. Buddhev (ARB; arb@iconnect.co.ke) for fix to clean BSDI 2.1 compiles + and pre-release testing. + - Masashi Fujita (MF; objectx@polyphony.scei.co.jp) for fix to clean SGI + compiles, lint advice, MIME suggestions, pre-release testing, a patch for + the ezmlm-make-0.21 -c bug, ezmlmrc.jp, and finding postmsg bug in 0.301. + - Matthew D. Stock (MDS; stock@perdix.acsu.buffalo.edu) for pre-release testing. + - Ximenes Zalteca for finding an ezmlm-send-0.21 bug. + - Jukka Suomela (JS; jukka@narnia.tky.hut.fi) for inciting the ezmlm-send -cC + switch. + - John White (johnjohn@triceratops.com) for questions leading to ezmlm-tstdig, + and for testing the example script. + - Torben Fjerdingstad (TF; unitfj@tfj.uni-c.dk) for testing case-insensitive + issub.c and subscribe.c, for TARGETS, for suggesting a no-copy-to-SENDER + option, for ezmlmrc.da, for reporting missing MIME end for base64/QP + moderated [un]sub confirms, and for pre-release testing. + - Shinya O'Hira (SOH; Shinya_Oohira@justsystem.co.jp) for reporting the + ezmlm-make-0.22 lock file name bug and for testing the fix. Also for many + helpful suggestions and hard work testing rfc2047 subject support. + - Sadhu(sadhu@aloha.net) & Tracy Reed (TR; treed@ultraviolet.org) for reporting + the ezmlm-send-0.22 undefined SENDER bug, and testing the fix. + - Scott Balantyne (SDB; sdb@ssr.com) for inciting the modifications for digest + out of dir/editor. + - Frank Denis (j@industrie.capgemini.fr) for ezmlmrc.fr. + - Marc Evans (marc@destek.net) for reporting the ezmlm-make-0.221 64-bit bug + and pre-release testing, and inciting, improving, and testing ezmlm-test. + - Vince Vielhaber (VV; vev@michvhf.com) for reporting ezmlm-check problems with + non-bash and testing fixes. + - Andrew Pam (AP; xanni@xanadu.net) for suggesting the ezmlm-idx -d switch and + reporting the ezmlm-gate failure on NULL $SENDER bug. + - Glen Stewart (GS; glen_stewart@associate.com) for reminding me about command + case insensitivity and ezmlmrc typo fixes. + - Kenji Ikeda (KI; noroi@nt.is.dnp.co.jp) for a patch to ezmlm-idx-0.23 to get + message numbers in subjects. I've added code to ezmlm-idx-0.30 implementing + this is a similar manner. Sen Nagata (sen_ml@eccosys.com) for suggesting this + earlier. Bugfix for missing MIME boundary in -index reply. + - Sebastian Andersson (SA; sa@hogia.net) for ezmlmrc.sv, MIME suggestions, + ezmlm-weed patch, ezmlmrc version check suggestion and pre-release testing. + - Giorgos Stathakopoulos (GS; stathako@cti.gr) for pre-release testing. + - David Summers (DS; david@summersoft.fay.ar.us) for pre-release testing, + reporting a ezmlm-check bug and SPEC files for rpm:s. + - Steinar Haug (STH; sthaug@nethelp.no) for pointing out missing ';' in + ezmlmrc (caused problems with /bin/sh on FreeBSD), and the trigger message + received lines in the digest header. + - Peter Hunter (PH) for suggesting dir/headeradd and list address in digest + headers and for reporting a "cosmetic" bug in subscription logging. + - Jim Simmons (JS) for finding the n/d switch misnaming in ezmlmrc for text file + editing. + - Sergiusz Pawlowicz (SP; ser@arch.pwr.wroc.pl) for ezmlmrc.pl, and many entries + for mimeremove. + - Wanderlei Antonio Cavassin (WAC; cavassin@connectiva.com.br) for + ezmlmrc.pt_BR. + - Jim Simmons ( ) for finding a missing-newline-mime bug in + ezmlm-moderate/store/clean. + - Monte Mitzelfelt (MM; monte@gonefishing.org) for suggesting alternative + From: for ezmlm-manage help messages to break responder loops. + - Louis Larry (LL; luois@kediri.webindonesia.com) for reporting a 0.311 prefix + handling bug. + - Sigi Remsmurr (SR; service@isk.de), Bill Nugent (whn@topelo.lopi.com), James + Smallacombe (JS; up@3am) for ezmlmrc corrections/suggestions. + - Matthew Saunders (MS; matts@easynet.net) for ezmlm-glconf.sh corrections and + reporting crashability of ezmlm-get by abnormal use (fixed). + - Petr Novotny (PN; Petr.Novotny@antek.cz) for ezdomo.tar.gz corrections. + - Evan Champion (EC; evanc@synapse.net) for ezmlm-request bug report. + - Jeff Hill (JH; jhill@hronline.com) for ezmlm-reject bug report. + - Bruno Wolff (BW; bruno@cerberus.umn.edu) for Ultrix fixes. + - Butch Evans (BE; butch@###.com) for reporting trailer problems with + multipart/alternative messages and testing fix. + - Kragen Sitaker (KS; kragen@pobox.com) for reporting ezmlm-manage -get bug. + - Lars B. Rasmusson (LBR; lbr@mjolner.dk) for prerelease testing with sun cc. + - Mike McLeish (MMcL; Mike.Mcleish@chatsoft.com) for reporting problems + using the 'x' format and testing the fix. + - Jan Kasprzak (JK; kas@informatics.muni.cz) for ezmlmrc.cs and headerremove + suggestions. + - Matt McGlynn for reporting 0.32 ezmlmrc -return omission. + - Roman V Isaev (RVI; rm@techno.ru) for ezmlmrc.ru as well as suggestions + on -allow automation. + - Aria Prima Novianto (APN; aria@isnet.org) for ezmlmrc.id. + - Roberto De Carlo (RDC; rodeca@flashnet.it) for ezmlmrc.it. + - Vicent Mas, Francesc Alted, Sonia Lorente, and Cyndy DePoy for ezmlmrc.es. + - HaiFeng Guo (HFG; haifeng@ms.lawton.com.cn) for ezmlmrc.cn_GB. + - Benjamin Pflugman (BPF; philemon@spin.de) for reporting multipart/signed + problems and testing fix. + - Rik Myers (RM; rik@sumthin.nu), Daniel Mattos (DM; daniel@tiii.com) and others + for helping make ezmlm-test less platform-sensitive. + - Michael Hirohama (MH; michael@sooth.com) for reporting Outlook problems and + testing a work-around. + - Mate Wierdl (MW; mw@wierdlpc.msci.memphis.edu) for SPEC file kit and + suggestions on ezmlm-test, "it", etc, and pre-release testing. + - Numerous users for suggestions/corrections for the documentation. + - I'm sure I've forgotten others who have contributed ideas, questions, + comments. Thanks! + + EZMLM-IDX HAS BEEN REPORTED TO WORK ON (With ezmlm-0.53): + 0.12: linux-2.0.18-:i386-:-:i486-:- (Thanks Dileep Agrawal) + 0.12: linux-2.0.23-:i386-:-:i486-:- (Thanks TV) + 0.12: linux-2.0.31-:i386-:-:i486-:- (Thanks Nathan D. Faber) + 0.20: linux-2.0.23-:i386-:-:i486:-:- + 0.20: linux-2.0.31-:i386-:-:pentium:-:- (Thanks FBR) + 0.20: linux-2.0.23-:i386-:-:pentium:-:- (Thanks YG) + 0.20: irix-5.3-11091812-:-:-:ip22-:- (Thanks MF) + 0.20: bsd.os-2.1-:i386-:-:pentium-:- (Thanks ARB) + 0.20: sunos-4.1.4-2-:sparc-:sun4:sun4m- (Thanks SK) + 0.20: freebsd-2.2.2-release-:i386-:-:pentium.pro-:- (Thanks MDS) + 0.21: linux-2.0.23-:i386-:-:i486-:- + 0.21: irix-5.3-11091812-:-:-:ip22-:- (Thanks MF) + 0.21: sunos-4.1.3-3-:unknown-:sun4-:sun4m-:sun4m- (Thanks TEE) + 0.21: bsd.os-2.1-:i386-:-:pentium-:- (Thanks ARB) + 0.21: sunos-5.6-generic-:sparc-:sun4-:sun4u-:sun4u- (Thanks SOH) + 0.22: aix-4-2-:-:-:000720704c00-:- (Thanks TF) + 0.22: linux-2.0.23-:i386-:-:i486-:- + 0.22: linux-2.0.31-:i386-:-:ppro-:- (Thanks YG) + 0.22: linux-2.0.32-:i386-:-:pentium-:- (Thanks FBR) + 0.22: linux-2.0.32-:i386-:-:pentium-:- (Thanks TF) + 0.22: freebsd-2.2.1-release-:i386-:-:-:- (Thanks TM) + 0.22: freebsd-2.2.5-stable-:i386-:-:pentium.pro-:- (Thanks MDS) + 0.22: osf1-v4.0-386-:-:-:alpha-:- (Thanks TEE) + 0.22: sunos-4.1.3-3-:unknown-:sun4-:sun4m-:sun4m- (Thanks TEE) + 0.22: sunos-5.5.1-generic_103640-08-:sparc-:sun4-:sun4u-:sun4u- (Thanks YG) + 0.22: sunos-5.5-generic_103093-06-:sparc-:sun4-:sun4m-:sun4m- (Thanks TEE) + 0.22: sunos-5.6-generic-:sparc-:sun4-:sun4u-:sun4u- (Thanks SOH) + 0.23: aix-4-2-:-:-:000720704c00-:- (Thanks TF) + 0.23: bsd.os-2.1-:i386-:-:pentium-:- (Thanks ARB) + 0.23: freebsd-2.2.1-release-:i386-:-:-:- (Thanks TM) + 0.23: irix-5.3-11091812-:-:-:ip22-:- (Thanks MF) + 0.23: linux-2.0.30-:i386-:-:i486-:- + 0.23: linux-2.0.32-:i386-:-:i486-:- (Thanks BCL; Bruce C. Law) + 0.23: linux-2.0.32-:i386-:-:pentium-:- (Thanks FBR) + 0.23: osf1-v4.0-386-:-:-:alpha-:- (Thanks TEE) + 0.23: osf1-v4.0-564-:-:-:alpha-:- (Thanks ME) + 0.23: sunos-4.1.3-3-:unknown-:sun4-:sun4m-:sun4m- (Thanks TEE) + 0.23: sunos-5.5-generic_103093-06-:sparc-:sun4-:sun4m-:sun4m- (Thanks TEE) + 0.23: sunos-5.6-generic-:sparc-:sun4-:sun4u-:sun4u- (Thanks SOH) + 0.30: aix-4-2-:-:-:000720704c00-:- (Thanks TF) + 0.30: bsd.os-2.1-:i386-:-:pentium-:- (Thanks ARB) + 0.30: freebsd-2.2.5-release-:i386-:-:-:- (Thanks TM) + 0.30: irix-5.3-11091812-:-:-:ip22-:- (Thanks MF) + 0.30: linux-2.0.30-:i386-:-:i486-:- + 0.30: linux-2.0.31-:i386-:-:ppro:-:- (Thanks YG) + 0.30: linux-2.0.32-:i386-:-:pentium-:- (Thanks FBR) + 0.30: osf1-v4.0-564-:-:-:alpha-:- (Thanks ME) + 0.30: sunos-5.6-generic-:sparc-:sun4-:sun4u-:sun4u- (Thanks SOH) + 0.301: freebsd-2.2.5-release-:i386-:-:pentium.pro-:- (Thanks Matthew S. Soffen) + 0.301: linux-2.0.30-:-:-:sparc-:- (Thanks Bill Himmelstoss) + 0.301: linux-2.0.30-:i386-:-:i486-:- + 0.301: linux-2.0.32-:i386-:-:pentium-:- (Thanks FBR) + 0.301: linux-2.0.33-:i386-:-:i486-:- (Thanks BCL) + 0.301: linux-2.0.32-:i386-:-:ppro-:- + 0.302: aix-4-2-:-:-:000720704c00-:- (Thanks TF) + 0.302: linux-2.0.31-:i386-:-:ppro:-:- (Thanks YG) + 0.302: linux-2.0.32-:i386-:-:i486-:- + 0.302: linux-2.0.34-:i386-:-:pentium-:- (Thanks FBR) + 0.31: freebsd-2.2.6-release-:i386-:-:-:- (Thanks TM) + 0.31: linux-2.0.32-:i386-:-:ppro-:- + 0.31: irix-5.3-11091812-:-:-:ip22-:- (Thanks MF) + 0.311: linux-2.0.31-:i386-:-:ppro-:- (Thanks YG) + 0.311: linux-2.0.32-:i386-:-:ppro-:- + 0.311: linux-2.0.33-:i386-:-:i486-:- (Thanks BCL) + 0.311: linux-2.0.35-:i386-:-:i486-:- (Thanks PN) + 0.312: aix-4-2-:-:-:000720704c00-:- (Thanks TF) + 0.312: freebsd-3.0-current-:i386-:-:pentium/p54c-:- (Thanks MS) + 0.312: irix-5.3-08031224-:-:-:ip12-:- (Thanks Rob Stone) + 0.312: irix-5.3-11091812-:-:-:ip22-:- (Thanks MF) + 0.312: irix64-6.4-02121744-:-:-:ip30-:- (Thanks MF) + 0.312: linux-2.0.32-:i386-:-:ppro-:- + 0.312: linux-2.1.115-:i386-:-:pentium-:- (Thanks Uwe Ohse) + 0.312: sunos-5.6-generic_105181-06-:sparc-:sun4-:sun4u-:sun4u- (Thanks GS) + 0.312: sunos-5.6-generic_105182-08-:i386-:i86pc-:i86pc-:i86pc- (Thanks LBR) + 0.313: aix-4-2-:-:-:00720704c00-:- (Thanks TF) + 0.313: freebsd-2.2.6-release-:i386-:-:-:- (Thanks TM) + 0.313: freebsd-2.2.6-release-:i386-:-:pentium-:- (Thanks Dave Walton) + 0.313: freebsd-3.0-release-:i386-:-:pentium.ii.(qtr-micr)-:- (Tx Erik Gault) + 0.313: irix-5.3-11091812-:-:-:ip22-:- (Thanks MF) + 0.313: irix64-6.4-02121744-:-:-:ip30-:- (Thanks MF) + 0.313: linux-2.0.32-:i386-:-:ppro-:- + 0.313: linux-2.0.35-:i386-:-:pentium-:- (Thanks crt@ice.degan.si) + 0.313: linux-2.0.36-:i386-:-:pentium-:- (Thanks FBR) + 0.313: linux-2.2.0-pre4-:i386-:-:i486-:- (Thanks Chris Van Meter) + 0.313: sunos-5.6-generic_105181-04-:sparc-:sun4-:sun4u-:sun4u- (Thanks SOH) + 0.313: sunos-5.6-generic_105181-08-:sparc-:sun4-:sun4u-:sun4u- (Thanks LBR) + 0.313: ultrix-4.3-0-:-:-:risc-:- (Thanks BW) + 0.314: amigaos-3.1-40.60-:-:-:m68k-:- (Thanks Kirk Strauser) + 0.314: freebsd-2.2.8-stable-:i386-:-:pentium.ii-:- + 0.314: linux-2.0.32-:i386-:-:ppro-:- + 0.32: bsd.os-4.0-:i386-:-:-:- (Thanks ME) + 0.32: freebsd-2.2.7-stable-:i386-:-:pentium.pro-:- (Thanks Chris Johnson) + 0.32: freebsd-3.0-release-:i386-:-:pentium.ii.(qtr-micr)-:- (Thanks MS) + 0.32: irix-5.3-11091812-:-:-:ip22-:- (Thanks MF) + 0.32: linux-2.0.34-:i386-:-:i486-:- (Thanks Benjamin T. Brillat) + 0.32: linux-2.0.34-:i386-:-:ppro-:- (Thanks Troy N. Poppe) + 0.32: linux-2.0.36-:i386-:-:pentium-:- (Thanks Peter J. Hunter) + 0.32: linux-2.0.36-:i386-:-:ppro-:- (Thanks FT) + 0.32: linux-2.2.0-pre4-:i386-:-:pentium-:- (Thanks FBR) + 0.32: linux-2.2.1-:i386-:-:pentium-:- (Thanks FBR) + 0.32: netbsd-1.3i-:i386-:-:intel.pentium.(p54c).(586-class)-:- (Thanks GC Wing) + 0.321: bsd.os-4.0-:i386-:-:pentium.ii-:- (Thanks RV Isaev) + 0.321: freebsd-3.1-release-:i386-:-:pentium.ii-:- (Thanks AR Buddhdev) + 0.321: freebsd-3.1-release-:i386-:-:pentium.ii/xeon/celeron-:- (Tx A Iijima) + 0.321: freebsd-3.1-stable-:i386-:-:pentium.ii/xeon/celeron-:- (Tx B Fuerst) + 0.321: linux-2.0.34-:i386-:-:pentium-:- (Thanks root@issaries.com.au) + 0.321: linux-2.0.36-:i386-:-:pentium-:- (Thanks MC Yoon) + 0.321: linux-2.0.36-:i386-:-:i486-:- (Thanks K Ralph) + 0.321: linux-2.0.36-:i386-:-:ppro-:- (Thanks JD Mitchell) + 0.321: linux-2.2.2-:i386-:-:pentium-:- (Thanks R Siemer) + 0.321: linux-2.2.4-:i386-:-:pentium-:- (Thanks JM Charette) + 0.321: linux-2.2.5-:i386-:-:ppro-:- (Thanks SM Moret) + 0.321: sunos-5.6-generic_105181-10-:sparc-:sun4-:sun4u-:sun4u- (Tx JA Marshall) + 0.322: aix-4-2-:-:-:000720704c00-:- (Thanks TF) + 0.322: linux-2.0.35-:i386-:-:i486-:- (Thanks Robert Siemer) + 0.322: linux-2.0.36-:i386-:-:i486-:- (Thanks Ryan C. Hughes) + 0.322: linux-2.0.36-:i386-:-:pentium-:- (Thanks Kengo Nakajima) + 0.322: linux-2.2.10-:i386-:-:pentium-:- (Thanks Peter Green) + 0.322: linux-2.0.36-:i386-:-:ppro-:- (Thanks Jeff Hill) + 0.322: linux-2.2.5-15-:i386-:-:pentium-:- (Thanks Raj H.) + 0.322: linux-2.2.5-15-:i386-:-:ppro-:- (Thanks peter@mail.gradwell.com) + 0.322: linux-2.2.5-:i386-:-:ppro-:- (Thanks Achim Gosse) + 0.322: linux-2.2.9-:i386-:-:pentium-:- (Thanks FBR) + 0.322: netbsd-1.4-:sparc-:-:mb86900/1a.or.l64801.@.25.mhz,.wtl3170/2.fpu-:- (Tx R Nurges) + 0.322: sunos-5.6-generic_105181-05-:sparc-:sun4-:sun4u-:sun4u- (Tx Ralf Weber) + 0.322: sunos-5.6-generic_105181-13-:sparc-:sun4-:sun4u-:sun4u- (Tx MN Boyiazis) + 0.322: sunos-5.7-generic-:sparc-:sun4-:sun4u-:sun4u- (Tx Paul Theodoropoulos) + 0.322: sunos-5.7-generic_106541-02-:sparc-:sun4-:sun4u-:sun4u- (Tx Bo Fussing) + 0.323: linux-2.0.36-:i386-:-:pentium-:- (TX RVI) + 0.323: linux-2.2.3-:i386-:-:pentium-:- (TX Ludovico Magocavallo) + 0.323: linux-2.2.7-:i386-:-:ppro-:- (TX Achim Gosse) + 0.324: bsd.os-4.0.1-:i386-:-:-:- (Tx Peeter Pirn) + 0.324: freebsd-3.3-stable-:i386-:-:pentium/p54c-:- (Tx J B Bell) + 0.324: freebsd-4.0-19990816-current-:i386-:-:pentium.ii/xeon/celeron-:- (Tx MS) + 0.324: irix-6.5-04151556-:-:-:ip22-:- (Tx Claudio Nieder) + 0.324: linux-2.0.36-:i386-:-:pentium-:- (Tx Michael P. McMillan) + 0.324: linux-2.0.38-:i386-:-:pentium-:- (Tx Anton V. Bobykin) + 0.324: linux-2.2.1-:-:-:armv4l-:- (Tx Jim Zajkowski) + 0.324: linux-2.2.12-20-:i386-:-:ppro-:- (Tx Michael D. Mooney) + 0.324: linux-2.2.12-:i386-:-:p2-:- (TX Oden Eriksson) + 0.324: linux-2.2.13-:i386-:-:pentium-:- (Tx Tibor Szentmarjay) + 0.324: linux-2.2.5-22-:alpha-:-:alpha-:- (Tx Steve J. Borho) + 0.324: linux-2.2.5-22-:i386-:-:ppro-:- (Tx Yann M. Aubert) + 0.324: linux-2.2.7-:i386-:-:ppro-:- (Tx Brad W. Baker) + 0.324: openbsd-2.5-generic#172-:openbsd.sparc-:-:sparc-:- (Tx Grant L Miller) + 0.324: openbsd-2.5-generic#243-:openbsd.i386-:-:i386-:- (Tx Grant L Miller) + 0.324: sunos-5.5-generic-:sparc-:sun4-:sun4c-:sun4c- (Tx D Andrew Reynhout) + 0.40: freebsd-3.3-release-:i386-:-:prentium.iii-:- (Tx MAS) + 0.40: linux-2.2.11-:i386-:-:pentium-:- (Tx FBR) + 0.40: linux-2.2.5-22-:i386-:-:ppro-:- [RH6.0] + 0.40: linux-2.2.13-:i386-:-:ppro-:- [Debian] (Tx MAS) + diff -crN ../ezmlm-0.53/TARGETS ./TARGETS *** ../ezmlm-0.53/TARGETS Wed Dec 31 18:00:00 1969 --- ./TARGETS Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,191 ---- + alloc.a + alloc.o + alloc_re.o + author.o + auto-ccld.sh + auto-str + auto-str.o + auto_bin.c + auto_bin.o + auto_cron.c + auto_cron.o + auto_qmail.c + auto_qmail.o + byte_chr.o + byte_copy.o + byte_cr.o + byte_diff.o + byte_rchr.o + byte_zero.o + case.a + case_diffb.o + case_diffs.o + case_lowerb.o + case_startb.o + case_starts.o + checktag.o + compile + concatHDR.o + constmap.o + cookie.o + copy.o + date2yyyymm.o + date822fmt.o + dateline.o + datetime.o + decodeB.o + decodeHDR.o + decodeQ.o + direntry.h + encodeB.o + encodeQ.o + env.a + env.o + envread.o + error.a + error.o + error_str.o + ezmlm-accept + ezmlm-archive + ezmlm-archive.o + ezmlm-cgi + ezmlm-cgi.o + ezmlm-check + ezmlm-clean + ezmlm-clean.o + ezmlm-cron + ezmlm-cron.o + ezmlm-gate + ezmlm-gate.o + ezmlm-get + ezmlm-get.o + ezmlm-glconf + ezmlm-idx + ezmlm-idx.o + ezmlm-issubn + ezmlm-issubn.o + ezmlm-limit + ezmlm-limit.o + ezmlm-list + ezmlm-list.o + ezmlm-make + ezmlm-make.o + ezmlm-manage + ezmlm-manage.o + ezmlm-moderate + ezmlm-moderate.o + ezmlm-reject + ezmlm-reject.o + ezmlm-request + ezmlm-request.o + ezmlm-return + ezmlm-return.o + ezmlm-send + ezmlm-send.o + ezmlm-split + ezmlm-split.o + ezmlm-store + ezmlm-store.o + ezmlm-sub + ezmlm-sub.o + ezmlm-test + ezmlm-tstdig + ezmlm-tstdig.o + ezmlm-unsub + ezmlm-unsub.o + ezmlm-warn + ezmlm-warn.o + ezmlm-weed + ezmlm-weed.o + ezmlmrc + fd.a + fd_copy.o + fd_move.o + find-systype + fmt_str.o + fmt_uint.o + fmt_uint0.o + fmt_ulong.o + fork.h + fs.a + getconf.o + getln.a + getln.o + getln2.o + getopt.a + hasflock.h + hassgact.h + idxthread.o + issub.o + load + lock.a + lock_ex.o + log.o + logmsg.o + make-compile + make-load + make-makelib + makehash.o + makelib + mime.a + now.o + open.a + open_append.o + open_read.o + open_trunc.o + opensql.o + putsubs.o + qmail.o + quote.o + scan_8long.o + scan_ulong.o + searchlog.o + seek.a + seek_set.o + sgetopt.o + sig.a + sig_catch.o + sig_pipe.o + slurp.o + slurpclose.o + str.a + str_chr.o + str_cpy.o + str_diff.o + str_diffn.o + str_len.o + str_rchr.o + str_start.o + stralloc.a + stralloc_arts.o + stralloc_cat.o + stralloc_catb.o + stralloc_cats.o + stralloc_copy.o + stralloc_eady.o + stralloc_opyb.o + stralloc_opys.o + stralloc_pend.o + strerr.a + strerr.o + strerr_die.o + strerr_sys.o + subdb.a + subfderr.o + subgetopt.o + subscribe.o + substdi.o + substdio.a + substdio.o + substdio_copy.o + substdo.o + surf.a + surf.o + surfpcs.o + systype + tagmsg.o + uint32.h + unfoldHDR.o + wait.a + wait_pid.o + yyyymm.a diff -crN ../ezmlm-0.53/UPGRADE.idx ./UPGRADE.idx *** ../ezmlm-0.53/UPGRADE.idx Wed Dec 31 18:00:00 1969 --- ./UPGRADE.idx Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,190 ---- + $Id: UPGRADE.idx,v 1.39 1999/12/19 16:47:30 lindberg Exp $ + $Name: ezmlm-idx-040 $ + + Like any other piece of software (and information generally), ezmlm-idx + comes with NO WARRANTY. + + This file is for upgrading from earlier version of ezmlm-idx/mod. If you use + ezmlm-0.53 but have not installed a previous version of ezmlm-idx, + see INSTALL.idx. For details on what's new in this version, see CHANGES.idx. + + 1. Proceed as per INSTALL.idx. + NOTE: If you follow the test instructions in INSTALL of ezmlm-0.53 after + adding ezmlm-idx, step 6 will fail. Before this step, edit + ~/testlist/editor and remove the ezmlm-reject line. + + + Steps required for upgrading from ezmlm-idx-0.31x/32x + ----------------------------------------------------- + In the unlikely event that you have lists that have been manually configured + to use ezmlm-gate (sender check/moderation combination) using only a single + directory, add the same directory to the command line a second time. If you + do not do this, all messages will be moderated, i.e. no major problem. No + other changes are required, but you may want to use some of the new features + (see CHANGES.idx). + + See below to migrate customized ezmlmrc files. + + Run ezmlm-idx on your lists. The index file format has changed. The old + format will still work, but only the new format can be used with WWW archive + access. + + To enable WWW archive access for your list(s) see the "Optional" section in + INSTALL.idx. + + If you used MySQL support, you need to update the tables. A few new fields + have been added for performance moitoring and billing. sub_mysql/to40x will + generate the necessary SQL. For each list, do: + + sh sub_mysql/to40x list | mysql ... + + where ``list'' is the tableroot for the list. + + Additional steps for upgrading from ezmlm-idx-0.30x + --------------------------------------------------- + + If your old lists use SENDER restriction on posts with aliases (DIR/extra) + and blacklisted addresses (DIR/blacklist) you need to change the name of + these directories to DIR/allow and DIR/deny, respectively, and rebuild the list + (see below). Without this change the list will still function normally, but + addresses cannot be added/removed from these addresses remotely (e.g. via + list-allow-subscribe). Other than this, your lists will function without + modifications if you are upgrading from ezmlm-idx>=0.30. + + See below for changing the names of the extra databases. + + + Additional steps for upgrading from ezmlm-idx<0.30 + -------------------------------------------------- + 1. Reindex the subject index for existing lists: + + % ezmlm-idx DIR + + for each list directory 'DIR'. + + 2. For existing digest lists, assuming the list "joe-sos" and the digest list + "joe-sos-digest". + + a. Remove links to the digest list: + + % rm -f ~joe/.qmail-sos-digest* + + b. edit the main list to include a digest list: + + % ezmlm-make -edxxx ~joe/SOS ~joe/.qmail joe-sos id.com gaga + + where 'xxx' are switches used in creating the original list. For lists + created with ezmlm-idx-0.23 or later, the arguments after the list + directory may be omitted. + + c. Move the digest subscriber info: + + % mv ~joe/SOS-digest/subscribers/* ~joe/SOS/digest/subscribers + + The digest list bounce info will be lost, as the key used for the new + digest is the same as for the list, and different for that from the old + digest. At worst, this will make the info for a digest user on missed + digests incomplete. It may also slightly delay the removal + of a permanently bouncing subscriber addresses. + + + Additional steps for upgrading from ezmlm-idx<0.23x + --------------------------------------------------- + For subscription-moderated lists created with ezmlm-idx<0.23: + + 1. If you have subscription moderated lists created with ezmlm-idx<0.23, + they likely lack dir/text/mod-sub-confirm and dir/text/mod-unsub-confirm. + Ezmlm-idx-0.23 substituted dir/text/(un)sub-confirm if the above files were + missing, but ezmlm-idx>=0.30 will not work without these files. Again, + ezmlm-make -e is the easiest way to update the list. Alternatively, + just copy dir/text/(un)sub-confirm to dir/text/mod-(un)sub-confirm. + + ------------------------------------------------------------------------------ + That's it! To report success (this helps to track platform-specific problems): + + % ( echo 'First M. Last'; cat `cat SYSDEPS` ) \ + | mail cfl-src@id.wustl.edu + + Replace First M. Last with your name. + + Send bugs reports, ideally with patch, to 'lindberg@id.wustl.edu'. + + + ------------------------------------------------------------------------------ + + + Additional information + ------------------------ + + Migrating customized ezmlmrc files + ================================== + + ezmlmrc is upgraded from ezmlm-idx-0.31x/32x, but the changes are not required + for using the list. + + The changes from ezmlm-0.30x are minimal, but fix a couple of bugs, see + CHANGES.idx). If you have custom ezmlmrc files and wish to update them, + do the following: + + First create a diff between the old ezmlmrc distribution and the + custom ezmlmrc file: + + % cp /usr/local/bin/ezmlm/ezmlmrc ~/ezmlmrc.orig + % cp ~/.ezmlmrc ~/ezmlmrc + % diff -c ~/ezmlmrc.orig ~/ezmlmrc ~/ezmlmrc.diff + + Next, apply the changes to the new ezmlmrc: + + % cp .../ezmlm-idx-0.33/ezmlmrc ~/ezmlmrc + % patch ~/ezmlmrc < ~/ezmlmrc.diff + + Next check for rejected parts (you need to apply them manually): + + % cat ~/ezmlmrc.rej + + Any existing list can be edited with 'ezmlm-make -e dir dot local host [code]' + with the appropriate switches to take advantage of new ezmlm functions. If + you make ezmlmrc files in other languages, please make them public domain and + mail them to lindberg@id.wustl.edu for inclusion in future versions of + ezmlm-idx. + + Adjusting the name of the extra databases (from ezmlm-idx<0.30): + =============================================================== + + % mv DIR/extra DIR/allow + % mv DIR/blacklist DIR/deny + % ezmlm-make -+ DIR + + Additional steps required when upgrading from ezmlm-idx<0.30: + + 1. Reindex the subject index for existing lists: + + % ezmlm-idx DIR + + for each list directory 'DIR'. + + 2. For existing digest lists, assuming the list "joe-sos" and the digest list + "joe-sos-digest". + + a. Remove links to the digest list: + + % rm -f ~joe/.qmail-sos-digest* + + b. edit the main list to include a digest list: + + % ezmlm-make -edxxx ~joe/SOS ~joe/.qmail joe-sos id.com gaga + + where 'xxx' are switches used in creating the original list. For lists + created with ezmlm-idx-0.23 or later, the arguments after the list + directory may be omitted. + + c. Move the digest subscriber info: + + % mv ~joe/SOS-digest/subscribers/* ~joe/SOS/digest/subscribers + + The digest list bounce info will be lost, as the key used for the new + digest is the same as for the list, and different for that from the old + digest. At worst, this will make the info for a digest user on missed + digests incomplete. It may also slightly delay the removal + of a permanently bouncing subscriber addresses. + diff -crN ../ezmlm-0.53/VERSION ./VERSION *** ../ezmlm-0.53/VERSION Sun Jun 29 22:11:54 1997 --- ./VERSION Fri Dec 21 12:17:35 2001 *************** *** 1 **** --- 1,2 ---- ezmlm 0.53 + $Name: ezmlm-idx-040 $ diff -crN ../ezmlm-0.53/author.c ./author.c *** ../ezmlm-0.53/author.c Wed Dec 31 18:00:00 1969 --- ./author.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,103 ---- + /*$Id: author.c,v 1.3 1999/09/29 03:11:44 lindberg Exp $*/ + /*$Name:*/ + + unsigned int author_name(char **sout,char *s,unsigned int l) + /* s is a string that contains a from: line argument\n. We parse */ + /* s as follows: If there is an unquoted '<' we eliminate everything after */ + /* it else if there is a unquoted ';' we eliminate everything after it. */ + /* Then, we eliminate LWSP and '"' from the beginning and end. Note that */ + /* this is not strict rfc822, but all we need is a display handle that */ + /* doesn't show the address. If in the remaining text there is a '@' we put*/ + /* in a '.' instead. Also, there are some non-rfc822 from lines out there */ + /* and we still want to maximize the chance of getting a handle, even if it*/ + /* costs a little extra work.*/ + { + int squote = 0; + int dquote = 0; + int level = 0; + int flagdone; + unsigned int len; + char ch; + char *cpfirst,*cp; + char *cpcomlast = 0; + char *cpquotlast = 0; + char *cpquot = 0; + char *cpcom = 0; + char *cplt = 0; + + if (!s || !l) { /* Yuck - pass the buck */ + *sout = s; + return 0; + } + cp = s; len = l; + + while (len--) { + ch = *(cp++); + if (squote) { + squote = 0; + continue; + } + if (ch == '\\') { + squote = 1; + continue; + } + if (ch == '"') { /* "name" */ + if (dquote) { + cpquotlast = cp - 2; + break; + } else { + cpquot = cp; + dquote = 1; + } + continue; + } else if (dquote) continue; + if (ch == '(') { + if (!level) cpcom = cp; + level++; + } else if (ch == ')') { + level--; + if (!level) + cpcomlast = cp - 2; /* address@host (name) */ + } else if (!level) { + if (ch == '<') { /* name */ + cplt = cp - 2; + break; + } else if (ch == ';') break; /* address@host ;garbage */ + } + } + if (cplt) { /* non-comment '<' */ + cp = cplt; + cpfirst = s; + } else if (cpquot && cpquotlast >= cpquot) { + cpfirst = cpquot; + cp = cpquotlast; + } else if (cpcom && cpcomlast >= cpcom) { + cpfirst = cpcom; + cp = cpcomlast; + } else { + cp = s + l - 1; + cpfirst = s; + } + flagdone = 0; + for (;;) { /* e.g. LWSP */ + while (cpfirst <= cp && + (*cpfirst == ' ' || *cpfirst == '\t' || *cpfirst == '<')) cpfirst++; + while (cp >= cpfirst && + (*cp == ' ' || *cp == '\t' || *cp == '\n' || *cp == '>')) cp--; + if (cp >= cpfirst || flagdone) + break; + cp = s + l - 1; + cpfirst = s; + flagdone = 1; + } + + *sout = cpfirst; + len = cp - cpfirst + 1; + while (cpfirst <= cp) { + if (*cpfirst == '@') + *cpfirst = '.'; + cpfirst++; + } + return len; + } + diff -crN ../ezmlm-0.53/auto_cron.h ./auto_cron.h *** ../ezmlm-0.53/auto_cron.h Wed Dec 31 18:00:00 1969 --- ./auto_cron.h Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,6 ---- + #ifndef AUTO_CRON_H + #define AUTO_CRON_H + + extern char auto_cron[]; + + #endif diff -crN ../ezmlm-0.53/case_diffs.c ./case_diffs.c *** ../ezmlm-0.53/case_diffs.c Wed Dec 31 18:00:00 1969 --- ./case_diffs.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,19 ---- + #include "case.h" + + int case_diffs(s,t) + register char *s; + register char *t; + { + register unsigned char x; + register unsigned char y; + + for (;;) { + x = *s++ - 'A'; + if (x <= 'Z' - 'A') x += 'a'; else x += 'A'; + y = *t++ - 'A'; + if (y <= 'Z' - 'A') y += 'a'; else y += 'A'; + if (x != y) break; + if (!x) break; + } + return ((int)(unsigned int) x) - ((int)(unsigned int) y); + } diff -crN ../ezmlm-0.53/case_starts.c ./case_starts.c *** ../ezmlm-0.53/case_starts.c Wed Dec 31 18:00:00 1969 --- ./case_starts.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,18 ---- + #include "case.h" + + int case_starts(s,t) + register char *s; + register char *t; + { + register unsigned char x; + register unsigned char y; + + for (;;) { + x = *s++ - 'A'; + if (x <= 'Z' - 'A') x += 'a'; else x += 'A'; + y = *t++ - 'A'; + if (y <= 'Z' - 'A') y += 'a'; else y += 'A'; + if (!y) return 1; + if (x != y) return 0; + } + } diff -crN ../ezmlm-0.53/checktag.c ./checktag.c *** ../ezmlm-0.53/checktag.c Wed Dec 31 18:00:00 1969 --- ./checktag.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,46 ---- + /*$Id: checktag.c,v 1.4 1999/10/12 23:38:36 lindberg Exp $*/ + /*$Name: ezmlm-idx-040 $*/ + #include "stralloc.h" + #include "scan.h" + #include "fmt.h" + #include "cookie.h" + #include "makehash.h" + #include "strerr.h" + #include "errtxt.h" + #include "subscribe.h" + + static stralloc key = {0}; + static stralloc line = {0}; + static stralloc quoted = {0}; + static char strnum[FMT_ULONG]; + static char newcookie[COOKIE]; + + char *checktag (dir,num,listno,action,seed,hash) + /* reads dir/sql. If not present, checks that the hash of seed matches */ + /* hash and returns success (NULL). If not match returns "". If error, */ + /* returns error string */ + + char *dir; /* the db base dir */ + unsigned long num; /* message number */ + unsigned long listno; /* bottom of range => slave */ + char *action; + char *seed; /* cookie base */ + char *hash; /* cookie */ + { + + if (!seed) return (char *) 0; /* no data - accept */ + + strnum[fmt_ulong(strnum,num)] = '\0'; /* message nr ->string*/ + + switch(slurp("key",&key,32)) { + case -1: + return ERR_READ_KEY; + case 0: + return ERR_NOEXIST_KEY; + } + + cookie(newcookie,key.s,key.len,strnum,seed,action); + if (byte_diff(hash,COOKIE,newcookie)) return ""; + else return (char *) 0; + + } diff -crN ../ezmlm-0.53/concatHDR.c ./concatHDR.c *** ../ezmlm-0.53/concatHDR.c Wed Dec 31 18:00:00 1969 --- ./concatHDR.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,45 ---- + /*$Id: */ + /*$Name: ezmlm-idx-040 $*/ + + #include "stralloc.h" + #include "strerr.h" + #include "case.h" + #include "byte.h" + #include "mime.h" + #include "errtxt.h" + + void concatHDR(indata,n,outdata,fatal) + char *indata; + unsigned int n; + stralloc *outdata; + char *fatal; + /* takes a concatenated string of line and continuation line, trims leading */ + /* and trailing LWSP and collapses line breaks and surrounding LWSP to ' '. */ + /* indata has to end in \n or \0 or this routine will write beyond indata! */ + /* if indata ends with \0, this will be changed to \n. */ + + { + register char *cp,*cpout; + char *cplast; + if (!stralloc_copys(outdata,"")) die_nomem(fatal); + if (!stralloc_ready(outdata,n)) die_nomem(fatal); + cpout = outdata->s; + if (n == 0) return; + cplast = indata + n - 1; + cp = cplast; + while (*cplast == '\0' || *cplast == '\n') --cplast; + if (cp == cplast) die_nomem(fatal); /* just in case */ + *(++cplast) = '\n'; /* have terminal '\n' */ + cp = indata; + while (cp <= cplast) { + while (*cp == ' ' || *cp == '\t') ++cp; /* LWSP before */ + while (*cp != '\n') *(cpout++) = *(cp++); /* text */ + ++cp; /* skip \n */ + --cpout; /* last char */ + while (*cpout == ' ' || *cpout == '\t') --cpout; /* LWSP after */ + *(++cpout) = ' '; /* replace with single ' ' */ + ++cpout; /* point to free byte */ + } + outdata->len = cpout - outdata->s; + } + diff -crN ../ezmlm-0.53/conf-cron ./conf-cron *** ../ezmlm-0.53/conf-cron Wed Dec 31 18:00:00 1969 --- ./conf-cron Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,3 ---- + /usr/bin + + This is the directory housing the crontab binary diff -crN ../ezmlm-0.53/conf-sqlcc ./conf-sqlcc *** ../ezmlm-0.53/conf-sqlcc Wed Dec 31 18:00:00 1969 --- ./conf-sqlcc Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,4 ---- + + + # the top line will be used when compiling. This version is for + # linking without mysql support. diff -crN ../ezmlm-0.53/conf-sqlld ./conf-sqlld *** ../ezmlm-0.53/conf-sqlld Wed Dec 31 18:00:00 1969 --- ./conf-sqlld Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,4 ---- + + + # the top line will be used when linking. This version is for + # linking without mysql support. diff -crN ../ezmlm-0.53/constmap.c ./constmap.c *** ../ezmlm-0.53/constmap.c Sun Jun 29 22:11:54 1997 --- ./constmap.c Fri Dec 21 12:17:35 2001 *************** *** 18,23 **** --- 18,56 ---- return h; } + /* Returns index of string in constmap. 1 = first string, 2 = second ... */ + /* 0 not found. Use for commands */ + int constmap_index(cm,s,len) + struct constmap *cm; + char *s; + int len; + { + constmap_hash h; + int pos; + h = hash(s,len); + pos = cm->first[h & cm->mask]; + while (pos != -1) { + if (h == cm->hash[pos]) + if (len == cm->inputlen[pos]) + if (!case_diffb(cm->input[pos],len,s)) + return pos + 1; + pos = cm->next[pos]; + } + return 0; + } + + /* returns pointer to sz of string with index "idx". 1 = first, 2 = second...*/ + char *constmap_get(cm,idx) + struct constmap *cm; + int idx; + + { + if (idx <= 0 || idx > cm->num) + return 0; + else + return cm->input[idx-1]; + } + char *constmap(cm,s,len) struct constmap *cm; char *s; *************** *** 38,43 **** --- 71,79 ---- } int constmap_init(cm,s,len,flagcolon) + /* if flagcolon is true, we process only the stuff before the colon on */ + /* each line. Otherwise, it's the entire line. Still, the entire line */ + /* is stored! */ struct constmap *cm; char *s; int len; diff -crN ../ezmlm-0.53/constmap.h ./constmap.h *** ../ezmlm-0.53/constmap.h Sun Jun 29 22:11:54 1997 --- ./constmap.h Fri Dec 21 12:17:35 2001 *************** *** 16,20 **** extern int constmap_init(); extern void constmap_free(); extern char *constmap(); ! #endif --- 16,21 ---- extern int constmap_init(); extern void constmap_free(); extern char *constmap(); ! extern char *constmap_get(); ! extern int constmap_index(); #endif diff -crN ../ezmlm-0.53/copy.c ./copy.c *** ../ezmlm-0.53/copy.c Wed Dec 31 18:00:00 1969 --- ./copy.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,211 ---- + /*$Id: copy.c,v 1.10 1999/08/07 19:28:16 lindberg Exp $*/ + /*$Name: ezmlm-idx-040 $*/ + + /* Copies a file relative the current directory and substitutes */ + /* !A at the beginning of a line for the target, */ + /* !R at the beginning of a line for the confirm reply address, */ + /* The following substitutions are also made. If not set, ????? */ + /* will be printed: <#l#> outlocal */ + /* will be printed: <#h#> outhost */ + /* will be printed: <#n#> outmsgnum */ + /* Other tags are killed, e.g. removed. A missing file is a */ + /* permanent error so owner finds out ASAP. May not have access to */ + /* maillog. Content transfer encoding is done for 'B' and 'Q'. For */ + /* 'H' no content transfer encoding is done, but blank lines are */ + /* suppressed. Behavior for other codes is undefined. This includes*/ + /* lower case 'q'/'b'! If code is 'H' substitution of target and */ + /* verptarget is prevented as it may create illegal headers. */ + + #include "stralloc.h" + #include "substdio.h" + #include "strerr.h" + #include "str.h" + #include "getln.h" + #include "case.h" + #include "readwrite.h" + #include "qmail.h" + #include "errtxt.h" + #include "error.h" + #include "quote.h" + #include "copy.h" + #include "mime.h" + /* for public setup functions only */ + #define FATAL "copy: fatal: " + + static stralloc line = {0}; + static stralloc outline = {0}; + static stralloc qline = {0}; + static stralloc outlocal = {0}; + static stralloc outhost = {0}; + static substdio sstext; + static char textbuf[256]; + static char *target = "?????"; + static char *verptarget = "?????"; + static char *confirm = "?????"; + static char *szmsgnum = "?????"; + + void set_cpoutlocal(ln) + stralloc *ln; + { /* must be quoted for safety. Note that substitutions that use */ + /* outlocal within an atom may create illegal addresses */ + if (!quote(&outlocal,ln)) + strerr_die2x(111,FATAL,ERR_NOMEM); + } + + void set_cpouthost(ln) + stralloc *ln; + { + if (!stralloc_copy(&outhost,ln)) + strerr_die2x(111,FATAL,ERR_NOMEM); + } + + void set_cptarget(tg) + char *tg; + { + target = tg; + } + + void set_cpverptarget(tg) + char *tg; + { + verptarget = tg; + } + + void set_cpconfirm(cf) + char *cf; + { + confirm = cf; + } + + void set_cpnum(cf) + char *cf; + { + szmsgnum = cf; + } + + static struct qmail *qq; + + static void codeput(l,n,code,fatal) + char *l; + unsigned int n; + char code; + char *fatal; + + { + if (!code || code == 'H') + qmail_put(qq,l,n); + else { + if (code == 'Q') + encodeQ(l,n,&qline,fatal); + else + encodeB(l,n,&qline,0,fatal); + qmail_put(qq,qline.s,qline.len); + } + } + + static void codeputs(l,code,fatal) + char *l; + char code; + char *fatal; + { + codeput(l,str_len(l),code,fatal); + } + + void copy(qqp,fn,q,fatal) + struct qmail *qqp; + char *fn; /* text file name */ + char q; /* = '\0' for regular output, 'B' for base64, */ + /* 'Q' for quoted printable,'H' for header */ + char *fatal; /* FATAL error string */ + + { + int fd; + int match, done; + unsigned int pos,nextpos; + + qq = qqp; + if ((fd = open_read(fn)) == -1) + if (errno != error_noent) + strerr_die4sys(111,fatal,ERR_OPEN,fn,": "); + else + strerr_die4sys(100,fatal,ERR_OPEN,fn,": "); + substdio_fdbuf(&sstext,read,fd,textbuf,sizeof(textbuf)); + for (;;) { + if (getln(&sstext,&line,&match,'\n') == -1) + strerr_die4sys(111,fatal,ERR_READ,fn,": "); + if (match) { /* suppress blank line for 'H'eader mode */ + if (line.len == 1 && q == 'H') continue; + if (line.s[0] == '!') { + if (line.s[1] == 'R') { + codeput(" ",3,q,fatal); + codeputs(confirm,q,fatal); + codeput("\n",1,q,fatal); + continue; + } + if (line.s[1] == 'A') { + codeput(" ",3,q,fatal); + codeputs(target,q,fatal); + codeput("\n",1,q,fatal); + continue; + } + } + /* Find tags <#x#>. Replace with for x=R confirm, for x=A */ + /* target, x=l outlocal, x=h outhost. For others, just */ + /* skip tag. If outlocal/outhost are not set, the tags are*/ + /* skipped. If confirm/taget are not set, the tags are */ + /* replaced by "???????" */ + pos = 0; + nextpos = 0; + done = 0; + outline.len = 0; /* zap outline */ + while ((pos += byte_chr(line.s+pos,line.len-pos,'<')) != line.len) { + if (pos + 4 < line.len && + line.s[pos+1] == '#' && + line.s[pos+3] == '#' && + line.s[pos+4] == '>') { /* tag. Copy first part of line */ + done = 1; /* did something */ + if (!stralloc_catb(&outline,line.s+nextpos,pos-nextpos)) + die_nomem(fatal); + switch(line.s[pos+2]) { + case 'A': + if (q == 'H') strerr_die(111,ERR_SUBST_UNSAFE); + if (!stralloc_cats(&outline,target)) die_nomem(fatal); + break; + case 'R': + if (!stralloc_cats(&outline,confirm)) die_nomem(fatal); + break; + case 'l': + if (!stralloc_cat(&outline,&outlocal)) die_nomem(fatal); + break; + case 'h': + if (!stralloc_cat(&outline,&outhost)) die_nomem(fatal); + break; + case 't': + if (q == 'H') strerr_die(111,ERR_SUBST_UNSAFE); + if (!stralloc_cats(&outline,verptarget)) die_nomem(fatal); + break; + case 'n': + if (!stralloc_cats(&outline,szmsgnum)) die_nomem(fatal); + break; + default: + break; /* unknown tags killed */ + } + pos += 5; + nextpos = pos; + } else + ++pos; /* try next position */ + } + if (!done) + codeput(line.s,line.len,q,fatal); + else { + if (!stralloc_catb(&outline,line.s+nextpos,line.len-nextpos)) + die_nomem(fatal); /* remainder */ + codeput(outline.s,outline.len,q,fatal); + } + + } else + break; + } + close(fd); + } + diff -crN ../ezmlm-0.53/copy.h ./copy.h *** ../ezmlm-0.53/copy.h Wed Dec 31 18:00:00 1969 --- ./copy.h Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,11 ---- + #ifndef COPY_H + #define COPY_H + + /* copy (qq,fn,fatal) */ + extern void copy(); + extern void set_cpoutlocal(); + extern void set_cpouthost(); + extern void set_cptarget(); + extern void set_cpconfirm(); + extern void set_cpnum(); + #endif diff -crN ../ezmlm-0.53/date2yyyymm.c ./date2yyyymm.c *** ../ezmlm-0.53/date2yyyymm.c Wed Dec 31 18:00:00 1969 --- ./date2yyyymm.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,71 ---- + + /*$Id: date2yyyymm.c,v 1.1 1999/10/09 16:45:43 lindberg Exp $*/ + /*$Name: ezmlm-idx-040 $*/ + #include "yyyymm.h" + + unsigned int date2yyyymm(s) + char *s; + /* expects a qmail date string s and returns yyyymm */ + /* if there are problems, it returns 0. If there is no terminating char */ + /* we may segfault if the syntax is bad. Assure that the ';' is there */ + /* or add '\0' */ + { + unsigned int mo; + unsigned int year; /* must hold yyyymm - ok to year 65K */ + char ch,ch1,ch2; + + /* jan feb mar apr may jun jul aug sep oct nov dec */ + /* - strictly qmail datefmt dependent*/ + for (;;s++) { + ch = *s; + if (ch != ' ' && (ch < '0' || ch > '9')) break; + } + mo = 0; + if (!(ch = *(s++))) return 0; + if (ch >= 'a') ch -= ('a' - 'A'); /* toupper */ + if (!(ch1 = *(s++))) return 0; /* rfc822 hrds are case-insens */ + if (ch1 >= 'a') ch1 -= ('a' - 'A'); + if (!(ch2 = *(s++))) return 0; + if (ch2 >= 'a') ch2 -= ('a' - 'A'); + + switch (ch) { + case 'J': + if (ch1 == 'A' && ch2 == 'N') { mo = 1; break; } + if (ch1 == 'U') { + if (ch2 == 'N') mo = 6; + else if (ch2 == 'L') mo = 7; + } + break; + case 'F': if (ch1 == 'E' && ch2 == 'B') mo = 2; break; + case 'A': + if (ch1 == 'P' && ch2 == 'R') mo = 4; + else if (ch1 == 'U' && ch2 == 'G') mo = 8; + break; + case 'M': + if (ch1 != 'A') break; + if (ch2 == 'R') mo = 3; + else if (ch2 == 'Y') mo = 5; + break; + case 'S': if (ch1 == 'E' && ch2 == 'P') mo = 9; break; + case 'O': if (ch1 == 'C' && ch2 == 'T') mo = 10; break; + case 'N': if (ch1 == 'O' && ch2 == 'V') mo = 11; break; + case 'D': if (ch1 == 'E' && ch2 == 'C') mo = 12; break; + default: + break; + } + if (!mo || *(s++) != ' ') + return 0L; /* mo true means s[0-2] valid */ + year = 0L; + for (;;) { + register unsigned char chy; + chy = (unsigned char) *(s++); + if (chy < '0' || chy > '9') { + if (year) break; + else return 0; + } + year = year * 10 + (chy - '0'); + } + return year * 100 + mo; + } + + diff -crN ../ezmlm-0.53/dateline.c ./dateline.c *** ../ezmlm-0.53/dateline.c Wed Dec 31 18:00:00 1969 --- ./dateline.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,41 ---- + /*$Id: dateline.c,v 1.2 1999/10/09 17:44:37 lindberg Exp $*/ + /*$Name: ezmlm-idx-040 $*/ + + #include "fmt.h" + #include "yyyymm.h" + #include "stralloc.h" + + static char strnum[FMT_ULONG]; + + int dateline(dt,d) + stralloc *dt; unsigned long d; + /* converts yyyymm from unsigned long d to text dt */ + { + char *mo; + switch (d % 100) { + case 1: mo = "January"; break; + case 2: mo = "February"; break; + case 3: mo = "March"; break; + case 4: mo = "April"; break; + case 5: mo = "May"; break; + case 6: mo = "June"; break; + case 7: mo = "July"; break; + case 8: mo = "August"; break; + case 9: mo = "September"; break; + case 10: mo = "October"; break; + case 11: mo = "November"; break; + case 12: mo = "December"; break; + case 0: mo = "????"; break; + default: cgierr("I don't know any month > 12", + "",""); + } + if (!stralloc_copys(dt,mo)) return -1; + if (!stralloc_cats(dt," ")) return -1; + if ((d/100)) { + if (!stralloc_catb(dt,strnum,fmt_ulong(strnum,d/100))) return -1; + } else + if (!stralloc_cats(dt,"????")) return 0; + return 1; + } + + diff -crN ../ezmlm-0.53/decodeB.c ./decodeB.c *** ../ezmlm-0.53/decodeB.c Wed Dec 31 18:00:00 1969 --- ./decodeB.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,71 ---- + #include "stralloc.h" + #include "strerr.h" + #include "uint32.h" + #include "errtxt.h" + + /* Characters and translation as per rfc2047. */ + static char char64table[128] = { + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, + 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, + 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, + -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, + 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 + }; + + #define char64enc(c) (((c) & 0x80) ? -1 : char64table[(c)]) + + static void die_nomem(fatal) + char *fatal; + { + strerr_die2x(111,fatal,ERR_NOMEM); + } + + void decodeB(cpfrom,n,outdata,fatal) + char *cpfrom; + unsigned int n; + stralloc *outdata; + char *fatal; + /* does B decoding of the string pointed to by cpfrom up to the character */ + /* before the one pointed to by cpnext, and appends the results to mimeline*/ + { + uint32 hold32; + char holdch[4] = "???"; + int i,j; + char c; /* needs to be signed */ + char *cp, *cpnext; + + cp = cpfrom; + cpnext = cp + n; + i = 0; + hold32 = 0L; + if (!stralloc_readyplus(outdata,n)) die_nomem(fatal); + for (;;) { + if (i == 4) { + for (j = 2; j >= 0; --j) { + holdch[j] = hold32 & 0xff; + hold32 = hold32 >> 8; + } + if (!stralloc_cats(outdata,holdch)) die_nomem(fatal); + if (cp >= cpnext) + break; + hold32 = 0L; + i = 0; + } + if (cp >= cpnext) { /* pad */ + c = 0; + } else { + c = char64enc(*cp); + ++cp; + } + if (c < 0) /* ignore illegal characters */ + continue; + else { + hold32 = (hold32 << 6) | (c & 0x7f); + ++i; + } + } + } + diff -crN ../ezmlm-0.53/decodeHDR.c ./decodeHDR.c *** ../ezmlm-0.53/decodeHDR.c Wed Dec 31 18:00:00 1969 --- ./decodeHDR.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,92 ---- + /*$Id: decodeHDR.c,v 1.2 1998/02/28 19:03:02 lindberg Exp $*/ + /*$Name: ezmlm-idx-040 $*/ + + #include "stralloc.h" + #include "strerr.h" + #include "error.h" + #include "case.h" + #include "byte.h" + #include "uint32.h" + #include "mime.h" + #include "errtxt.h" + + static void die_nomem(fatal) + char *fatal; + { + strerr_die2x(111,fatal,ERR_NOMEM); + } + + void decodeHDR(indata,n,outdata,charset,fatal) + char *indata; + unsigned int n; + stralloc *outdata; + char *charset; + char *fatal; + + /* decodes indata depending on charset. May put '\n' and '\0' into out */ + /* data and can take them as indata. */ + { + unsigned int pos; + char *cp,*cpnext,*cpstart,*cpenc,*cptxt,*cpend,*cpafter; + + cpnext = indata; + cpafter = cpnext + n; + cpstart = cpnext; + if (!stralloc_copys(outdata,"")) die_nomem(fatal); + if (!stralloc_ready(outdata,n)) die_nomem(fatal); + for (;;) { + cpstart = cpstart + byte_chr(cpstart,cpafter-cpstart,'='); + if (cpstart == cpafter) + break; + ++cpstart; + if (*cpstart != '?') + continue; + ++cpstart; + cpenc = cpstart + byte_chr(cpstart,cpafter-cpstart,'?'); + if (cpenc == cpafter) + continue; + cpenc++; + cptxt = cpenc + byte_chr(cpenc,cpafter-cpenc,'?'); + if (cptxt == cpafter) + continue; + cptxt++; + cpend = cptxt + byte_chr(cptxt,cpafter-cptxt,'?'); + if (cpend == cpafter || *(cpend + 1) != '=') + continue; + /* We'll decode anything. On lists with many charsets, this may */ + /* result in unreadable subjects, but that's the case even if */ + /* no decoding is done. This way, the subject will be optimal */ + /* for threading, but charset info is lost. We aim to correctly */ + /* decode us-ascii and all iso-8859/2022 charsets. Exacly how */ + /* these will be displayed depends on dir/charset. */ + cp = cpnext; + /* scrap lwsp between coded strings */ + while (*cp == ' ' || *cp == '\t') + cp++; + if (cp != cpstart - 2) + if (!stralloc_catb(outdata,cpnext, cpstart - cpnext - 2)) + die_nomem(fatal); + cpnext = cp + 1; + cpstart = cpnext; + switch (*cpenc) { + case 'b': + case 'B': + pos = outdata->len; + decodeB(cptxt,cpend-cptxt,outdata,2,fatal); + cpnext = cpend + 2; + cpstart = cpnext; + break; + case 'q': + case 'Q': + decodeQ(cptxt,cpend-cptxt,outdata,fatal); + cpnext = cpend + 2; + cpstart = cpnext; + break; + default: /* shouldn't happen, but let's be reasonable */ + cpstart = cpend + 2; + break; + } + } + if (!stralloc_catb(outdata,cpnext,indata-cpnext+n)) die_nomem(fatal); + } + diff -crN ../ezmlm-0.53/decodeQ.c ./decodeQ.c *** ../ezmlm-0.53/decodeQ.c Wed Dec 31 18:00:00 1969 --- ./decodeQ.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,77 ---- + /*$Id: decodeQ.c,v 1.3 1998/10/29 21:48:24 lindberg Exp $*/ + /*$Name: ezmlm-idx-040 $*/ + + #include "stralloc.h" + #include "strerr.h" + #include "errtxt.h" + #include "mime.h" + + /* takes a string pointed to by cpfrom and adds the next 'n' bytes to */ + /* outdata, replacing any Quoted-Printable codes with the real characters. */ + /* NUL and LF in the input are allowed, but anything that decodes to these */ + /* values is ignored. */ + + static char char16table[128] = { + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1, -1,-1,-1,-1, + -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1, + -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1 + }; + + #define char16enc(c) (((c) & 0x80) ? -1 : char16table[(c)]) + + static void die_nomem(fatal) + char *fatal; + { + strerr_die2x(111,fatal,ERR_NOMEM); + } + + void decodeQ(cpfrom,n,outdata,fatal) + char *cpfrom; + unsigned int n; + stralloc *outdata; + char *fatal; + /* does Q decoding of the string pointed to by cpfrom up to the character */ + /* before the one pointed to by cpnext, and appends the results to mimeline*/ + { + char *cp,*cpnext,*cpmore; + char holdch[2]; + char ch1,ch2; /* need to be signed */ + + cpmore = cpfrom; + cp = cpfrom; + cpnext = cp + n; + if (!stralloc_readyplus(outdata,n)) die_nomem(fatal); + + while (cp < cpnext) { + if (*cp == '_') *cp = ' '; /* '_' -> space */ + else if (*cp == '=') { /* "=F8" -> '\xF8' */ + /* copy stuff before */ + if (!stralloc_catb(outdata,cpmore,cp-cpmore)) die_nomem(fatal); + cpmore = cp; + ++cp; + if (*cp == '\n') { /* skip soft line break */ + ++cp; + cpmore = cp; + continue; + } + ch1 = char16enc(*cp); + if (++cp >= cpnext) + break; + ch2 = char16enc(*cp); + if (ch1 >= 0 && ch2 >= 0) { /* ignore illegals */ + holdch[0] = (ch1 << 4 | ch2) & 0xff; + if (!stralloc_catb(outdata,holdch,1)) die_nomem(fatal); + cpmore += 3; + } + } + ++cp; + } /* copy stuff after */ + if (!stralloc_catb(outdata,cpmore,cpnext-cpmore)) die_nomem(fatal); + } + + diff -crN ../ezmlm-0.53/encodeB.c ./encodeB.c *** ../ezmlm-0.53/encodeB.c Wed Dec 31 18:00:00 1969 --- ./encodeB.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,99 ---- + /* $Id: encodeB.c,v 1.3 1998/03/21 18:30:27 lindberg Exp $*/ + /* $Name: ezmlm-idx-040 $*/ + + #include "stralloc.h" + #include "uint32.h" + #include "mime.h" + #include "strerr.h" + #include "errtxt.h" + + static void die_nomem(fatal) + char *fatal; + { + strerr_die2x(111,fatal,ERR_NOMEM); + } + + static unsigned char base64char[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + static unsigned int pos = 0; + static unsigned int i = 0; + static uint32 hold32; + static unsigned char *cpout; + + static void addone(ch) + unsigned char ch; + { + if (!(pos++)) + hold32 = (uint32) ch; + else + hold32 = (hold32 << 8) | ch; + if (pos == 3) { + *cpout++ = base64char[(hold32 >> 18) & 0x3f]; + *cpout++ = base64char[(hold32 >> 12) & 0x3f]; + *cpout++ = base64char[(hold32 >> 6) & 0x3f]; + *cpout++ = base64char[hold32 & 0x3f]; + if (++i == 18) { + *cpout++ = '\n'; + i = 0; + } + pos = 0; + } + } + + static void dorest() + { + switch (pos) { + case 2: + hold32 = hold32 << 2; + *cpout++ = base64char[(hold32 >> 12) & 0x3f]; + *cpout++ = base64char[(hold32 >> 06) & 0x3f]; + *cpout++ = base64char[hold32 & 0x3f]; + *cpout++ = '='; + break; + case 1: + hold32 = hold32 << 4; + *cpout++ = base64char[(hold32 >> 06) & 0x3f]; + *cpout++ = base64char[hold32 & 0x3f]; + *cpout++ = '='; + *cpout++ = '='; + break; + default: + break; + } + *cpout++ = '\n'; + } + + void encodeB(indata,n,outdata,control,fatal) + unsigned char *indata; + unsigned int n; + stralloc *outdata; + int control; /* 1 = init, 2 = flush */ + char *fatal; + /* converts any character with the high order bit set to */ + /* base64. In: n chars of indata, out: stralloc outdata */ + /* as '=' is not allowed within the block, we cannot flush after */ + /* each line, so we carry over data from call to call. The last */ + /* call to encodeB should have control = 2 to do the flushing. */ + /* control = 0 resets, and the routine starts out reset. */ + { + register unsigned char ch; + + if (control == 1) { + pos = 0; + i = 0; + } + if (!stralloc_copys(outdata,"")) die_nomem(fatal); + if (!stralloc_ready(outdata,n*8/3 + n/72 + 5)) die_nomem(fatal); + cpout = (unsigned char *) outdata->s; + while (n--) { + ch = *indata++; + if (ch == '\n') + addone('\r'); + addone(ch); + } + if (control == 2) + dorest(); + outdata->len = (unsigned int) (cpout - (unsigned char *) outdata->s); + } + diff -crN ../ezmlm-0.53/encodeQ.c ./encodeQ.c *** ../ezmlm-0.53/encodeQ.c Wed Dec 31 18:00:00 1969 --- ./encodeQ.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,58 ---- + /* $Id: encodeQ.c,v 1.2 1998/02/28 19:03:02 lindberg Exp $*/ + /* $Name: ezmlm-idx-040 $*/ + + #include "errtxt.h" + #include "mime.h" + #include "stralloc.h" + #include "strerr.h" + + static void die_nomem(fatal) + char *fatal; + { + strerr_die2x(111,fatal,ERR_NOMEM); + } + + static char *hexchar = "0123456789ABCDEF"; + + void encodeQ(indata,n,outdata,fatal) + char *indata; + unsigned int n; + stralloc *outdata; + char *fatal; + + /* converts any character with the high order bit set to */ + /* quoted printable. In: n chars of indata, out: stralloc outdata*/ + + { + register char *cpout; + register char ch; + unsigned int i; + char *cpin; + + cpin = indata; + i = 0; + /* max 3 outchars per inchar & 2 char newline per 72 chars */ + if (!stralloc_copys(outdata,"")) die_nomem(fatal); + if (!stralloc_ready(outdata,n * 3 + n/36)) die_nomem(fatal); /* worst case */ + cpout = outdata->s; + while (n--) { + ch = *cpin++; + if (ch != ' ' && ch != '\n' && ch != '\t' && + (ch > 126 || ch < 33 || ch == 61)) { + *(cpout++) = '='; + *(cpout++) = hexchar[(ch >> 4) & 0xf]; + *(cpout++) = hexchar[ch & 0xf]; + i += 3; + } else { + if (ch == '\n') + i = 0; + *(cpout++) = ch; + } + if (i >= 72) { + *(cpout++) = '='; + *(cpout++) = '\n'; + i = 0; + } + } + outdata->len = (unsigned int) (cpout - outdata->s); + } diff -crN ../ezmlm-0.53/env.c ./env.c *** ../ezmlm-0.53/env.c Wed Dec 31 18:00:00 1969 --- ./env.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,113 ---- + /* env.c, envread.c, env.h: environ library + Daniel J. Bernstein, djb@silverton.berkeley.edu. + Depends on str.h, alloc.h. + Requires environ. + 19960113: rewrite. warning: interface is different. + No known patent problems. + */ + + #include "str.h" + #include "alloc.h" + #include "env.h" + + int env_isinit = 0; /* if env_isinit: */ + static int ea; /* environ is a pointer to ea+1 char*'s. */ + static int en; /* the first en of those are ALLOCATED. environ[en] is 0. */ + + static void env_goodbye(i) int i; + { + alloc_free(environ[i]); + environ[i] = environ[--en]; + environ[en] = 0; + } + + static char *null = 0; + + void env_clear() + { + if (env_isinit) while (en) env_goodbye(0); + else environ = &null; + } + + static void env_unsetlen(s,len) char *s; int len; + { + int i; + for (i = en - 1;i >= 0;--i) + if (!str_diffn(s,environ[i],len)) + if (environ[i][len] == '=') + env_goodbye(i); + } + + int env_unset(s) char *s; + { + if (!env_isinit) if (!env_init()) return 0; + env_unsetlen(s,str_len(s)); + return 1; + } + + static int env_add(s) char *s; + { + char *t; + t = env_findeq(s); + if (t) env_unsetlen(s,t - s); + if (en == ea) + { + ea += 30; + if (!alloc_re(&environ,(en + 1) * sizeof(char *),(ea + 1) * sizeof(char *))) + { ea = en; return 0; } + } + environ[en++] = s; + environ[en] = 0; + return 1; + } + + int env_put(s) char *s; + { + char *u; + if (!env_isinit) if (!env_init()) return 0; + u = alloc(str_len(s) + 1); + if (!u) return 0; + str_copy(u,s); + if (!env_add(u)) { alloc_free(u); return 0; } + return 1; + } + + int env_put2(s,t) char *s; char *t; + { + char *u; + int slen; + if (!env_isinit) if (!env_init()) return 0; + slen = str_len(s); + u = alloc(slen + str_len(t) + 2); + if (!u) return 0; + str_copy(u,s); + u[slen] = '='; + str_copy(u + slen + 1,t); + if (!env_add(u)) { alloc_free(u); return 0; } + return 1; + } + + int env_init() + { + char **newenviron; + int i; + for (en = 0;environ[en];++en) ; + ea = en + 10; + newenviron = (char **) alloc((ea + 1) * sizeof(char *)); + if (!newenviron) return 0; + for (en = 0;environ[en];++en) + { + newenviron[en] = alloc(str_len(environ[en]) + 1); + if (!newenviron[en]) + { + for (i = 0;i < en;++i) alloc_free(newenviron[i]); + alloc_free(newenviron); + return 0; + } + str_copy(newenviron[en],environ[en]); + } + newenviron[en] = 0; + environ = newenviron; + env_isinit = 1; + return 1; + } diff -crN ../ezmlm-0.53/error.c ./error.c *** ../ezmlm-0.53/error.c Sun Jun 29 22:11:54 1997 --- ./error.c Fri Dec 21 12:17:35 2001 *************** *** 17,23 **** -2; #endif ! int error_noent = #ifdef ENOENT ENOENT; #else --- 17,23 ---- -2; #endif ! int error_noent = #ifdef ENOENT ENOENT; #else *************** *** 92,95 **** --- 92,102 ---- EACCES; #else -13; + #endif + + int error_notdir = + #ifdef ENOTDIR + ENOTDIR; + #else + -14; #endif diff -crN ../ezmlm-0.53/error.h ./error.h *** ../ezmlm-0.53/error.h Sun Jun 29 22:11:54 1997 --- ./error.h Fri Dec 21 12:17:35 2001 *************** *** 16,21 **** --- 16,22 ---- extern int error_pipe; extern int error_perm; extern int error_acces; + extern int error_notdir; extern char *error_str(); extern int error_temp(); diff -crN ../ezmlm-0.53/errtxt.h ./errtxt.h *** ../ezmlm-0.53/errtxt.h Wed Dec 31 18:00:00 1969 --- ./errtxt.h Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,156 ---- + /*$Id: errtxt.h,v 1.46 1999/11/29 04:54:01 lindberg Exp $*/ + /*Name: $*/ + + #ifndef ERRTXT_H + #define ERRTXT_H + + /* Error messages. If you translate these, I would urge you to keep the */ + /* English version as well. I'm happy to include any bilingual versions */ + /* of this file with future versions of ezmlm-idx. */ + + #define ERR_NOMEM "out of memory" + #define ERR_NOCMD "command not available" + #define ERR_CLOSE "unable to close " + #define ERR_WRITE "unable to write " + #define ERR_READ "unable to read " + #define ERR_READ_KEY "unable to read key" + #define ERR_FLUSH "unable to flush " + #define ERR_SEEK "unalble to seek " + #define ERR_SYNC "unable to sync " + #define ERR_CHMOD "unable to chmod " + #define ERR_STAT "unable to stat " + #define ERR_DELETE "unable to delete " + #define ERR_READ_INPUT "unable to read input: " + #define ERR_SEEK_INPUT "unable to seek input: " + #define ERR_CREATE "unable to create " + #define ERR_MOVE "unable to move " + #define ERR_OPEN "unable to open " + #define ERR_OBTAIN "unable to obtain " + #define ERR_OPEN_LOCK "unable to open lock: " + #define ERR_OBTAIN_LOCK "unable to obtain lock: " + #define ERR_NOLOCAL "LOCAL not set" + #define ERR_NODTLINE "DTLINE not set" + #define ERR_NOSENDER "SENDER not set" + #define ERR_NOHOST "HOST not set" + #define ERR_NOEXIST " does not exist" + #define ERR_NOEXIST_KEY " key does not exist" + #define ERR_SWITCH "unable to switch to " + #define ERR_BOUNCE "I do not reply to bounce messages (#5.7.2)" + #define ERR_ANONYMOUS "I do not reply to senders without host names (#5.7.2)" + #define ERR_NOT_PUBLIC "Sorry, I've been told to reject all requests (#5.7.2)" + #define ERR_NOT_ARCHIVED "Sorry, this list is not archived (#5.1.1)" + #define ERR_NOT_INDEXED "Sorry, this list is not indexed (#5.1.1)" + #define ERR_NOT_AVAILABLE "Command not available (#5.1.1)" + #define ERR_NOT_ALLOWED "Command allowed only to moderators (#5.7.1)" + #define ERR_BAD_ADDRESS "I don't accept messages at this address (inlocal and/or inhost don't match) (#5.1.1)" + #define ERR_BAD_RETURN_ADDRESS "Invalid bounce or receipt address format (#5.1.1)" + #define ERR_BAD_REQUEST "Illegal request format (#5.7.1)" + #define ERR_QMAIL_QUEUE "unable to run qmail-queue: " + #define ERR_TMP_QMAIL_QUEUE "temporary qmail-queue error: " + #define ERR_NOT_PARENT "this message is not from my parent list (#5.7.2)" + #define ERR_SUBLIST "sublist messages must have a Mailing-List header (#5.7.2)" + #define ERR_MAILING_LIST "message already has a Mailing-List header (maybe I should be a sublist) (#5.7.2)" + #define ERR_LOOPING "this message is looping: it already has my Delivered-To line (#5.4.6)" + #define ERR_SUBSCRIBER_CAN "only subscribers can " + #define ERR_571 " (#5.7.1)" + #define ERR_EMPTY_DIGEST "nothing to digest" + #define ERR_EMPTY_LIST "no messages in archive" + #define ERR_NOINDEX "Sorry, I can't find the index for this message" + #define ERR_BAD_INDEX "Old format or corrupted index. Run ezmlm-idx! (#5.3.0)" + #define ERR_BAD_DIGCODE "incorrect digest code (#5.7.1)" + #define ERR_UNEXPECTED "program logic error (#5.3.0)" + #define ERR_BAD_ALL "Sorry, after removing unacceptable MIME parts from your message I was left with nothing (#5.7.0)" + #define ERR_MIME_QUOTE "MIME boundary lacks end quote" + #define ERR_SUBST_UNSAFE "Sorry, substitution of target addresses into headers with <#A#> or <#T#> is unsafe and not permitted." + + /* ezmlm-request unique */ + #define ERR_REQ_LISTNAME "This command requires a mailing list name (#5.1.1)" + #define ERR_REQ_LOCAL "the local part of the command string does not match this list (#5.1.1)" + + /* ezmlm-reject unique */ + #define ERR_MAX_SIZE "Sorry, I don't accept messages larger than " + #define ERR_MIN_SIZE "Sorry, I don't accept messages shorter than " + #define ERR_SIZE_CODE " (#5.2.3)" + #define ERR_NO_ADDRESS "List address must be in To: or Cc: (#5.7.0)" + #define ERR_NO_SUBJECT "Sorry, I don't accept message with empty Subject (#5.7.0)" + #define ERR_SUBCOMMAND "Sorry, I don't accept commands in the subject line. Please send a message to the -help address shown in the the ``Mailing-List:'' header for command info (#5.7.0)" + #define ERR_BODYCOMMAND "Sorry, as the message starts with ``[un]subscribe'' it looks like an adminstrative request. Please send a message to the -help address shown in the ``Mailing-List:'' header for [un]subscribe info (#5.7.0)" + #define ERR_BAD_TYPE "Sorry, I don't accept messages of MIME Content-Type '" + #define ERR_BAD_PART "Sorry, a message part has an unacceptable MIME Content-Type: " + #define ERR_JUNK "Precedence: junk - message ignored" + + /* ezmlm-manage unique */ + #define ERR_SUB_NOP "target is already a subscriber" + #define ERR_UNSUB_NOP "target is not a subscriber" + #define ERR_BAD_NAME "only letters and underscore allowed in file name (#5.6.0)" + #define ERR_NO_MARK "missing start-of-text or end-of-text mark (#5.6.0)" + #define ERR_EDSIZE "Maximum edit file size exceeded (#5.6.0)" + #define ERR_BAD_CHAR "NUL or other illegal character in input (#5.6.0)" + #define ERR_EXTRA_SUB "Processed SENDER check addition request for: " + #define ERR_EXTRA_UNSUB "Processed SENDER check removal request for: " + + + /* ezmlm-moderation functions unique */ + #define ERR_MOD_TIMEOUT "I'm sorry, I no longer have this message" + #define ERR_MOD_ACCEPTED "I'm sorry, I've already accepted this message" + #define ERR_MOD_REJECTED "I'm sorry, I've already rejected this message" + #define ERR_MOD_COOKIE "Illegal or outdated moderator request (#5.7.1)" + #define ERR_FORK "unable to fork: " + #define ERR_EXECUTE "unable to execute " + #define ERR_CHILD_CRASHED "child crashed" + #define ERR_CHILD_FATAL "fatal error from child" + #define ERR_CHILD_TEMP "temporary error from child" + #define ERR_CHILD_UNKNOWN "unknown error from child" + #define ERR_UNIQUE "unable to create unique message file name" + #define ERR_NO_POST "I'm sorry, you are not allowed to post messages to this list (#5.7.2)" + + /* ezmlm-make unique */ + #define ERR_VERSION "ezmlmrc version mismatch. Behavior may not match docs." + #define ERR_ENDTAG "tag lacks /> end marker: " + #define ERR_LINKDIR "linktag lacks /dir: " + #define ERR_FILENAME "continuation tag without defined file name: " + #define ERR_PERIOD "periods not allowed in tags: " + #define ERR_SLASH "dir and dot must start with slash" + #define ERR_NEWLINE "newlines not allowed in dir" + #define ERR_QUOTE "quotes not allowed in dir" + #define ERR_SYNTAX " syntax error: " + + /* ezmlm-limit unique */ + #define ERR_EXCESS_MOD "excess traffic: moderating" + #define ERR_EXCESS_DEFER "excess traffic: deferring" + + /* ezmlm-cron unique */ + #define ERR_SAME_HOST "list and digest must be on same host" + #define ERR_DOW "single comma-separated digits only for day-of-week" + #define ERR_NOT_CLEAN "Bad character in address components" + #define ERR_SUID "Sorry, I won't run as root" + #define ERR_UID "user id not found" + #define ERR_EUID "effective user id not found" + #define ERR_BADUSER "user not allowed" + #define ERR_BADHOST "list host not allowed" + #define ERR_BADLOCAL "list local not allowed" + #define ERR_LISTNO "max number of list entries exceeded" + #define ERR_NO_MATCH "no matching entry found" + #define ERR_SETUID "unable to set uid: " + #define ERR_CFHOST "bounce-host required on first line of " + #define ERR_EXCLUSIVE "action-controlling switches are mutually exclusive" + #define ERR_CRONTAB "crontab update failed. Contact you sysadmin with the above error information" + + /* ezmlm-gate */ + #define ERR_REJECT "Sorry, I've been told to reject this message (#5.7.0)" + + /* issub/subscribe ... */ + #define ERR_ADDR_AT "address does not contain @" + #define ERR_ADDR_LONG "address is too long" + #define ERR_ADDR_NL "address contains newline" + + /* sql */ + #define ERR_COOKIE "message does not have valid authentication token" + #define ERR_NOT_ACTIVE "this sublist is not active" + #define ERR_PARSE "unable to parse " + #define ERR_DONE "message already successfully processed by this list" + #define ERR_MAX_BOUNCE "max bounces exceeded: bounce will not be saved" + #define ERR_NO_TABLE "no table specified in database connect data" + + #endif + diff -crN ../ezmlm-0.53/ezcgi.css ./ezcgi.css *** ../ezmlm-0.53/ezcgi.css Wed Dec 31 18:00:00 1969 --- ./ezcgi.css Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,24 ---- + BODY { background-color: #ffffe0; margin-left: 5%; margin-right: 5% } + + a:link { color: black } + a:active { color: black } + + H1 { color: red; font-size: 200% ; text-align: center} + H2 { color: green; font-size: 150%; text-align: left } + + HR { border: medium; color: #00426B } + + DIV.idx { margin-left: 5%; margin-right: 5% } + a.alk { color: green; font-style: italic } + + LI.subjbody { margin-left: 15% } + LI.authbody { margin-left: 10% } + + DIV.rfc822hdr { text-align: left; font-size: 100% } + EM.rfc822hdr { font-weight: bold; font-family: arial, sans-serif } + SPAN.subject { font-weight: bold; font-size: 150% } + a.relk { color: red } + + DIV.copyright { font-size: 50%; text-align: right } + + diff -crN ../ezmlm-0.53/ezcgirc ./ezcgirc *** ../ezmlm-0.53/ezcgirc Wed Dec 31 18:00:00 1969 --- ./ezcgirc Fri Dec 24 14:15:00 1999 *************** *** 0 **** --- 1,15 ---- + # listno;[-]UID;DIR;[-]listaddr;button[,button ...];style;banner + + # Default list. "alias" UID=7771. One extra button pointing to my home page ;-) + 0;7771;/var/qmail/alias/QMAIL;qmail@id.wustl.edu;[Home]=http://id.wustl.edu/~lindberg + + # the real qmail archive. Because of '-' before the list name, the from + # address is not shown, only the associated "handle". More buttons here. + 1;7771;/var/qmail/alias/QMAIL;-qmail@id.wustl.edu;[Home]=http://id.wustl.edu/~lindberg,[qmail.org]=http://www.qmail.org,[djb]=http://www.pobox.com/~djb/qmail.html + + # This is another alias list. The '-' before the 7771 suppresses the chroot(), + # which is needed since banner program "./niles" uses /bin/sh, cat, etc. The + # style sheet is specified as well. Blank lines are ok, but all chars on config + # lines are significant. + 2;-7771;/var/qmail/alias/SAMBA;samba@id.wustl.edu;[Home]=http://id.wustl.edu/~lindberg;iso-8859-1;/ezcgi.css;./niles + diff -crN ../ezmlm-0.53/ezmlm-accept.1 ./ezmlm-accept.1 *** ../ezmlm-0.53/ezmlm-accept.1 Wed Dec 31 18:00:00 1969 --- ./ezmlm-accept.1 Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,30 ---- + .TH ezmlm-accept 1 + .SH NAME + ezmlm-accept \- accept messages in moderation queue + .SH SYNOPSIS + .B ezmlm-accept + .I dir + .I file + [ + .I file1 ... + ] + .SH DESCRIPTION + .B ezmlm-accept + copies + .IR file , + .IR file1 ,\ ... + to + .B ezmlm-send + .IR dir . + .B ezmlm-accept + removes each file that was successfully processed by + .BR ezmlm-send . + + This can be used to manually ``accept'' messages in a + .I ezmlm + moderation queue. + .SH "SEE ALSO" + ezmlm(5), + ezmlm-moderate(1), + ezmlm-send(1), + ezmlm-store(1) diff -crN ../ezmlm-0.53/ezmlm-accept.sh ./ezmlm-accept.sh *** ../ezmlm-0.53/ezmlm-accept.sh Wed Dec 31 18:00:00 1969 --- ./ezmlm-accept.sh Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,30 ---- + # [should have a bin/sh line and EZPATH added above by make] + # + # script to accept files in DIR/mod/pending. Use as: + # ezmlm-accept DIR file1 [file2 ...] + # where ``DIR'' is the list directory and ``file1'' is a file to be + # accepted. ``ezmlm-accept DIR DIR/mod/pending/*'' will accept all + # pending files. Files that are successfully sent to the list are + # deled. See man page for details. + + EZSEND="${EZPATH}/ezmlm-send" + FATAL='ezmlm-accept: fatal:' + if [ ! -x "$EZSEND" ]; then + echo "$FATAL please edit script to the correct ezmlm-send path" + exit 100; + fi + + DIR="$1" + + if [ -z "$1" ] || [ -z "$2" ]; then + echo "$FATAL usage: ezmlm-accept DIR file1 [file2 ...]" + exit 100; + fi + + while [ -n "$2" ]; do + if [ -x "$2" ]; then + $EZSEND $DIR < "$2" && rm -f "$2" + fi + shift + done + exit 0; diff -crN ../ezmlm-0.53/ezmlm-archive.1 ./ezmlm-archive.1 *** ../ezmlm-0.53/ezmlm-archive.1 Wed Dec 31 18:00:00 1969 --- ./ezmlm-archive.1 Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,178 ---- + .TH ezmlm-archive 1 + .SH NAME + ezmlm-archive \- create thread and author index for a mailing list archive + .SH SYNOPSIS + .B ezmlm-archive + [ + .B \-cCFTvV + ][ + .B \-f\fI msg1 + ] + ][ + .B \-t\fI msg2 + ] + .I dir + .SH DESCRIPTION + .B ezmlm-archive + reads the index files from a message archive, and creates a subject index, a + collection of subject files, and a collection of author files. These + files are suitable as an index for WWW access to, and navigation through + a mailing list archive by + .BR ezmlm-cgi(1) . + + The index files read are created by + .B ezmlm-idx(1) + on a per-list basis and by + .B ezmlm-send(1) + on a per-message archive for a indexed list. + + The output files created are: + .TP + .I dir\fB/archive/threads/yyyymm + The thread index. It contains one line per subject, starting with the + number of the first message with that subject within the set + investigated, ``:'', a 20 character + subject hash, blank, ``\[n\]'' where ``n'' is the number of messages in the + thread, blank, and the subject. + The file ``yyyymm'' contains + entries for all threads that have messages in the month ``yyyymm'' + or that have messages both before and after that month. + The subject hash is a key to the subject files; the message number is + a key to the index file. + The lines are in ascending order by message number when the index is + created + .I de novo + on an existing archive. When the messages are added one-by-one as in normal + archive operation, ``n'' is the number of message in the thread + .I for the particular month + and the order is in reverse of latest message, i.e. the last extended thread + is shown last. The message number accompanying a thread is + always a message within the thread. It is the first in + archives created + on existing lists, and the last message in incrementally created archives. + Use the corresponding subject index file to get a list of all + messages in the thread in ascending order. + .TP + .I dir\fB/archive/subjects/xx/yyyyyyyyyyyyyyyyyy + A subject file. The first line is the subject hash, a space, and the subject. + This is followed by one line per message with this subject, in the format + message number, ``:'', date (yyyymm), ``:'', + author hash, blank, author from line. The lines are + sorted by message number. The author hash is a key to the author files; + the message number is a key to the index file. The file in the example + would be for the subject hash ``xxyyyyyyyyyyyyyyyyyy''. + .TP + .I dir\fB/archive/authors/xx/yyyyyyyyyyyyyyyyyy + An author file. The first line is the author hash, a space, and the author + from line. + This is followed by one line per message with this author, in the format + message number, ``:'', date (yyyymm), ``:'', + subject hash, blank, subject. The lines are + sorted by message number. The subject hash is a key to the subject files; + the message number is a key to the index file. The file in the example + would be for the author hash ``xxyyyyyyyyyyyyyyyyyy''. + + .I dir\fB/archnum + keeps track of the last message processed. Normally, + .B ezmlm-archive + will process entries for messages from one above the contents of this file + up to an including the message number in + .IR dir\fB/num . + .SH OPTIONS + .B ezmlm-archive + writes messages in a crash-proof manner when run in normal mode. When overriding + the normal message range with any of the options listed, the normal + .B sync(3) + of the output files is suppressed for efficiency. Should the computer crash + during this time the state of the indices is not defined. Use the + .B \-s + option in the (extremely rare) cases where this would be a problem. + .TP + .B \-c + Create a new index. This overrides + .I dir\fB/archnum + causing + .B ezmlm-archive + to start with the first message in the archive. Synonym for + .BR \-f\fI0 . + .B NOTE: + .B ezmlm-archive + does not remove files in the index. While it will overwrite/update old files + it will not remove files that are obsolete for other reasons. + .TP + .B \-C + (Default.) + Process entries starting with the message after the message listed in + .IR dir\fB/archnum . + .TP + .B \-f\fI msg1 + Process messages from the archive section (set of 100 messages) + containing message + .IR msg1 . + This is useful if you have removed part of the archive, as it will shorten + processing time and decrease memory use. + .B NOTE: + .B ezmlm-archive + does not remove files in the index. While it will overwrite/update old files + it will not remove files that are obsolete for other reasons. The number of + messages per thread will be incorrect when using of the + .B \-f + and + .B \-t + switches leads to partial re-indexing of already indexed messages. + .TP + .B \-F + (Default.) + Do not change the starting message from the default + (see + .BR \-C ). + .TP + .B \-s + Always sync files. + .TP + .B \-S + (Default.) + Sync files, except when on of the message range modifying options is + used. + .TP + .B \-t\fI msg2 + Process messages to message + .I msg2 + instead of the last message in the archive. Again, files written are + corrected, but other files are not explicitly removed. + .TP + .B \-T + (Default.) + Process entries for messages up to the last message in the archive. + .TP + .B \-v + Display + .B ezmlm-archive + version info. + .TP + .B \-V + Display + .B ezmlm-archive + version info. + .SH "MEMORY USAGE" + .B ezmlm-archive + stores its linked lists in memory. On at 32-bit architecture, it uses + 12 bytes per message, 28 bytes per thread (plus one copy of the subject), + and 20 bytes per author (plus one copy of the author from line). + + In normal list use, it processes only at most a few messages at a time, + but for initial processing of a large archive, considerable amounts of + memory may be used. Assuming + 40 bytes for subject/from line, 5 messages per thread, 100,000 messages, + and 1000 authors, this is 2.5 MB. For 1,000,000 messages this is about 20 MB. + + Thus, for large archives, it may be useful to use the + .I \-t + switch to process the archive in multiple subsets, starting with e.g. the first + 100,000, then the next, and so on. + .SH "SEE ALSO" + ezmlm-cgi(1), + ezmlm-idx(1), + ezmlm-send(1), + ezmlm(5) + diff -crN ../ezmlm-0.53/ezmlm-archive.c ./ezmlm-archive.c *** ../ezmlm-0.53/ezmlm-archive.c Wed Dec 31 18:00:00 1969 --- ./ezmlm-archive.c Fri Dec 24 14:15:01 1999 *************** *** 0 **** --- 1,479 ---- + /*$Id: ezmlm-archive.c,v 1.13 1999/11/28 20:13:32 lindberg Exp $*/ + /*$Name: ezmlm-idx-040 $*/ + + #include "alloc.h" + #include "error.h" + #include "stralloc.h" + #include "str.h" + #include "sig.h" + #include "getconf.h" + #include "strerr.h" + #include "getln.h" + #include "substdio.h" + #include "readwrite.h" + #include "fmt.h" + #include "sgetopt.h" + #include "idxthread.h" + #include "makehash.h" + #include "idx.h" + #include "errtxt.h" + + #define FATAL "ezmlm-archive: fatal: " + #define WARNING "ezmlm-archive: warning: inconsistent index: " + + substdio ssin; + char inbuf[1024]; + substdio ssout; + char outbuf[1024]; + substdio ssnum; + char numbuf[16]; + + stralloc line = {0}; + stralloc num = {0}; + stralloc fn = {0}; + stralloc fnn = {0}; + + char strnum[FMT_ULONG]; + int flagerror = 0; + int flagsync = 1; /* sync() by default, not for -c or -f or -t */ + char *dir; + + struct ca { + char *s; /* start */ + unsigned int l; /* length */ + } ca; + + void die_usage() { + strerr_die1x(100, + "ezmlm-archive: usage: " + "ezmlm-archive [-cCFsSTvV] [-f min_msg] [-t max_msg] dir"); + } + + void die_nomem() { strerr_die2x(111,FATAL,ERR_NOMEM); } + + void close_proper(ss,s,sn) + /* flush,sync,close,move sn->s) */ + substdio *ss; + char *s, *sn; + { + if (substdio_flush(ss) == -1) + strerr_die6sys(111,FATAL,ERR_FLUSH,dir,"/",s,": "); + if (flagsync) + if (fsync(ss->fd) == -1) + strerr_die6sys(111,FATAL,ERR_SYNC,dir,"/",s,": "); + if (close(ss->fd) == -1) + strerr_die6sys(111,FATAL,ERR_CLOSE,dir,"/",s,": "); + if (rename(sn,s) == -1) + strerr_die6sys(111,FATAL,ERR_MOVE,dir,"/",sn,": "); + } + + void write_threads(msgtable,subtable,authtable,datetable,from,to) + /* Add the current threading data to the thread database without dups */ + /* Writes the subject index first, then processes the individual files */ + msgentry *msgtable; subentry *subtable; authentry *authtable; + dateentry *datetable; + unsigned long from,to; + { + msgentry *pmsgt; + subentry *psubt,*psubtm, *psubtlast; + subentry *presubt = (subentry *)0; + authentry *pautht; + dateentry *pdatet; + char *cp,*cp1; + unsigned long msg; + unsigned long ulmsginthread; + unsigned long subnum; + unsigned long authnum; + unsigned long msgnum; + unsigned int pos,l; + unsigned int startdate,nextdate; + unsigned int startmsg,nextmsg; + int fd = -1; + int fdn = -1; + int match; + int ffound; + int lineno; + int res; + + psubtm = subtable; /* now for new threads */ + pdatet = datetable; + nextmsg = 0L; + nextdate = pdatet->date; + while (psubtm->sub) { /* these are in msgnum order */ + if (!presubt) /* for rewind */ + if (psubtm->lastmsg >= nextmsg) + presubt = psubtm; /* this thread extends beyond current month */ + if (psubtm->firstmsg >= nextmsg) { /* done with this month */ + if (fdn != -1) close_proper(&ssout,fn.s,fnn.s); + psubtlast = psubtm; /* last thread done */ + if (presubt) /* need to rewind? */ + psubtm = presubt; /* do it */ + psubt = psubtm; /* tmp pointer to reset done flag */ + presubt = (subentry *)0; /* reset rewind pointer */ + pdatet++; /* next month */ + startdate = nextdate; /* startdate */ + nextdate = pdatet->date; /* end date */ + startmsg = nextmsg; /* first message in month */ + nextmsg = pdatet->msg; /* first message in next month */ + if (!stralloc_copys(&fn,"archive/threads/")) die_nomem(); + if (!stralloc_catb(&fn,strnum,fmt_uint(strnum,startdate))) die_nomem(); + if (!stralloc_copy(&fnn,&fn)) die_nomem(); + if (!stralloc_0(&fn)) die_nomem(); + if (!stralloc_cats(&fnn,"n")) die_nomem(); + if (!stralloc_0(&fnn)) die_nomem(); + if ((fdn = open_trunc(fnn.s)) == -1) + strerr_die6sys(111,FATAL,ERR_CREATE,dir,"/",fnn.s,": "); + substdio_fdbuf(&ssout,write,fdn,outbuf,sizeof(outbuf)); + if ((fd = open_read(fn.s)) == -1) { + if (errno != error_noent) + strerr_die6sys(111,FATAL,ERR_OPEN,dir,"/",fn.s,": "); + } else { + substdio_fdbuf(&ssin,read,fd,inbuf,sizeof(inbuf)); + for (;;) { + if (getln(&ssin,&line,&match,'\n') == -1) + strerr_die6sys(111,FATAL,ERR_READ,dir,"/",fn.s,": "); + if (!match) break; + pos = scan_ulong(line.s,&msgnum); + pos++; /* skip ':' */ + if (msgnum >= from) + continue; /* ignore entries from threading range */ + if (line.len < pos + HASHLEN) { + flagerror = -1; /* and bad ones */ + continue; + } + psubt = subtable; + cp = line.s + pos; + ffound = 0; /* search among already known subjects */ + for (;;) { + res = str_diffn(psubt->sub,cp,HASHLEN); + if (res < 0) { + if (psubt->higher) + psubt = psubt->higher; + else + break; + } else if (res > 0) { + if (psubt->lower) + psubt = psubt->lower; + else + break; + } else { + ffound = 1; + break; + } + } + if (!ffound) { + if (substdio_put(&ssout,line.s,line.len) == -1) + strerr_die6sys(111,FATAL,ERR_WRITE,dir,"/",fnn.s,": "); + } else { /* new # of msg in thread */ + cp += HASHLEN; /* HASHLEN [#] Subject always \n at end */ + if (*(cp++) == ' ' && *(cp++) == '[') { + cp += scan_ulong(cp,&ulmsginthread); + if (*cp == ']') { + psubt->msginthread += (unsigned char) (ulmsginthread & 0xff); + } + } else + flagerror = -5; + } + } + close(fd); + } + continue; + } + + if (psubtm->firstmsg < nextmsg && psubtm->lastmsg >= startmsg) { + if (!stralloc_copyb(&line,strnum,fmt_ulong(strnum,psubtm->lastmsg))) + die_nomem(); + if (!stralloc_cats(&line,":")) die_nomem(); + if (!stralloc_catb(&line,psubtm->sub,HASHLEN)) die_nomem(); + if (!stralloc_cats(&line," [")) die_nomem(); + if (!stralloc_catb(&line,strnum, + fmt_ulong(strnum,(unsigned long) psubtm->msginthread))) + die_nomem(); + if (!stralloc_cats(&line,"]")) die_nomem(); + if (!stralloc_catb(&line,psubtm->sub + HASHLEN,psubtm->sublen - HASHLEN)) + die_nomem(); /* has \n */ + if (substdio_put(&ssout,line.s,line.len) == -1) + strerr_die6sys(111,FATAL,ERR_WRITE,dir,"/",fnn.s,": "); + } + psubtm++; + } + if (fdn != -1) + close_proper(&ssout,fn.s,fnn.s); + + psubt = subtable; + while (psubt->sub) { /* now the threads */ + if (!stralloc_copys(&fn,"archive/subjects/")) die_nomem(); + if (!stralloc_catb(&fn,psubt->sub,2)) die_nomem(); + if (!stralloc_0(&fn)) die_nomem(); + if (mkdir(fn.s,0755) == -1) + if (errno != error_exist) + strerr_die6sys(111,FATAL,ERR_CREATE,dir,"/",fn.s,": "); + fn.s[fn.len - 1] = '/'; + if (!stralloc_catb(&fn,psubt->sub+2,HASHLEN-2)) die_nomem(); + if (!stralloc_copy(&fnn,&fn)) die_nomem(); + if (!stralloc_cats(&fnn,"n")) die_nomem(); + if (!stralloc_0(&fn)) die_nomem(); + if (!stralloc_0(&fnn)) die_nomem(); + if ((fdn = open_trunc(fnn.s)) == -1) + strerr_die4sys(111,FATAL,ERR_CREATE,fnn.s,": "); + substdio_fdbuf(&ssout,write,fdn,outbuf,sizeof(outbuf)); + if ((fd = open_read(fn.s)) == -1) { + if (errno != error_noent) + strerr_die4sys(111,FATAL,ERR_OPEN,fn.s,": "); + if (substdio_puts(&ssout,psubt->sub) == -1) /* write subject */ + strerr_die6sys(111,FATAL,ERR_WRITE,dir,"/",fnn.s,": "); + } else { /* copy data */ + substdio_fdbuf(&ssin,read,fd,inbuf,sizeof(inbuf)); + lineno = 0; + for (;;) { + if (getln(&ssin,&line,&match,'\n') == -1) + strerr_die6sys(111,FATAL,ERR_READ,dir,"/",fn.s,": "); + if (!match) break; + if (!lineno) { /* write subject */ + if (line.len < HASHLEN + 1 || line.s[HASHLEN] != ' ') + flagerror = -3; + if (substdio_put(&ssout,line.s,line.len) == -1) + strerr_die6sys(111,FATAL,ERR_WRITE,dir,"/",fnn.s,": "); + lineno = 1; + continue; + } + (void) scan_ulong(line.s,&msgnum); + if (msgnum >= from) break; + if (substdio_put(&ssout,line.s,line.len) == -1) + strerr_die6sys(111,FATAL,ERR_WRITE,dir,"/",fnn.s,": "); + } + (void) close(fd); /* close old index */ + } + + subnum = (unsigned long) (psubt - subtable + 1); /* idx of this subj */ + pmsgt = msgtable + psubt->firstmsg - from; /* first message entry */ + for (msg = psubt->firstmsg; msg <= psubt->lastmsg; msg++) { + if (pmsgt->subnum == subnum) { + if (!stralloc_copyb(&line,strnum,fmt_ulong(strnum,msg))) die_nomem(); + if (!stralloc_cats(&line,":")) die_nomem(); + if (!stralloc_catb(&line,strnum,fmt_uint(s