diff -u ./Changelog ../../1.94.4/majordomo-1.94.4//Changelog
--- ./Changelog Mon Apr 28 20:21:34 1997
+++ ../../1.94.4/majordomo-1.94.4//Changelog    Wed Aug 27 17:56:13 1997
@@ -1,3 +1,172 @@
+Changes since 1.94.3:
+
+archive2.pl     1.10:1.9
+        revision 1.10
+        date: 1997/08/27 15:07:44;  author: cwilson;  state: Exp;  lines: +22 -7
+        From: [email protected] (Rodent of Unusual Size)
+        Message-id: <[email protected]>
+
+        o capability for 4 digit years
+
+            However, just in case it's not, here's a patch to archive2.pl that
+            adds -D, -M, and -Y flags that have the same meanings as their
+            lower-case counterparts - except that the year is 4 digits rather
+            than 2.
+        ----------------------------
+config-test     1.18:1.17
+        revision 1.18
+        date: 1997/08/27 15:17:13;  author: cwilson;  state: Exp;  lines: +3 -3
+        o  Checks to make sure that $log is actually a file.
+        ----------------------------
+config_parse.pl 1.64:1.63
+        revision 1.64
+        date: 1997/08/27 14:41:32;  author: cwilson;  state: Exp;  lines: +17 -1
+        [ ftp://sol.ccsf.cc.ca.us/majordomo-patches/1.94.3/config_majordomo.0 ]
+
+        From: Bill Houle <[email protected]>
+        Message-Id: <[email protected]>
+
+        The following patches implement the 'welcome=yes/no' and
+        'announcements=yes/no' keywords for Majordomo 1.94.3. Both features have
+        been requested several times on the -users mailing list. In the past I had
+        described how our site implemented these for 1.93 using the new_keyword()
+        API function call, but since I am in the process of upgrading I figured I'd
+        do it this time as a real patch. I submit them for local implementation and
+        hopeful incorporation into 1.94.4. (Yes, I know these are new features
+        which are not typical for inclusion in a point release. But heck, they are
+        so simple its laughable...)
+        ----------------------------
+digest  1.23:1.22
+        revision 1.23
+        date: 1997/08/27 14:42:52;  author: cwilson;  state: Exp;  lines: +30 -13
+        [ ftp://sol.ccsf.cc.ca.us/majordomo-patches/1.94.3/digest.0 ]
+
+        From: Dave Wolfe <[email protected]>
+        Message-Id: <[email protected]>
+
+        These patches fix some problems recently identified in digest, but are
+        virtually untested. They address undefined variables when the non-C form
+        of configuration is used and file globbing failures (i.e. "No messages"
+        aborts when there are plenty of messages to digest). While I have the
+        highest confidence in the changes, unless someone can verify them I
+        can't that they be placed in the release. They should be tested
+        *both* with and without using the -C option.
+        ----------------------------
+majordomo       1.88:1.87
+        revision 1.88
+        date: 1997/08/27 14:55:29;  author: cwilson;  state: Exp;  lines: +21 -41
+        [ ftp://sol.ccsf.cc.ca.us/majordomo-patches/1.94.3/majordomo.0 ]
+        [ ftp://sol.ccsf.cc.ca.us/majordomo-patches/1.94.3/majordomo.1 ]
+        [ ftp://sol.ccsf.cc.ca.us/majordomo-patches/1.94.3/majordomo.2 ]
+
+        From: Dave Wolfe <[email protected]>
+        Message-Id: <[email protected]>
+
+        o Race condition:
+
+           The problem is a window when Mj is unsubscribing an address between the
+           time the list file is unlinked and the updated file is linked to the
+           list file name.
+
+        From: Dave Wolfe <[email protected]>
+        Message-Id: <[email protected]>
+
+        o Config lock not being freed:
+
+           I discovered a case when a config lock isn't freed when newconfig fails
+           due to errors in the settings then a following (in the same message)
+           config or writeconfig command fails because set_lock() is called again
+           without the lock ever being freed. I suppose I could make set_lock()
+           less picky, but the problem is actually bad logic in do_newconfig(), so
+           I'd rather fix that. Here's the patch against 1.94.3:
+
+        From: Dave Wolfe <[email protected]>
+        Message-Id: <[email protected]>
+
+        o  EOF tests failing due to intervening filehandle resets.
+
+           Since I use my lockf() version of shlock.pl, I discovered that the tests
+           for eof on the command input stream in do_newinfo() and do_newintro()
+           make a rather tenuous assumption in at least one case for each function
+           because there's an intervening log() call (and resulting file locking)
+           between the last input from the command stream and the eof test on the
+           last filehandle read.
+        ----------------------------
+majordomo.pl    1.56:1.55
+        revision 1.56
+        date: 1997/08/27 14:58:53;  author: cwilson;  state: Exp;  lines: +10 -10
+        [ ftp://sol.ccsf.cc.ca.us/majordomo-patches/1.94.3/majordomo.pl.0 ]
+
+        From: Dave Wolfe <[email protected]>
+        Message-Id: <[email protected]>
+
+        o Mungedomain doesn't work due to is_list_member() bug
+
+           > > The problem I am having is that mungedomain seems not to work
+           > > when the subscribed person is [email protected] and the From: line in the
+           > > mail is [email protected]. [ on 1.94.3 ]
+           >
+           > You have also found a bug. It's even worse if you list a file other than
+           > the list in 'restrict_post'. I'm working on it but since I'm out this
+           > afternoon and have a training class the next 2 days, it may be awhile
+           > before I have a patch for it.
+           >
+           > For those who care, is_list_member() in majordomo.pl clobbers
+           > $clean_list before it uses it to call cf_ck_bool() to get the value
+           > of 'mungedomain'. Then there's the problem of it not making sure that
+           > get_config() has been called for $clean_list, not to mention that resend
+           > calls is_list_member() with the value of 'restrict_post' that might not
+           > even be a list at all!
+
+           Turns out this wasn't as tricky as I feared once I made the assumption
+           that only the "current list" 'mungedomain' applied. Here's patches
+           against 1.94.3:
+        ----------------------------
+resend  1.86:1.85
+        revision 1.86
+        date: 1997/08/27 14:59:24;  author: cwilson;  state: Exp;  lines: +4 -8
+        [ ftp://sol.ccsf.cc.ca.us/majordomo-patches/1.94.3/majordomo.pl.0 ]
+
+        From: Dave Wolfe <[email protected]>
+        Message-Id: <[email protected]>
+
+        o Mungedomain doesn't work due to is_list_member() bug
+
+           > > The problem I am having is that mungedomain seems not to work
+           > > when the subscribed person is [email protected] and the From: line in the
+           > > mail is [email protected]. [ on 1.94.3 ]
+           >
+           > You have also found a bug. It's even worse if you list a file other than
+           > the list in 'restrict_post'. I'm working on it but since I'm out this
+           > afternoon and have a training class the next 2 days, it may be awhile
+           > before I have a patch for it.
+           >
+           > For those who care, is_list_member() in majordomo.pl clobbers
+           > $clean_list before it uses it to call cf_ck_bool() to get the value
+           > of 'mungedomain'. Then there's the problem of it not making sure that
+           > get_config() has been called for $clean_list, not to mention that resend
+           > calls is_list_member() with the value of 'restrict_post' that might not
+           > even be a list at all!
+
+           Turns out this wasn't as tricky as I feared once I made the assumption
+           that only the "current list" 'mungedomain' applied. Here's patches
+           against 1.94.3:
+        ----------------------------
+sample.cf       1.34:1.33
+        revision 1.34
+        date: 1997/08/27 15:00:31;  author: cwilson;  state: Exp;  lines: +3 -3
+        [ ftp://sol.ccsf.cc.ca.us/majordomo-patches/1.94.3/sample.cf.0 ]
+        [ ftp://sol.ccsf.cc.ca.us/majordomo-patches/1.94.3/sample.cf.1 ]
+
+        o Uncommented $config'default_subscribe_policy
+        o made the sample taboo stuff valid perl5.
+        ----------------------------
+wrapper.c       1.8:1.7
+        revision 1.8
+        date: 1997/08/27 15:01:12;  author: cwilson;  state: Exp;  lines: +6 -4
+        o  Fixes security hole with ENV overrun by limiting env size.
+        ----------------------------
+
Changes since 1.94.2:
o  Quick respin to remove spurious wrapper and fix medit.

@@ -2245,5 +2414,5 @@
then only members of the list can access the list with "who" and "which"
commands.

-$Header: /sources/cvsrepos/majordomo/Changelog,v 1.22 1997/04/28 18:21:34 cwilson Exp $
+$Header: /sources/cvsrepos/majordomo/Changelog,v 1.23 1997/08/27 15:56:13 cwilson Exp $

Common subdirectories: ./Doc and ../../1.94.4/majordomo-1.94.4//Doc
diff -u ./INSTALL ../../1.94.4/majordomo-1.94.4//INSTALL
--- ./INSTALL   Mon Apr 28 20:20:01 1997
+++ ../../1.94.4/majordomo-1.94.4//INSTALL      Wed Aug 27 19:14:50 1997
@@ -2,40 +2,46 @@
             |\/| |__|  | |  | |__/ |  \ |  | |\/| |  |
             |  | |  | _| |__| |  \ |__/ |__| |  | |__|

-                          Release 1.94.3
+                          Release 1.94.4
                              INSTALL
  --------------------------------------------------------------------------

-> Current users of Majordomo whom are upgrading will want to    <--
--> read the Changelog for details on what has changed between    <--
--> versions of Majordomo.                                       <--
+-> read the NEWS and  Changelog for details on what has changed  <--
+->  between versions of Majordomo.                              <--

--> In particular, NOTE THE CHANGES TO THE CONFIGURATION FILE.    <--
--> Several new variables have been added to sample.cf, so check  <--
--> it out and merge your existing majordomo.cf with the supplied <--
--> sample.cf                                                    <--
-
  --------------------------------------------------------------------------

-Folks upgrading from 1.94.1 to 1.94.3 have three options:
+UPGRADING:
+----------
+
+If you're upgrading from a release before 1.94.3, you'll need to either do
+a clean install or patch your 1.94.X to 1.94.3 using the patches found at
+ftp://ftp.greatcircle.com/pub/majordomo.  Then...
+
+Folks upgrading from 1.94.3 to 1.94.4 have three options:

1) A clean install.  See below.

-2) Patch your _distribution_ of 1.94.1 to 1.94.3:
+2) Patch your _distribution_ of 1.94.3 to 1.94.4:

-       % cd distribution/majordomo-1.94.1
-       % patch < ...../patches/majordomo-1.94.3/1.94.1-to-1.94.3-patch
+       % cd distribution/majordomo-1.94.3
+       % patch < ...../patches/majordomo-1.94.4/1.94.3-to-1.94.4-patch

   If there are no *.rej files, do a 'make install'.  Otherwise, examine
   each .rej file and merge the changes in by hand.

-3) Patch your _installation_ of 1.94.1 to 1.94.3:
+3) Patch your _installation_ of 1.94.3 to 1.94.4:

-       % cd /usr/majordomo
-       % patch < ....../majordomo-1.94.3/patches/1.94.1-to-1.94.3-installed-patch
+       % cd /usr/majordomo (ie, where you've installed majordomo)
+       % patch < ....../majordomo-1.94.4/patches/1.94.3-to-1.94.4-installed-patch

+   Also be sure to compile and install wrapper, since there is a security
+   patch in this version
+
   If there are no *.rej files, you're done!  Otherwise, examine
   each .rej file and merge the changes in by hand.
+

  --------------------------------------------------------------------------

diff -u ./Makefile ../../1.94.4/majordomo-1.94.4//Makefile
--- ./Makefile  Mon Apr 28 20:20:06 1997
+++ ../../1.94.4/majordomo-1.94.4//Makefile     Wed Aug 27 17:56:21 1997
@@ -1,9 +1,10 @@
-#$Modified: Mon Apr 28 20:17:27 1997 by cwilson $
+
+#$Modified: Wed Aug 27 17:52:25 1997 by cwilson $
#
# $Source: /sources/cvsrepos/majordomo/Makefile,v $
-# $Revision: 1.62 $
-# $Date: 1997/04/28 18:20:06 $
-# $Header: /sources/cvsrepos/majordomo/Makefile,v 1.62 1997/04/28 18:20:06 cwilson Exp $
+# $Revision: 1.63 $
+# $Date: 1997/08/27 15:56:21 $
+# $Header: /sources/cvsrepos/majordomo/Makefile,v 1.63 1997/08/27 15:56:21 cwilson Exp $
#

#  This is the Makefile for Majordomo.
@@ -69,7 +70,7 @@

#--------YOU SHOULDN'T HAVE TO CHANGE ANYTHING BELOW THIS LINE.-------------

-VERSION =      1.94.3
+VERSION =      1.94.4

# For those stupid machines that try to use csh. Doh!
SHELL = /bin/sh
diff -u ./NEWLIST ../../1.94.4/majordomo-1.94.4//NEWLIST
--- ./NEWLIST   Mon Apr 28 20:20:13 1997
+++ ../../1.94.4/majordomo-1.94.4//NEWLIST      Wed Aug 27 17:56:24 1997
@@ -2,7 +2,7 @@
             |\/| |__|  | |  | |__/ |  \ |  | |\/| |  |
             |  | |  | _| |__| |  \ |__/ |__| |  | |__|

-                           Release 1.94.3
+                           Release 1.94.4
                              NEWLIST
  --------------------------------------------------------------------------

diff -u ./NEWS ../../1.94.4/majordomo-1.94.4//NEWS
--- ./NEWS      Mon Apr 28 20:20:16 1997
+++ ../../1.94.4/majordomo-1.94.4//NEWS Wed Aug 27 17:56:28 1997
@@ -1,3 +1,16 @@
+Changes from 1.94.3 to 1.94.4
+
+o Security fix for advertise/noadvertise eval hole.
+o Security fix for wrapper env overrun
+o Fixed race condition in unsubscribing, config lock not being freed,
+  EOF tests fail due to bad assumptions
+o mungedomain wasn't working properly
+o fixes to commented-out sample.cf code.
+o archive2.pl now has -D -M -Y arguments for 4 digit years.
+o added "welcome" and "announcments" keywords.
+o Digest fixes for -C
+
+
Changes from 1.94.2 to 1.94.3:

o removed wrapper since it snuck into the tarball
diff -u ./README ../../1.94.4/majordomo-1.94.4//README
--- ./README    Mon Apr 28 20:20:22 1997
+++ ../../1.94.4/majordomo-1.94.4//README       Wed Aug 27 17:56:30 1997
@@ -8,7 +8,7 @@
        Medieval Latin "major domus" - "chief of the house".
                     (Barnhart Concise Dictionary of Etymology)

-                           Release 1.94.3
+                           Release 1.94.4
                               README
--------------------------------------------------------------------------

@@ -16,19 +16,11 @@
-> read the NEWS file for details on what has changed between    <-
-> this and the previous version of Majordomo.                   <-

--> In particular, NOTE THE CHANGES TO THE CONFIGURATION FILE.    <-
--> A new variable has been added to sample.cf, while another has <-
--> changed its name and several defaults have been modified, so  <-
--> check it out and merge your existing majordomo.cf with the    <-
--> supplied sample.cf.  Running the 'config-test' script after   <-
--> upgrading will point out the variables you need to add.       <-
-
-
-     Release 1.94.3 of Majordomo is primarily a bugfix release,
-     incorporating changes which fix problems or correct pressing
-     deficiencies in version 1.94.1.  No substantial new
-     functionality has been added, but certain necessary
-     modifications have been made.
+     Release 1.94.4 of Majordomo is primarily a security and bugfix
+     release, incorporating changes which fix problems or correct
+     pressing deficiencies in version 1.94.3.  The only substantial new
+     functionality added is the addition of "welcome" and "announcments"
+     keywords.

                    * * * * * * * * * * * * * *

diff -u ./archive2.pl ../../1.94.4/majordomo-1.94.4//archive2.pl
--- ./archive2.pl       Thu Dec 12 16:01:39 1996
+++ ../../1.94.4/majordomo-1.94.4//archive2.pl  Wed Aug 27 17:07:44 1997
@@ -4,8 +4,8 @@
# permission only.
#
# $Source: /sources/cvsrepos/majordomo/archive2.pl,v $
-# $Revision: 1.9 $
-# $Date: 1996/12/12 15:01:39 $
+# $Revision: 1.10 $
+# $Date: 1997/08/27 15:07:44 $
# $Author: cwilson $
# $State: Exp $
#
@@ -16,11 +16,14 @@
#      -u      Input is a UNIX archive (separated by "From " lines) to split
#      -a      Input is a message to append to archive
#      -d      Archive file is <archive>.YYMMDD
+#      -D      Archive file is <archive>.YYYYMMDD
#      -m      Archive file is <archive>.YYMM
+#      -M      Archive file is <archive>.YYYYMM
#      -y      Archive file is <archive>.YY
+#      -Y      Archive file is <archive>.YYYY
# Exactly one of "-u" or "-a" must be specified.
-# At most one of "-d", "-m", or "-y" may be specified; if none is
-#   specified, archive name is simply <archive>
+# At most one of "-d", "-D", "-m", "-M", "-y", or "-Y" may be specified;
+# if none is specified, archive name is simply <archive>
#
# An example of using "archive" to split an existing UNIX-style archive
# named "my-list.archive" into by-day archive files named "my-list.YYMMDD":
@@ -76,9 +79,9 @@
    $MoY{$_} = $m++;
}

-$usage = "Usage: $0 -f <file> {-u|-a} [-d|-m|-y] [file ...]";
+$usage = "Usage: $0 -f <file> {-u|-a} [-d|-D|-m|-M|-y|-Y] [file ...]";

-&Getopts("f:uadmy") || die("$usage\nStopped");
+&Getopts("f:uadDmMyY") || die("$usage\nStopped");

if (!defined($opt_f)) {
    print STDERR "'-f <list>' required\n$usage\n";
@@ -103,10 +106,13 @@
$mutex = 0;

if (defined($opt_d)) { $mutex++; }
+if (defined($opt_D)) { $mutex++; }
if (defined($opt_m)) { $mutex++; }
+if (defined($opt_M)) { $mutex++; }
if (defined($opt_y)) { $mutex++; }
+if (defined($opt_Y)) { $mutex++; }
if ($mutex > 1) {
-    print STDERR "Only one of '-d', '-m', or '-y' allowed\n$usage\n";
+    print STDERR "Only one of '-d', '-D', '-m', '-M', -y', or '-Y' allowed\n$usage\n";
    exit 3;
}

@@ -159,11 +165,20 @@
    if (defined($opt_y)) {
       $suffix = sprintf(".%02d", $year % 100);
    }
+    if (defined($opt_Y)) {
+       $suffix = sprintf(".%04d", $year + 1900);
+    }
    if (defined($opt_m)) {
       $suffix = sprintf(".%02d%02d", $year % 100, $mon);
    }
+    if (defined($opt_M)) {
+       $suffix = sprintf(".%04d%02d", $year + 1900, $mon);
+    }
    if (defined($opt_d)) {
       $suffix = sprintf(".%02d%02d%02d", $year % 100, $mon, $mday);
+    }
+    if (defined($opt_D)) {
+       $suffix = sprintf(".%04d%02d%02d", $year + 1900, $mon, $mday);
    }

    &lopen($FH, ">>", "$opt_f$suffix") ||
diff -u ./config-test ../../1.94.4/majordomo-1.94.4//config-test
--- ./config-test       Mon Mar 10 18:22:05 1997
+++ ../../1.94.4/majordomo-1.94.4//config-test  Wed Aug 27 17:17:13 1997
@@ -1,5 +1,5 @@
#!/bin/perl
-# $Id: config-test,v 1.17 1997/03/10 17:22:05 cwilson Exp $
+# $Id: config-test,v 1.18 1997/08/27 15:17:13 cwilson Exp $
# configuration test for majordomo
# provided with majordomo, modifications by darren stalder <[email protected]>
# more mods by Vince Skahan <[email protected]>
@@ -210,10 +210,10 @@
    }
}

-if ( -r $log && -w $log) {
+if ( -f $log && -r $log && -w $log) {
    &good("logfile $log exists and is writeable.");
} else {
-    &bad("logfile $log exists, but is not writeable.");
+    &bad("logfile $log exists, but is not writeable or isn't a file.");
}

&header ("Mailers");
diff -u ./config_parse.pl ../../1.94.4/majordomo-1.94.4//config_parse.pl
--- ./config_parse.pl   Sun Apr 20 18:06:58 1997
+++ ../../1.94.4/majordomo-1.94.4//config_parse.pl      Wed Aug 27 16:41:32 1997
@@ -5,7 +5,7 @@
# writes into the global variable %main'config_opts
#

-# $Header: /sources/cvsrepos/majordomo/config_parse.pl,v 1.63 1997/04/20 16:06:58 cwilson Exp $
+# $Header: /sources/cvsrepos/majordomo/config_parse.pl,v 1.64 1997/08/27 14:41:32 cwilson Exp $
# $Modified: Tue Dec 17 19:29:14 1996 by cwilson $

# this array holds the interesting info for use by all tools
@@ -76,6 +76,8 @@
# otherwise the value is the default value for the keyword.
# if the value starts with #!, the rest of the value is eval'ed
%known_keys = (
+       'welcome',              'yes', # send welcome msg to new subscribers
+       'announcements',        'yes', # send sub/unsub audits to list owner
       'get_access',           "open\001closed\001list\001list", # open, anyone can access
        'index_access',                "open\001closed\001list\001open", # closed, nobody can
        'who_access',          "open\001closed\001list\001open", # list, only list can access.
@@ -145,6 +147,16 @@
# An associative array of comments for all of the keys
# The text is wrapped and filled on output.
%comments = (
+'welcome',
+"If set to yes, a welcome message (and optional 'intro' file) will be
+sent to the newly subscribed user.",
+
+'announcements',
+"If set to yes, comings and goings to the list will be sent to the list
+owner. These SUBSCRIBE/UNSUBSCRIBE event announcements are informational
+only (no action is required), although it is highly recommended that they
+be monitored to watch for list abuse.",
+
'get_access',
"One of three values: open, list, closed. Open allows anyone
access to this command and closed completely disables the
@@ -404,6 +416,8 @@
# match commands to their subsystem, by default only 4 subsystems
# exist, majordomo, resend, digest and config.
%subsystem = (
+       'welcome',              'majordomo',
+       'announcements',        'majordomo',
       'get_access',           'majordomo',
        'index_access',                'majordomo',
        'info_access',         'majordomo',
@@ -458,6 +472,8 @@
# the parse function will be called to parse the value string for
# the keyword
%parse_function = (
+       'welcome',              'grab_bool',
+       'announcements',                'grab_bool',
       'get_access',           'grab_enum',
        'index_access',                'grab_enum',
        'info_access',         'grab_enum',
Common subdirectories: ./contrib and ../../1.94.4/majordomo-1.94.4//contrib
diff -u ./digest ../../1.94.4/majordomo-1.94.4//digest
--- ./digest    Mon Mar 10 18:11:25 1997
+++ ../../1.94.4/majordomo-1.94.4//digest       Wed Aug 27 16:42:52 1997
@@ -5,12 +5,12 @@
# Heavily modified by Brent Chapman <[email protected]>

# $Source: /sources/cvsrepos/majordomo/digest,v $
-# $Revision: 1.22 $
-# $Date: 1997/03/10 17:11:25 $
+# $Revision: 1.23 $
+# $Date: 1997/08/27 14:42:52 $
# $Author: cwilson $
# $State: Exp $
#
-# $Header: /sources/cvsrepos/majordomo/digest,v 1.22 1997/03/10 17:11:25 cwilson Exp $
+# $Header: /sources/cvsrepos/majordomo/digest,v 1.23 1997/08/27 14:42:52 cwilson Exp $
#
#

@@ -21,10 +21,9 @@

&init;
&readconfig;
-$TEMP = "$TMPDIR/digest.$$" || "/usr/tmp/digest.$$";
+$TEMP = (defined $TMPDIR && -d $TMPDIR) ?
+       "$TMPDIR/digest.$$" : "/usr/tmp/digest.$$";

-$sendmail_command = "/usr/lib/sendmail" if ! defined $sendmail_command ;
-
if (defined($opt_r)) {
    &receive_message;
    if (&should_be_sent(1)) {
@@ -164,17 +163,19 @@
#
sub send_digest {
    local($lastfile) = shift;
-    @files=<$V{'INCOMING'}/*>;
-    if ($#files < $[) {
-       &abort("No messages.\nStopped ");
+    if (opendir(DIR, $V{'INCOMING'})) {
+       @files = grep(/^\d+$/, readdir(DIR));
+       closedir(DIR);
+    }
+    else {
+       &abort("Error opening $V{'INCOMING'}: $!\nStopped ");
    }
+    &abort("No messages.\nStopped ") unless @files;
    open(TEMP,">$TEMP") || &abort("$TEMP: $!\n");
    print STDERR "producing $V{'NAME'} V$VOLUME #$NUMBER\n";
-    foreach $message (@files) {
-       print STDERR "non digest input file $message", next
-           if $message !~ m#/\d+$#;
+    foreach (@files) {
+           $message = "$V{'INCOMING'}/$_";
           open(message) || &abort("$message: $!\n");
-           #side note: "open message or die"?
           print STDERR "\tprocessing $message\n";
           push(@processed,$message);

@@ -327,6 +328,8 @@
# are not defined, so we provide reasonable defaults.
$sendmail_command = "/usr/lib/sendmail"
  unless defined $sendmail_command;
+$mailer = "$sendmail_command -oi -oee -f\$sender"
+  unless defined $mailer;
$bounce_mailer = "$sendmail_command -f\$sender -t"
  unless defined $bounce_mailer;
&set_abort_addr($whoami_owner);
@@ -378,6 +381,20 @@
            } # list is defined
        } else { # not using -C
               require "config_parse.pl";
+
+# Define all of the mailer properties:
+# The majordomo.cf file isn't used in this option, so fake everything.
+$sendmail_command = "/usr/lib/sendmail"
+  unless defined $sendmail_command;
+$mailer = "$sendmail_command -oi -oee -f\$sender"
+  unless defined $mailer;
+$bounce_mailer = "$sendmail_command -fmajordomo-owner -t"
+  unless defined $bounce_mailer;
+&set_abort_addr("majordomo-owner");
+&set_mail_from("majordomo-owner");
+&set_mail_sender("majordomo-owner");
+&set_mailer($bounce_mailer);
+
          open(config) || &abort("$config: $!\n");
          while (<config>) {
               next if /^\s*$|^\s*#/;
Common subdirectories: ./include and ../../1.94.4/majordomo-1.94.4//include
diff -u ./majordomo ../../1.94.4/majordomo-1.94.4//majordomo
--- ./majordomo Sun Apr 20 18:11:49 1997
+++ ../../1.94.4/majordomo-1.94.4//majordomo    Wed Aug 27 16:55:29 1997
@@ -8,8 +8,8 @@
#   usage rights.
#
# $Source: /sources/cvsrepos/majordomo/majordomo,v $
-# $Revision: 1.87 $
-# $Date: 1997/04/20 16:11:49 $
+# $Revision: 1.88 $
+# $Date: 1997/08/27 14:55:29 $
# $Author: cwilson $
# $State: Exp $
#
@@ -457,9 +457,8 @@
               # we deleted exactly 1 name, so now we shuffle the files
               link("$listdir/$clean_list", "$listdir/$clean_list.old") ||
                   &abort("link(\"$listdir/$clean_list\", \"$listdir/$clean_list.old\"): $!");
-               unlink("$listdir/$clean_list");
-               link("$listdir/$clean_list.new", "$listdir/$clean_list") ||
-                   &abort("link(\"$listdir/$clean_list.new\", \"$listdir/$clean_list\"): $!");
+               rename("$listdir/$clean_list.new", "$listdir/$clean_list") ||
+                   &abort("rename(\"$listdir/$clean_list.new\", \"$listdir/$clean_list\"): $!");
               unlink("$listdir/$clean_list.old");
               if (defined $deflist) {
                 print REPLY "Succeeded (from list $deflist).\n";
@@ -471,11 +470,13 @@
                 print REPLY "Succeeded.\n";
               }
               &log("unsubscribe $clean_list $subscriber");
+               if ( &cf_ck_bool($list,"announcements")) {
               &sendmail(BYE, "$clean_list-approval\@$whereami",
                         "UNSUBSCRIBE $clean_list $subscriber");
               print BYE "$subscriber has unsubscribed from $clean_list.\n";
               print BYE "No action is required on your part.\n";
               close(BYE);
+               }
           }
           elsif ($match_count == 0) {
               print REPLY "**** No matches found for '$subscriber'\n";
@@ -813,10 +814,6 @@
               &lclose(INFO);
               print REPLY "New info for list $clean_list accepted.\n";
               &log("newinfo $clean_list PASSWORD");
-               # if we read to actual end-of-file, we are done
-               if (eof) {
-                   &done();
-               }
           } else {
               &abort("Can't write $listdir/$clean_list.info: $!");
           }
@@ -829,10 +826,6 @@
                   last;
               }
           }
-           # if we read to actual end-of-file, we are done
-           if (eof) {
-               &done();
-           }
       }
    } else {
       &squawk("newinfo: unknown list '$list'.");
@@ -842,10 +835,6 @@
               last;
           }
        }
-       # if we read to actual end-of-file, we are done
-       if (eof) {
-           &done();
-       }
    }
}

@@ -924,10 +913,6 @@
               chmod(0664, "$listdir/$clean_list.intro");
               print REPLY "New intro for list $clean_list accepted.\n";
               &log("newintro $clean_list PASSWORD");
-               # if we read to actual end-of-file, we are done
-               if (eof) {
-                   &done();
-               }
           } else {
               &abort("Can't write $listdir/$clean_list.intro: $!");
           }
@@ -940,10 +925,6 @@
                   last;
               }
           }
-           # if we read to actual end-of-file, we are done
-           if (eof) {
-               &done();
-           }
       }
    } else {
       &squawk("newintro: unknown list '$list'.");
@@ -953,10 +934,6 @@
               last;
           }
        }
-       # if we read to actual end-of-file, we are done
-       if (eof) {
-           &done();
-       }
    }
}
sub do_config {
@@ -1046,10 +1023,11 @@
               umask($oldumask);

               if ( &get_config($listdir, "$clean_list.new", "locked"))  {
+                   unlink "$listdir/$clean_list.new.config";
+                   &free_lock("$listdir/$clean_list.config.LOCK");
                   print REPLY "The new config file for $clean_list was NOT accepted because:\n";
                   print REPLY @config'errors;
                   &log("FAILED (syntax) newconfig $clean_list PASSWORD");
-                   unlink "$listdir/$clean_list.new.config";
                   return (1);
               }

@@ -1190,7 +1168,6 @@
sub do_lists {
    # Tell the requester what lists we serve
    local($list);
-    local($command_advert, $command_noadvert);
    local($reply_addr) = &ParseAddrs($reply_to);

    select((select(REPLY), $| = 1)[0]);
@@ -1212,16 +1189,14 @@
       if (    ($'config_opts{$list, 'advertise'} ne '')
            || ($'config_opts{$list, 'noadvertise'} ne '') ) {

-           local(@array) = ();
-           local($i, $command, $result) = ();
-               $reply_addr =~ s/\@/\\\@/g;
-               $result = 0;
+           local(@array, $i);
+           local($result) = 0;
+           local($_) = $reply_addr;

               if ($'config_opts{$list, 'advertise'} ne '') {
                  @array = split(/\001/,$'config_opts{$list, 'advertise'});
                  foreach $i (@array) {
-                     $command = "(q~$reply_addr~ =~ $i)";
-                     $result = 1, last if (eval $command);
+                     $result = 1, last if (eval $i); # Expects $_ = $reply_addr
                  }
                } else { $result = 1; }

@@ -1230,9 +1205,7 @@
                  @array = split(/\001/,$'config_opts{$list, 'noadvertise'});

                  foreach $i (@array) {
-                     $command = "(q~$reply_addr~ =~ $i)";
-                     print STDERR "do_lists: noadvertise execing $command\n" if $DEBUG;
-                     $result = 0, last if (eval $command);
+                     $result = 0, last if (eval $i); # Expects $_ = $reply_addr
                   }
               }

@@ -1852,6 +1825,9 @@
    local($list) = shift;
    local($subscriber) = join(" ", @_);

+       # welcome/intro message controlled by 'welcome=yes/no'
+       if ( &cf_ck_bool($list,"welcome")) {
+
    # Set up the sendmail process to welcome the new subscriber
    &set_mail_sender($config_opts{$list,"sender"} . "\@" . $whereami);
    &sendmail(MSG, $subscriber, "Welcome to $list");
@@ -1925,11 +1901,15 @@
    # close (and thereby send) the welcome message to the subscriber
    close(MSG);

-    # tell the list owner of the new subscriber
+       }
+
+    # tell the list owner of the new subscriber (optional: announcements=yes/no)
+       if ( &cf_ck_bool($list,"announcements")) {
    &sendmail(NOTICE, "$list-approval\@$whereami", "SUBSCRIBE $list $subscriber");
    print NOTICE "$subscriber has been added to $list.\n";
    print NOTICE "No action is required on your part.\n";
    close(NOTICE);
+       }
}

# complain about a user screwup, and note that the user needs help appended
diff -u ./majordomo.aliases ../../1.94.4/majordomo-1.94.4//majordomo.aliases
--- ./majordomo.aliases Mon Apr 28 20:20:27 1997
+++ ../../1.94.4/majordomo-1.94.4//majordomo.aliases    Wed Aug 27 17:56:34 1997
@@ -14,12 +14,12 @@
# restart sendmail.
#

-majordomo:  "|/usr/test/majordomo-1.94.3/wrapper majordomo"
+majordomo:  "|/usr/test/majordomo-1.94.4/wrapper majordomo"
majordomo-owner: you
owner-majordomo: you

-test:          "|/usr/test/majordomo-1.94.3/wrapper resend -l test test-list"
-test-list:     :include:/usr/test/majordomo-1.94.3/lists/test
+test:          "|/usr/test/majordomo-1.94.4/wrapper resend -l test test-list"
+test-list:     :include:/usr/test/majordomo-1.94.4/lists/test
owner-test:    you
test-owner:    you
test-request:  you
diff -u ./majordomo.pl ../../1.94.4/majordomo-1.94.4//majordomo.pl
--- ./majordomo.pl      Wed Apr  2 16:04:14 1997
+++ ../../1.94.4/majordomo-1.94.4//majordomo.pl Wed Aug 27 16:58:53 1997
@@ -1,12 +1,12 @@
# General subroutines for Majordomo

# $Source: /sources/cvsrepos/majordomo/majordomo.pl,v $
-# $Revision: 1.55 $
-# $Date: 1997/04/02 14:04:14 $
+# $Revision: 1.56 $
+# $Date: 1997/08/27 14:58:53 $
# $Author: cwilson $
# $State: Exp $
#
-# $Header: /sources/cvsrepos/majordomo/majordomo.pl,v 1.55 1997/04/02 14:04:14 cwilson Exp $
+# $Header: /sources/cvsrepos/majordomo/majordomo.pl,v 1.56 1997/08/27 14:58:53 cwilson Exp $
#

# The exit codes for abort.  Look in /usr/include/sysexits.h.
@@ -707,7 +707,7 @@
}

sub main'is_list_member {
-    local($subscriber, $listdir, $clean_list) = @_;
+    local($subscriber, $listdir, $clean_list, $file) = @_;
    local($matches) = 0;
    local(*LIST);
    local($_);
@@ -714,10 +714,11 @@

    print STDERR "is_list_member: enter\n" if $DEBUG;

-    $clean_list = "$listdir/$clean_list" if $listdir;
-    print STDERR "is_list_member: checking $clean_list for $subscriber\n"
+    $file = "$listdir/$file" if defined $file && $file !~ m|^/|;
+    $file = "$listdir/$clean_list" unless defined $file;
+    print STDERR "is_list_member: checking $file for $subscriber\n"
       if $DEBUG;
-    if (open(LIST, $clean_list)) {
+    if (open(LIST, $file)) {
       while (<LIST>) {
           if (&main'addr_match($subscriber, $_,
              (&main'cf_ck_bool($clean_list,"mungedomain") ? 2 : undef))) {
@@ -728,7 +729,7 @@
       close(LIST);
    }
    else {
-       &main'bitch("Can't read $clean_list: $!"); #'"";
+       &main'bitch("Can't read $file: $!"); #'"";
    }

    print STDERR "is_list_member: exit $matches\n" if $DEBUG;
@@ -796,8 +797,7 @@

    $total = 0;
    foreach $list (@lists) {
-       $list = "$listdir/$list" unless ($list =~ m|^/|);
-       $total += &main'is_list_member($subscriber, "", $list);
+       $total += &main'is_list_member($subscriber, $listdir, $clean_list, $list);
    }
    print STDERR "access_check: exit\n" if $DEBUG;
    return $total;
diff -u ./majordomo_version.pl ../../1.94.4/majordomo-1.94.4//majordomo_version.pl
--- ./majordomo_version.pl      Mon Apr 28 20:20:31 1997
+++ ../../1.94.4/majordomo-1.94.4//majordomo_version.pl Wed Aug 27 17:56:36 1997
@@ -1,5 +1,5 @@
-# $Header: /sources/cvsrepos/majordomo/majordomo_version.pl,v 1.25 1997/04/28 18:20:31 cwilson Exp $
+# $Header: /sources/cvsrepos/majordomo/majordomo_version.pl,v 1.26 1997/08/27 15:56:36 cwilson Exp $

-$majordomo_version = "1.94.3";
+$majordomo_version = "1.94.4";
1;

Common subdirectories: ./md-sub and ../../1.94.4/majordomo-1.94.4//md-sub
Only in .: patches
diff -u ./resend ../../1.94.4/majordomo-1.94.4//resend
--- ./resend    Wed Apr  2 16:04:48 1997
+++ ../../1.94.4/majordomo-1.94.4//resend       Wed Aug 27 16:59:24 1997
@@ -5,8 +5,8 @@
# permission only.
#
# $Source: /sources/cvsrepos/majordomo/resend,v $
-# $Revision: 1.85 $
-# $Date: 1997/04/02 14:04:48 $
+# $Revision: 1.86 $
+# $Date: 1997/08/27 14:59:24 $
# $Author: cwilson $
# $State: Exp $
#
@@ -552,17 +552,13 @@
    local(@files) = split (/[:\s]+/, $opt_I);

    foreach $file (@files) {
-       # add $listdir if not explicitly set.
-       #
-       $file = "$listdir/$file" unless ($file =~ m|^/|);
-
       # Return a null message if the sender (from the From: or
       # Reply-To: headers) is found
       #
-       return "" if &is_list_member($from, "", $file) ||
+       return "" if &is_list_member($from, $listdir, $opt_l, $file) ||
           (defined $reply_to  &&
           $reply_to ne $from  &&
-           &is_list_member($reply_to, "", $file));
+           &is_list_member($reply_to, $listdir, $opt_l, $file));
    }

    # We only get here if nothing matches.
diff -u ./sample.cf ../../1.94.4/majordomo-1.94.4//sample.cf
--- ./sample.cf Sun Apr 27 16:56:45 1997
+++ ../../1.94.4/majordomo-1.94.4//sample.cf    Wed Aug 27 17:00:31 1997
@@ -98,7 +98,7 @@
# imbecile Internet, "open+confirm" or "auto+confirm" is a wiser
# choice for publicly available Majordomo servers.
#
-# $config'default_subscribe_policy = "open+confirm";
+$config'default_subscribe_policy = "open+confirm";

#
#  Configure X400 parsing here.  This is functional, but not well tested
@@ -220,7 +220,7 @@
# no trailing ";"
# For example:
#   $global_taboo_headers = <<'END';
-#   /^from:.*[email protected]/i
+#   /^from:.*trouble\@hassle\.net/i
#   /^subject:.*non-delivery notice/i
#   END
# NOTE! Using ' instead of " in the 'END' is VERY IMPORTANT!!!
@@ -313,4 +313,4 @@
$majordomo_dont_reply = '(mailer-daemon|uucp|listserv|majordomo|listproc)\@';

1;
-# $Header: /sources/cvsrepos/majordomo/sample.cf,v 1.33 1997/04/27 14:56:45 cwilson Exp $
+# $Header: /sources/cvsrepos/majordomo/sample.cf,v 1.34 1997/08/27 15:00:31 cwilson Exp $
diff -u ./wrapper.c ../../1.94.4/majordomo-1.94.4//wrapper.c
--- ./wrapper.c Mon Nov 18 16:34:21 1996
+++ ../../1.94.4/majordomo-1.94.4//wrapper.c    Wed Aug 27 17:01:12 1997
@@ -1,7 +1,7 @@
/*
 *  $Source: /sources/cvsrepos/majordomo/wrapper.c,v $
- *  $Revision: 1.7 $
- *  $Date: 1996/11/18 15:34:21 $
+ *  $Revision: 1.8 $
+ *  $Date: 1997/08/27 15:01:12 $
 *  $Author: cwilson $
 *  $State: Exp $
 *
@@ -10,7 +10,7 @@
 */

#ifndef lint
-static char rcs_header[] = "$Header: /sources/cvsrepos/majordomo/wrapper.c,v 1.7 1996/11/18 15:34:21 cwilson Exp $";
+static char rcs_header[] = "$Header: /sources/cvsrepos/majordomo/wrapper.c,v 1.8 1997/08/27 15:01:12 cwilson Exp $";
#endif

#include <stdio.h>
@@ -55,6 +55,8 @@
    0
};

+int new_env_size = 7;                          /* to prevent overflow problems */
+
main(argc, argv, env)
    int argc;
    char * argv[];
@@ -93,7 +95,7 @@
    e = 3; /* the first unused slot in new_env[] */
#endif

-    for (i = 0 ; env[i] != NULL ; i++) {
+    for (i = 0 ; env[i] != NULL && e <= new_env_size; i++) {
       if ((strncmp(env[i], "USER=", 5) == 0) ||
           (strncmp(env[i], "TZ=", 3) == 0) ||
           (strncmp(env[i], "LOGNAME=", 8) == 0)) {