diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..02d184b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/mailman-2.1.29.tgz
diff --git a/.mailman.metadata b/.mailman.metadata
new file mode 100644
index 0000000..72eede2
--- /dev/null
+++ b/.mailman.metadata
@@ -0,0 +1 @@
+40fe97974a6f0805a01d55c6944565f238778238 SOURCES/mailman-2.1.29.tgz
diff --git a/SOURCES/httpd-mailman.conf b/SOURCES/httpd-mailman.conf
new file mode 100644
index 0000000..58dbc90
--- /dev/null
+++ b/SOURCES/httpd-mailman.conf
@@ -0,0 +1,24 @@
+#
+# httpd configuration settings for use with mailman.
+#
+
+ScriptAlias /mailman/ @MMDIR@/cgi-bin/
+
+ AllowOverride None
+ Options ExecCGI
+ Require all granted
+
+
+
+Alias /pipermail/ @VARMMDIR@/archives/public/
+
+ Options MultiViews FollowSymLinks
+ AllowOverride None
+ Require all granted
+ AddDefaultCharset Off
+
+
+# Uncomment the following line, replacing www.example.com with your server's
+# name, to redirect queries to /mailman to the listinfo page (recommended).
+
+# RedirectMatch ^/mailman[/]*$ http://www.example.com/mailman/listinfo
diff --git a/SOURCES/mailman-2.1-build.patch b/SOURCES/mailman-2.1-build.patch
new file mode 100644
index 0000000..3c5d99d
--- /dev/null
+++ b/SOURCES/mailman-2.1-build.patch
@@ -0,0 +1,715 @@
+diff --git a/Mailman/Archiver/Makefile.in b/Mailman/Archiver/Makefile.in
+index 65e46cb..dc3a1c6 100644
+--- a/Mailman/Archiver/Makefile.in
++++ b/Mailman/Archiver/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -47,7 +46,7 @@ pipermail.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -63,8 +62,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/Mailman/Bouncers/Makefile.in b/Mailman/Bouncers/Makefile.in
+index 8865a9f..8878cd9 100644
+--- a/Mailman/Bouncers/Makefile.in
++++ b/Mailman/Bouncers/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -45,7 +44,7 @@ MODULES= *.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -61,8 +60,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/Mailman/Cgi/Makefile.in b/Mailman/Cgi/Makefile.in
+index 47929e9..e20c07e 100644
+--- a/Mailman/Cgi/Makefile.in
++++ b/Mailman/Cgi/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -47,7 +46,7 @@ CGI_MODULES= *.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -63,8 +62,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(CGIDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/Mailman/Commands/Makefile.in b/Mailman/Commands/Makefile.in
+index 645d78b..12bbc1b 100644
+--- a/Mailman/Commands/Makefile.in
++++ b/Mailman/Commands/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -45,7 +44,7 @@ MODULES= *.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -61,8 +60,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/Mailman/Gui/Makefile.in b/Mailman/Gui/Makefile.in
+index 000441e..9273b8a 100644
+--- a/Mailman/Gui/Makefile.in
++++ b/Mailman/Gui/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -45,7 +44,7 @@ MODULES= *.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -61,8 +60,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/Mailman/Handlers/Makefile.in b/Mailman/Handlers/Makefile.in
+index 71e5576..56ee2eb 100644
+--- a/Mailman/Handlers/Makefile.in
++++ b/Mailman/Handlers/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -45,7 +44,7 @@ MODULES= *.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -61,8 +60,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/Mailman/Logging/Makefile.in b/Mailman/Logging/Makefile.in
+index e185775..ad5c128 100644
+--- a/Mailman/Logging/Makefile.in
++++ b/Mailman/Logging/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -45,7 +44,7 @@ MODULES= *.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -61,8 +60,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/Mailman/MTA/Makefile.in b/Mailman/MTA/Makefile.in
+index 0338806..e1de296 100644
+--- a/Mailman/MTA/Makefile.in
++++ b/Mailman/MTA/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -45,7 +44,7 @@ MODULES= *.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -61,8 +60,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/Mailman/Makefile.in b/Mailman/Makefile.in
+index 93c7efd..45439f0 100644
+--- a/Mailman/Makefile.in
++++ b/Mailman/Makefile.in
+@@ -20,8 +20,6 @@
+
+ # Variables set by configure
+
+-VERSION= @VERSION@
+-
+ VPATH= @srcdir@
+ srcdir= @srcdir@
+ bindir= @bindir@
+@@ -30,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -48,7 +45,7 @@ SUBDIRS= Cgi Logging Archiver Handlers Bouncers Queue MTA Gui Commands
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -79,12 +76,6 @@ install: install-here
+ (cd $$d; $(MAKE) DESTDIR=$(DESTDIR) install); \
+ done
+
+-finish:
+- @for d in $(SUBDIRS); \
+- do \
+- (cd $$d; $(MAKE) DESTDIR=$(DESTDIR) finish); \
+- done
+-
+ clean:
+ for d in $(SUBDIRS); \
+ do \
+diff --git a/Mailman/Queue/Makefile.in b/Mailman/Queue/Makefile.in
+index 179f3d9..e0e97ad 100644
+--- a/Mailman/Queue/Makefile.in
++++ b/Mailman/Queue/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -45,7 +44,7 @@ MODULES= *.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -61,8 +60,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/$$f $(DESTDIR)$(PACKAGEDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/Makefile.in b/Makefile.in
+index 40e04f5..eb40844 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -61,11 +61,10 @@ SUBDIRS= bin cron misc Mailman scripts src templates messages tests
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+-DIRSETGID= chmod g+s
+
+ DATE = $(shell python -c 'import time; print time.strftime("%d-%b-%Y"),')
+ LANGPACK = README-I18N.en templates messages
+@@ -85,14 +84,24 @@ install: doinstall update
+
+ doinstall: $(SUBDIRS)
+ @echo "Creating architecture independent directories..."
++ dir=$(DESTDIR)$(prefix); \
++ if test ! -d $$dir; then \
++ echo "Creating directory hierarchy $$dir"; \
++ $(INSTALL) -d -m $(DIRMODE) $$dir; \
++ else true; \
++ fi;
++ dir=$(DESTDIR)$(var_prefix); \
++ if test ! -d $$dir; then \
++ echo "Creating directory hierarchy $$dir"; \
++ $(INSTALL) -d -m $(DIRMODE) $$dir; \
++ else true; \
++ fi;
+ @for d in $(VAR_DIRS); \
+ do \
+ dir=$(DESTDIR)$(var_prefix)/$$d; \
+ if test ! -d $$dir; then \
+ echo "Creating directory hierarchy $$dir"; \
+- $(srcdir)/mkinstalldirs $$dir; \
+- chmod $(DIRMODE) $$dir; \
+- $(DIRSETGID) $$dir; \
++ $(INSTALL) -d -m $(DIRMODE) $$dir; \
+ else true; \
+ fi; \
+ done
+@@ -102,9 +111,7 @@ doinstall: $(SUBDIRS)
+ dir=$(DESTDIR)$(prefix)/$$d; \
+ if test ! -d $$dir; then \
+ echo "Creating directory hierarchy $$dir"; \
+- $(srcdir)/mkinstalldirs $$dir; \
+- chmod $(DIRMODE) $$dir; \
+- $(DIRSETGID) $$dir; \
++ $(INSTALL) -d -m $(DIRMODE) $$dir; \
+ else true; \
+ fi; \
+ done
+@@ -114,9 +121,7 @@ doinstall: $(SUBDIRS)
+ dir=$(DESTDIR)$(exec_prefix)/$$d; \
+ if test ! -d $$dir; then \
+ echo "Creating directory hierarchy $$dir"; \
+- $(srcdir)/mkinstalldirs $$dir; \
+- chmod $(DIRMODE) $$dir; \
+- $(DIRSETGID) $$dir; \
++ $(INSTALL) -d -m $(DIRMODE) $$dir; \
+ else true; \
+ fi; \
+ done
+diff --git a/bin/Makefile.in b/bin/Makefile.in
+index 22c24b0..d795333 100644
+--- a/bin/Makefile.in
++++ b/bin/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -56,7 +55,7 @@ BUILDDIR= ../build/bin
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -72,8 +71,6 @@ install:
+ $(INSTALL) -m $(EXEMODE) $(BUILDDIR)/$$f $(DESTDIR)$(SCRIPTSDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/cron/Makefile.in b/cron/Makefile.in
+index 2a7c8fd..c14d119 100644
+--- a/cron/Makefile.in
++++ b/cron/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -68,8 +67,6 @@ install:
+ $(INSTALL) -m $(EXEMODE) $(BUILDDIR)/$$f $(DESTDIR)$(CRONDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/messages/Makefile.in b/messages/Makefile.in
+index 2bbec3f..0b8b7d6 100644
+--- a/messages/Makefile.in
++++ b/messages/Makefile.in
+@@ -32,7 +32,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -43,7 +42,6 @@ OPT= @OPT@
+ CFLAGS= $(OPT) $(DEFS)
+ PACKAGEDIR= $(prefix)/messages
+ SHELL= /bin/sh
+-DIRSETGID= chmod g+s
+ MSGFMT= @PYTHON@ ../build/bin/msgfmt.py
+ MSGMERGE= msgmerge
+
+@@ -60,7 +58,7 @@ TARGETS= $(MOFILES)
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -90,9 +88,8 @@ doinstall: mofiles
+ do \
+ dir=$(DESTDIR)$(prefix)/$$d; \
+ echo "Creating language directory $$dir"; \
+- $(srcdir)/../mkinstalldirs $$dir; \
+- chmod $(DIRMODE) $$dir; \
+- $(DIRSETGID) $$dir; \
++ $(INSTALL) -d -m $(DIRMODE) `dirname $$dir`; \
++ $(INSTALL) -d -m $(DIRMODE) $$dir; \
+ done
+ @for d in $(LANGUAGES); \
+ do \
+@@ -113,8 +110,6 @@ doinstall: mofiles
+
+ mofiles: $(MOFILES)
+
+-finish:
+-
+ clean:
+ -rm -f */LC_MESSAGES/mailman.mo
+
+diff --git a/misc/Makefile.in b/misc/Makefile.in
+index 5125cd8..af99c04 100644
+--- a/misc/Makefile.in
++++ b/misc/Makefile.in
+@@ -30,7 +30,6 @@ var_prefix= @VAR_PREFIX@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+ PYTHON= @PYTHON@
+
+@@ -62,7 +61,7 @@ PACKAGES= $(EMAILPKG) $(JACODECSPKG) $(KOCODECSPKG)
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ DATAMODE= 664
+@@ -101,8 +100,6 @@ install-packages:
+ (cd $(PKGDIR)/$$p ; umask 02 ; PYTHONPATH=$(PYTHONLIBDIR) $(PYTHON) $(SETUPCMD)); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/scripts/Makefile.in b/scripts/Makefile.in
+index 49b82ec..cea250c 100644
+--- a/scripts/Makefile.in
++++ b/scripts/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -49,7 +48,7 @@ SCRIPTS= bounces confirm driver join leave owner post request
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -68,8 +67,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/join $(DESTDIR)$(SCRIPTSDIR)/subscribe
+ $(INSTALL) -m $(FILEMODE) $(srcdir)/leave $(DESTDIR)$(SCRIPTSDIR)/unsubscribe
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/src/Makefile.in b/src/Makefile.in
+index ce52356..7ed820b 100644
+--- a/src/Makefile.in
++++ b/src/Makefile.in
+@@ -28,7 +28,6 @@ bindir= @bindir@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+ PYTHON= @PYTHON@
+
+@@ -65,10 +64,9 @@ COMMON_FLAGS= -DPREFIX="\"$(prefix)\"" \
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
+-EXEMODE= 755
++DIRMODE= 2775
++EXEMODE= 2755
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+-DIRSETGID= chmod g+s
+
+ # Fixed definitions
+
+@@ -112,20 +110,10 @@ install: all
+ do \
+ exe=$(DESTDIR)$(CGIDIR)/$$f$(CGIEXT); \
+ $(INSTALL_PROGRAM) $$f $$exe; \
+- $(DIRSETGID) $$exe; \
+ done
+ for f in $(MAIL_PROGS); \
+ do \
+ $(INSTALL_PROGRAM) $$f $(DESTDIR)$(MAILDIR); \
+- $(DIRSETGID) $(DESTDIR)$(MAILDIR)/$$f; \
+- done
+-
+-finish:
+- -for f in $(SUID_CGI_PROGS); \
+- do \
+- exe=$(DESTDIR)$(CGIDIR)/$$f$(CGIEXT); \
+- chown $(MAILMAN_USER) $$exe; \
+- chmod u+s $$exe; \
+ done
+
+ clean:
+diff --git a/templates/Makefile.in b/templates/Makefile.in
+index 3dfee3a..b23d7c1 100644
+--- a/templates/Makefile.in
++++ b/templates/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+ TRUE= @TRUE@
+
+@@ -48,7 +47,7 @@ LANGUAGES= ar ast ca cs da de el en es et eu fi fr gl he hr hu ia it ja \
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -61,15 +60,13 @@ all:
+ install:
+ for d in $(LANGUAGES); \
+ do \
+- $(srcdir)/../mkinstalldirs $(DESTDIR)$(TEMPLATEDIR)/$$d; \
++ $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(TEMPLATEDIR)/$$d; \
+ for f in $(srcdir)/$$d/*.html $(srcdir)/$$d/*.txt; \
+ do \
+ $(INSTALL) -m $(FILEMODE) $$f $(DESTDIR)$(TEMPLATEDIR)/$$d; \
+ done; \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/tests/Makefile.in b/tests/Makefile.in
+index 26d6e31..ca92425 100644
+--- a/tests/Makefile.in
++++ b/tests/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -46,7 +45,7 @@ EXECS= $(srcdir)/onebounce.py $(srcdir)/fblast.py
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -71,8 +70,6 @@ install:
+ (cd $$d; $(MAKE) DESTDIR=$(DESTDIR) install); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/tests/bounces/Makefile.in b/tests/bounces/Makefile.in
+index 5798097..f7014cb 100644
+--- a/tests/bounces/Makefile.in
++++ b/tests/bounces/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -46,7 +45,7 @@ BOUNCE_FILES= $(srcdir)/*.txt
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -60,8 +59,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $$f $(DESTDIR)$(BOUNCEDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
+diff --git a/tests/msgs/Makefile.in b/tests/msgs/Makefile.in
+index 736d721..edef5ae 100644
+--- a/tests/msgs/Makefile.in
++++ b/tests/msgs/Makefile.in
+@@ -28,7 +28,6 @@ exec_prefix= @exec_prefix@
+ DESTDIR=
+
+ CC= @CC@
+-CHMOD= @CHMOD@
+ INSTALL= @INSTALL@
+
+ DEFS= @DEFS@
+@@ -46,7 +45,7 @@ MSG_FILES= $(srcdir)/*.txt
+ # Modes for directories and executables created by the install
+ # process. Default to group-writable directories but
+ # user-only-writable for executables.
+-DIRMODE= 775
++DIRMODE= 2775
+ EXEMODE= 755
+ FILEMODE= 644
+ INSTALL_PROGRAM=$(INSTALL) -m $(EXEMODE)
+@@ -60,8 +59,6 @@ install:
+ $(INSTALL) -m $(FILEMODE) $$f $(DESTDIR)$(MSGSDIR); \
+ done
+
+-finish:
+-
+ clean:
+
+ distclean:
diff --git a/SOURCES/mailman-2.1-mailmanctl-status.patch b/SOURCES/mailman-2.1-mailmanctl-status.patch
new file mode 100644
index 0000000..c2bfbf8
--- /dev/null
+++ b/SOURCES/mailman-2.1-mailmanctl-status.patch
@@ -0,0 +1,109 @@
+diff --git a/bin/mailmanctl b/bin/mailmanctl
+index fa14a2c..e291df1 100644
+--- a/bin/mailmanctl
++++ b/bin/mailmanctl
+@@ -36,7 +36,7 @@ in the file data/master-qrunner.pid but you normally don't need to use this
+ pid directly. The `start', `stop', `restart', and `reopen' commands handle
+ everything for you.
+
+-Usage: %(PROGRAM)s [options] [ start | stop | restart | reopen ]
++Usage: %(PROGRAM)s [options] [ start | stop | restart | reopen | status ]
+
+ Options:
+
+@@ -90,6 +90,9 @@ Commands:
+
+ reopen - This will close all log files, causing them to be re-opened the
+ next time a message is written to them
++
++ status - This returns a string indicating the status of the master
++ qrunner
+ """
+
+ import sys
+@@ -190,6 +193,52 @@ def qrunner_state():
+ return 0
+ return 1
+
++def mailman_status():
++ # return status, pid
++ #
++ # These status values match the /etc/init.d status values
++ # (at least on Red Hat), try to return equivalent status if possible
++ # status is 0 if running,
++ # status is 1 if dead but pid file exists
++ # status is 2 if dead but subsys locked
++ # status is 3 if stopped (pid returned will be 0)
++ #
++ #
++ # We want any user to be able to query the status and this presents
++ # few interesting permission problems and is why we don't use
++ # qrunner_state(). The pidfile is only readable by the mailman owner
++ # and group, however the lockfile is world readable. So we will
++ # get the master pid from the lockfile. We try to determine if the
++ # master process exists by sending it a signal. If we don't have
++ # permission to signal the process, but the process exists we'll
++ # get a EPERM error, if the process does not exist then we'll get
++ # a ESRCH error.
++
++ try:
++ hostname, pid, tempfile = get_lock_data()
++ except IOError, e:
++ if e.errno == errno.ENOENT:
++ # Lock file didn't exist, can't be running
++ return 3, 0
++ else:
++ raise
++ if hostname <> socket.gethostname():
++ # not running on this host
++ return 3, 0
++ # Find out if the process exists by calling kill with a signal 0.
++ try:
++ os.kill(pid, 0)
++ except OSError, e:
++ if e.errno == errno.ESRCH:
++ # process does not exist
++ return 1, pid
++ elif e.errno == errno.EPERM:
++ # we don't have permission signal the process but it exists
++ return 0, pid
++ else:
++ raise
++ return 0, pid
++
+
+ def acquire_lock_1(force):
+ # Be sure we can acquire the master qrunner lock. If not, it means some
+@@ -338,13 +387,15 @@ def main():
+ command = COMMASPACE.join(args)
+ usage(1, C_('Bad command: %(command)s'))
+
++ command = args[0].lower()
++
+ if checkprivs:
+ check_privs()
+ else:
+- print C_('Warning! You may encounter permission problems.')
++ if command != 'status':
++ print C_('Warning! You may encounter permission problems.')
+
+ # Handle the commands
+- command = args[0].lower()
+ if command == 'stop':
+ # Sent the master qrunner process a SIGINT, which is equivalent to
+ # giving cron/qrunner a ctrl-c or KeyboardInterrupt. This will
+@@ -363,6 +414,14 @@ def main():
+ if not quiet:
+ print C_('Re-opening all log files')
+ kill_watcher(signal.SIGHUP)
++ elif command == 'status':
++ status, pid = mailman_status()
++ if not quiet:
++ if status == 0:
++ print C_("mailman (pid %(pid)d) is running...")
++ else:
++ print C_("mailman is stopped")
++ sys.exit(status)
+ elif command == 'start':
+ # First, complain loudly if there's no site list.
+ check_for_site_list()
diff --git a/SOURCES/mailman-2.1.11-cron.patch b/SOURCES/mailman-2.1.11-cron.patch
new file mode 100644
index 0000000..5585a0e
--- /dev/null
+++ b/SOURCES/mailman-2.1.11-cron.patch
@@ -0,0 +1,132 @@
+diff --git a/cron/bumpdigests b/cron/bumpdigests
+index 57cc45e..4002731 100755
+--- a/cron/bumpdigests
++++ b/cron/bumpdigests
+@@ -1,4 +1,4 @@
+-#! @PYTHON@
++#! @PYTHON@ -S
+ #
+ # Copyright (C) 1998-2018 by the Free Software Foundation, Inc.
+ #
+diff --git a/cron/checkdbs b/cron/checkdbs
+index e776f15..c4d8179 100755
+--- a/cron/checkdbs
++++ b/cron/checkdbs
+@@ -1,4 +1,4 @@
+-#! @PYTHON@
++#! @PYTHON@ -S
+ #
+ # Copyright (C) 1998-2018 by the Free Software Foundation, Inc.
+ #
+diff --git a/cron/crontab.in.in b/cron/crontab.in.in
+index 540dfc1..45c5022 100644
+--- a/cron/crontab.in.in
++++ b/cron/crontab.in.in
+@@ -1,27 +1,50 @@
++#
++# -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING --
++# ------------------ EDIT THE CORRECT FILE -------------------------
++#
++# This file is copied to /etc/cron.d/mailman from
++# @prefix@/cron/crontab.in when the mailman service is started via its
++# init.d script and the file /etc/cron.d/mailman is removed when the
++# service is stopped. Therefore any edits made directly to
++# /etc/cron.d/mailman will be lost anytime the mailman service
++# restarts.
++#
++# To make changes edit the master copy @prefix@/cron/crontab.in and then
++# restart the service to pick up the changes (/sbin/service mailman restart).
++#
++# The reason this is done this way is because the mailman cron jobs
++# should only be invoked if the mailman service is enabled and not
++# just as a consequence of installing the rpm as was the case
++# previously. The file /etc/cron.d/mailman cannot simply be linked to
++# the master copy in @prefix@/cron because for security reasons cron
++# will not process crontab files that are links or writeable by
++# anybody else but root, thus the file must be copied into /etc/cron.d
++# with the right ownership and permissions.
++#
+ # At 8AM every day, mail reminders to admins as to pending requests.
+ # They are less likely to ignore these reminders if they're mailed
+ # early in the morning, but of course, this is local time... ;)
+-0 8 * * * @PYTHON@ -S @prefix@/cron/checkdbs
++0 8 * * * @MAILMAN_USER@ @prefix@/cron/checkdbs
+ #
+ # At 9AM, send notifications to disabled members that are due to be
+ # reminded to re-enable their accounts.
+-0 9 * * * @PYTHON@ -S @prefix@/cron/disabled
++0 9 * * * @MAILMAN_USER@ @prefix@/cron/disabled
+ #
+ # Noon, mail digests for lists that do periodic as well as threshhold delivery.
+-0 12 * * * @PYTHON@ -S @prefix@/cron/senddigests
++0 12 * * * @MAILMAN_USER@ @prefix@/cron/senddigests
+ #
+ # 5 AM on the first of each month, mail out password reminders.
+-0 5 1 * * @PYTHON@ -S @prefix@/cron/mailpasswds
++0 5 1 * * @MAILMAN_USER@ @prefix@/cron/mailpasswds
+ #
+ # Every 5 mins, try to gate news to mail. You can comment this one out
+ # if you don't want to allow gating, or don't have any going on right now,
+ # or want to exclusively use a callback strategy instead of polling.
+-0,5,10,15,20,25,30,35,40,45,50,55 * * * * @PYTHON@ -S @prefix@/cron/gate_news
++0,5,10,15,20,25,30,35,40,45,50,55 * * * * @MAILMAN_USER@ @prefix@/cron/gate_news
+ #
+ # At 3:27am every night, regenerate the gzip'd archive file. Only
+ # turn this on if the internal archiver is used and
+ # GZIP_ARCHIVE_TXT_FILES is false in mm_cfg.py
+-27 3 * * * @PYTHON@ -S @prefix@/cron/nightly_gzip
++27 3 * * * @MAILMAN_USER@ @prefix@/cron/nightly_gzip
+ #
+ # At 4:30AM daily, cull old entries from the 'bad' and 'shunt' queues.
+-30 4 * * * @PYTHON@ -S @prefix@/cron/cull_bad_shunt
++30 4 * * * @MAILMAN_USER@ @prefix@/cron/cull_bad_shunt
+diff --git a/cron/disabled b/cron/disabled
+index ac62582..971563d 100755
+--- a/cron/disabled
++++ b/cron/disabled
+@@ -1,4 +1,4 @@
+-#! @PYTHON@
++#! @PYTHON@ -S
+ #
+ # Copyright (C) 2001-2018 by the Free Software Foundation, Inc.
+ #
+diff --git a/cron/gate_news b/cron/gate_news
+index c66c09e..247c834 100755
+--- a/cron/gate_news
++++ b/cron/gate_news
+@@ -1,4 +1,4 @@
+-#! @PYTHON@
++#! @PYTHON@ -S
+ #
+ # Copyright (C) 1998-2018 by the Free Software Foundation, Inc.
+ #
+diff --git a/cron/mailpasswds b/cron/mailpasswds
+index da64376..5d8d792 100755
+--- a/cron/mailpasswds
++++ b/cron/mailpasswds
+@@ -1,4 +1,4 @@
+-#! @PYTHON@
++#! @PYTHON@ -S
+ #
+ # Copyright (C) 1998-2018 by the Free Software Foundation, Inc.
+ #
+diff --git a/cron/nightly_gzip b/cron/nightly_gzip
+index de493d0..8af0351 100755
+--- a/cron/nightly_gzip
++++ b/cron/nightly_gzip
+@@ -1,4 +1,4 @@
+-#! @PYTHON@
++#! @PYTHON@ -S
+ #
+ # Copyright (C) 1998-2018 by the Free Software Foundation, Inc.
+ #
+diff --git a/cron/senddigests b/cron/senddigests
+index edf27a2..c64adc1 100755
+--- a/cron/senddigests
++++ b/cron/senddigests
+@@ -1,4 +1,4 @@
+-#! @PYTHON@
++#! @PYTHON@ -S
+ #
+ # Copyright (C) 1998-2018 by the Free Software Foundation, Inc.
+ #
diff --git a/SOURCES/mailman-2.1.12-multimail.patch b/SOURCES/mailman-2.1.12-multimail.patch
new file mode 100644
index 0000000..5264a77
--- /dev/null
+++ b/SOURCES/mailman-2.1.12-multimail.patch
@@ -0,0 +1,387 @@
+diff -ruN mailman-2.1.12-a/configure.in mailman-2.1.12-b/configure.in
+--- mailman-2.1.12-a/configure.in 2009-02-23 22:23:35.000000000 +0100
++++ mailman-2.1.12-b/configure.in 2009-07-28 12:19:47.000000000 +0200
+@@ -249,26 +249,101 @@
+ fi
+
+ # new macro for finding group names
+-AC_DEFUN([MM_FIND_GROUP_NAME], [
++# returns a comma separated list of quoted group names
++# the list is returned in the same order as specified with any duplicates removed
++# the filter flag must be "yes" or "no", e.g. this is permcheck
++# "no" ==> none existing groups are not filtered out
++# "yes" ==> only those groups that are in the group database are included
++# in the list
++AC_DEFUN(MM_FIND_GROUP_LIST, [
+ # $1 == variable name
+-# $2 == user id to check for
++# $2 == white space separated list of groups to check,
++# list may contain mix of id's and names
++# $3 == filter, if == 'yes' then remove any non-existing groups
+ AC_SUBST($1)
+ changequote(,)
+ if test -z "$$1"
+ then
+ cat > conftest.py < conftest.py < conftest.py <gr_name) == 0) break;
++ }
++
++ if (i >= numgroups) {
++ char *groupset = NULL;
++ size_t size = 0;
++
++ for (i = 0; i < numgroups; i++) {
++ size += strlen(parentgroups[i]) + 2;
++ }
++
++ groupset = malloc(size);
++
++ if (groupset) {
++ groupset[0] = 0;
++ for (i = 0; i < numgroups; i++) {
++ strcat(groupset, parentgroups[i]);
++ if (i < numgroups-1) strcat(groupset, ", ");
++ }
++ }
+
+- if (strcmp(parentgroup, mygroup->gr_name))
+ fatal(ident, GROUP_MISMATCH,
+- "Group mismatch error. Mailman expected the %s\n"
+- "wrapper script to be executed as group \"%s\", but\n"
+- "the system's %s server executed the %s script as\n"
+- "group \"%s\". Try tweaking the %s server to run the\n"
+- "script as group \"%s\", or re-run configure, \n"
+- "providing the command line option `%s=%s'.",
+- wrapper, parentgroup, server, wrapper, mygroup->gr_name,
+- server, parentgroup, option, mygroup->gr_name);
++ "Group mismatch error. Mailman expected the %s wrapper script to be\n"
++ "executed as one of the following groups:\n"
++ "[%s],\n"
++ "but the system's %s server executed the %s script as group: \"%s\".\n"
++ "Try tweaking the %s server to run the script as one of these groups:\n"
++ "[%s],\n"
++ "or re-run configure providing the command line option:\n"
++ "'%s=%s'.",
++ wrapper, groupset, server, wrapper, mygroup->gr_name,
++ server, groupset, option, mygroup->gr_name);
++ }
+ }
+
+
+diff -ruN mailman-2.1.12-a/src/common.h mailman-2.1.12-b/src/common.h
+--- mailman-2.1.12-a/src/common.h 2009-02-23 22:23:35.000000000 +0100
++++ mailman-2.1.12-b/src/common.h 2009-07-28 12:19:47.000000000 +0200
+@@ -33,7 +33,7 @@
+ #define GID_T GETGROUPS_T
+
+ extern void fatal(const char*, int, char*, ...);
+-extern void check_caller(const char*, const char*);
++extern void check_caller(const char* ident, const char**, size_t);
+ extern int run_script(const char*, int, char**, char**);
+
+ /* Global variable used as a flag. */
+@@ -51,7 +51,7 @@
+ #define MAIL_USAGE_ERROR 5
+ #define MAIL_ILLEGAL_COMMAND 6
+ #define ADDALIAS_USAGE_ERROR 7
+-#define GROUP_NAME_NOT_FOUND 8
++#define GROUP_ID_NOT_FOUND 8
+
+
+ /*
+diff -ruN mailman-2.1.12-a/src/mail-wrapper.c mailman-2.1.12-b/src/mail-wrapper.c
+--- mailman-2.1.12-a/src/mail-wrapper.c 2009-02-23 22:23:35.000000000 +0100
++++ mailman-2.1.12-b/src/mail-wrapper.c 2009-07-28 12:19:47.000000000 +0200
+@@ -23,9 +23,9 @@
+ /* Group name that your mail programs run as. See your mail server's
+ * documentation for details.
+ */
+-#define LEGAL_PARENT_GROUP MAIL_GROUP
++#define LEGAL_PARENT_GROUPS MAIL_GROUP
+
+-const char* parentgroup = LEGAL_PARENT_GROUP;
++const char* parentgroups[] = {LEGAL_PARENT_GROUPS};
+ const char* logident = "Mailman mail-wrapper";
+
+
+@@ -74,7 +74,7 @@
+ fatal(logident, MAIL_ILLEGAL_COMMAND,
+ "Illegal command: %s", argv[1]);
+
+- check_caller(logident, parentgroup);
++ check_caller(logident, parentgroups, sizeof(parentgroups) / sizeof(parentgroups[0]));
+
+ /* If we got here, everything must be OK */
+ status = run_script(argv[1], argc, argv, env);
+diff -ruN mailman-2.1.12-a/src/Makefile.in mailman-2.1.12-b/src/Makefile.in
+--- mailman-2.1.12-a/src/Makefile.in 2009-02-23 22:23:35.000000000 +0100
++++ mailman-2.1.12-b/src/Makefile.in 2009-07-28 12:19:47.000000000 +0200
+@@ -49,9 +49,9 @@
+
+ SHELL= /bin/sh
+
+-MAIL_FLAGS= -DMAIL_GROUP="\"$(MAIL_GROUP)\""
++MAIL_FLAGS= -DMAIL_GROUP='$(MAIL_GROUP)'
+
+-CGI_FLAGS= -DCGI_GROUP="\"$(CGI_GROUP)\""
++CGI_FLAGS= -DCGI_GROUP='$(CGI_GROUP)'
+
+ HELPFUL= -DHELPFUL
+
diff --git a/SOURCES/mailman-2.1.13-FHS.patch b/SOURCES/mailman-2.1.13-FHS.patch
new file mode 100644
index 0000000..bb05f9f
--- /dev/null
+++ b/SOURCES/mailman-2.1.13-FHS.patch
@@ -0,0 +1,243 @@
+diff --git a/Mailman/Defaults.py.in b/Mailman/Defaults.py.in
+index fb3f4f3..7dde965 100644
+--- a/Mailman/Defaults.py.in
++++ b/Mailman/Defaults.py.in
+@@ -1431,20 +1431,22 @@ AuthListPoster = 6 # List poster (Approved: header in posts only)
+
+ # Useful directories
+ LIST_DATA_DIR = os.path.join(VAR_PREFIX, 'lists')
+-LOG_DIR = os.path.join(VAR_PREFIX, 'logs')
+-LOCK_DIR = os.path.join(VAR_PREFIX, 'locks')
++LOG_DIR = '@LOG_DIR@'
++LOCK_DIR = '@LOCK_DIR@'
++CONFIG_DIR = '@CONFIG_DIR@'
+ DATA_DIR = os.path.join(VAR_PREFIX, 'data')
++PID_DIR = '@PID_DIR@'
+ SPAM_DIR = os.path.join(VAR_PREFIX, 'spam')
+ WRAPPER_DIR = os.path.join(EXEC_PREFIX, 'mail')
+ BIN_DIR = os.path.join(PREFIX, 'bin')
+ SCRIPTS_DIR = os.path.join(PREFIX, 'scripts')
+-TEMPLATE_DIR = os.path.join(PREFIX, 'templates')
++TEMPLATE_DIR = '@TEMPLATE_DIR@'
+ MESSAGES_DIR = os.path.join(PREFIX, 'messages')
+ PUBLIC_ARCHIVE_FILE_DIR = os.path.join(VAR_PREFIX, 'archives', 'public')
+ PRIVATE_ARCHIVE_FILE_DIR = os.path.join(VAR_PREFIX, 'archives', 'private')
+
+ # Directories used by the qrunner subsystem
+-QUEUE_DIR = os.path.join(VAR_PREFIX, 'qfiles')
++QUEUE_DIR = '@QUEUE_DIR@'
+ INQUEUE_DIR = os.path.join(QUEUE_DIR, 'in')
+ OUTQUEUE_DIR = os.path.join(QUEUE_DIR, 'out')
+ CMDQUEUE_DIR = os.path.join(QUEUE_DIR, 'commands')
+@@ -1458,9 +1460,9 @@ RETRYQUEUE_DIR = os.path.join(QUEUE_DIR, 'retry')
+ MAILDIR_DIR = os.path.join(QUEUE_DIR, 'maildir')
+
+ # Other useful files
+-PIDFILE = os.path.join(DATA_DIR, 'master-qrunner.pid')
+-SITE_PW_FILE = os.path.join(DATA_DIR, 'adm.pw')
+-LISTCREATOR_PW_FILE = os.path.join(DATA_DIR, 'creator.pw')
++PIDFILE = os.path.join(PID_DIR, 'master-qrunner.pid')
++SITE_PW_FILE = os.path.join(CONFIG_DIR, 'adm.pw')
++LISTCREATOR_PW_FILE = os.path.join(CONFIG_DIR, 'creator.pw')
+
+ # Import a bunch of version numbers
+ from Version import *
+diff --git a/Mailman/MTA/Postfix.py b/Mailman/MTA/Postfix.py
+index 801ddc0..8506b9b 100644
+--- a/Mailman/MTA/Postfix.py
++++ b/Mailman/MTA/Postfix.py
+@@ -32,8 +32,8 @@ from Mailman.MTA.Utils import makealiases
+ from Mailman.Logging.Syslog import syslog
+
+ LOCKFILE = os.path.join(mm_cfg.LOCK_DIR, 'creator')
+-ALIASFILE = os.path.join(mm_cfg.DATA_DIR, 'aliases')
+-VIRTFILE = os.path.join(mm_cfg.DATA_DIR, 'virtual-mailman')
++ALIASFILE = os.path.join(mm_cfg.CONFIG_DIR, 'aliases')
++VIRTFILE = os.path.join(mm_cfg.CONFIG_DIR, 'virtual-mailman')
+ # Desired mode for aliases(.db) and virtual-mailman(.db) for both creation
+ # and check_perms.
+ targetmode = S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH
+diff --git a/Makefile.in b/Makefile.in
+index eb40844..289aeee 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -28,6 +28,12 @@ bindir= @bindir@
+ prefix= @prefix@
+ exec_prefix= @exec_prefix@
+ var_prefix= @VAR_PREFIX@
++configdir= @CONFIG_DIR@
++lockdir= @LOCK_DIR@
++logdir= @LOG_DIR@
++piddir= @PID_DIR@
++queuedir= @QUEUE_DIR@
++templatedir= @TEMPLATE_DIR@
+ DESTDIR=
+
+ CC= @CC@
+@@ -41,8 +47,11 @@ DEFS= @DEFS@
+ OPT= @OPT@
+ CFLAGS= @CFLAGS@ $(OPT) $(DEFS)
+
++FHS_DIRS= \
++ ${configdir} ${lockdir} ${logdir} ${piddir} ${queuedir} ${templatedir}
++
+ VAR_DIRS= \
+- logs archives lists locks data spam qfiles \
++ archives lists data spam \
+ archives/private archives/public
+
+ ARCH_INDEP_DIRS= \
+@@ -105,6 +114,15 @@ doinstall: $(SUBDIRS)
+ else true; \
+ fi; \
+ done
++ @for d in $(FHS_DIRS); \
++ do \
++ dir=$(DESTDIR)/$$d; \
++ if test ! -d $$dir; then \
++ echo "Creating directory $$dir"; \
++ $(INSTALL) -d -m $(DIRMODE) $$dir; \
++ else true; \
++ fi; \
++ done
+ chmod o-r $(DESTDIR)$(var_prefix)/archives/private
+ @for d in $(ARCH_INDEP_DIRS); \
+ do \
+diff --git a/bin/check_perms b/bin/check_perms
+index 137ebfb..1f45f84 100755
+--- a/bin/check_perms
++++ b/bin/check_perms
+@@ -183,7 +183,8 @@ def checkall():
+ print C_('checking mode for %(prefix)s')
+ dirs = {}
+ for d in (mm_cfg.PREFIX, mm_cfg.EXEC_PREFIX, mm_cfg.VAR_PREFIX,
+- mm_cfg.LOG_DIR):
++ mm_cfg.CONFIG_DIR, mm_cfg.DATA_DIR, mm_cfg.LOCK_DIR,
++ mm_cfg.LOG_DIR, mm_cfg.QUEUE_DIR, mm_cfg.PID_DIR):
+ dirs[d] = True
+ for d in dirs.keys():
+ try:
+diff --git a/configure.in b/configure.in
+index f2eb1c0..c01129c 100644
+--- a/configure.in
++++ b/configure.in
+@@ -305,6 +305,72 @@ else
+ prefixcheck=$VAR_PREFIX
+ fi
+
++# Get the configuration file directory
++AC_SUBST(CONFIG_DIR)
++AC_MSG_CHECKING(for --with-config-dir)
++AC_ARG_WITH(config-dir, dnl
++[ --with-config-dir specify directory for configuration data other than [VAR_]PREFIX/data])
++case "$with_config_dir" in
++ yes|no|"") CONFIG_DIR="$VAR_PREFIX/data";;
++ *) CONFIG_DIR=$with_config_dir;;
++esac
++AC_MSG_RESULT($CONFIG_DIR)
++
++# Get the lock directory
++AC_SUBST(LOCK_DIR)
++AC_MSG_CHECKING(for --with-lock-dir)
++AC_ARG_WITH(lock-dir, dnl
++[ --with-lock-dir specify directory for lock files other than [VAR_]PREFIX/locks])
++case "$with_lock_dir" in
++ yes|no|"") LOCK_DIR="$VAR_PREFIX/locks";;
++ *) LOCK_DIR=$with_lock_dir;;
++esac
++AC_MSG_RESULT($LOCK_DIR)
++
++# Get the log directory
++AC_SUBST(LOG_DIR)
++AC_MSG_CHECKING(for --with-log-dir)
++AC_ARG_WITH(log-dir, dnl
++[ --with-log-dir specify directory for log files other than [VAR_]PREFIX/logs])
++case "$with_log_dir" in
++ yes|no|"") LOG_DIR="$VAR_PREFIX/logs";;
++ *) LOG_DIR=$with_log_dir;;
++esac
++AC_MSG_RESULT($LOG_DIR)
++
++# Get the pid directory
++AC_SUBST(PID_DIR)
++AC_MSG_CHECKING(for --with-pid-dir)
++AC_ARG_WITH(pid-dir, dnl
++[ --with-pid-dir specify directory for the pid file other than [VAR_]PREFIX/data])
++case "$with_pid_dir" in
++ yes|no|"") PID_DIR="$VAR_PREFIX/data";;
++ *) PID_DIR=$with_pid_dir;;
++esac
++AC_MSG_RESULT($PID_DIR)
++
++# Get the queue directory
++AC_SUBST(QUEUE_DIR)
++AC_MSG_CHECKING(for --with-queue-dir)
++AC_ARG_WITH(queue-dir, dnl
++[ --with-queue-dir specify directory for queue files other than [VAR_]PREFIX/qfiles])
++case "$with_queue_dir" in
++ yes|no|"") QUEUE_DIR="$VAR_PREFIX/qfiles";;
++ *) QUEUE_DIR=$with_queue_dir;;
++esac
++AC_MSG_RESULT($QUEUE_DIR)
++
++# Get the template directory
++AC_SUBST(TEMPLATE_DIR)
++AC_MSG_CHECKING(for --with-template-dir)
++AC_ARG_WITH(template-dir, dnl
++[ --with-template-dir specify directory for template files other than [VAR_]PREFIX/templates])
++case "$with_template_dir" in
++ yes|no|"") TEMPLATE_DIR="$VAR_PREFIX/templates";;
++ *) TEMPLATE_DIR=$with_template_dir;;
++esac
++AC_MSG_RESULT($TEMPLATE_DIR)
++
+ # new macro for finding group names
+ # returns a comma separated list of quoted group names
+ # the list is returned in the same order as specified with any duplicates removed
+diff --git a/misc/Makefile.in b/misc/Makefile.in
+index af99c04..df50a06 100644
+--- a/misc/Makefile.in
++++ b/misc/Makefile.in
+@@ -27,6 +27,12 @@ bindir= @bindir@
+ prefix= @prefix@
+ exec_prefix= @exec_prefix@
+ var_prefix= @VAR_PREFIX@
++configdir= @CONFIG_DIR@
++lockdir= @LOCK_DIR@
++logdir= @LOG_DIR@
++piddir= @PID_DIR@
++queuedir= @QUEUE_DIR@
++MAILMAN_GROUP= @MAILMAN_GROUP@
+ DESTDIR=
+
+ CC= @CC@
+@@ -87,7 +93,7 @@ install-other:
+ $(INSTALL) -m $(FILEMODE) paths.py $$dir; \
+ done
+ $(INSTALL) -m $(EXEMODE) mailman $(DESTDIR)$(SCRIPTSDIR)
+- $(INSTALL) -m $(FILEMODE) sitelist.cfg $(DESTDIR)$(DATADIR)
++ $(INSTALL) -m $(FILEMODE) sitelist.cfg $(DESTDIR)$(configdir)
+
+ install-packages:
+ if [ -z "$(EMAILPKG)" -a -d $(DESTDIR)$(PYTHONLIBDIR)/email ] ; \
+diff --git a/templates/Makefile.in b/templates/Makefile.in
+index b23d7c1..16930a2 100644
+--- a/templates/Makefile.in
++++ b/templates/Makefile.in
+@@ -25,6 +25,7 @@ srcdir= @srcdir@
+ bindir= @bindir@
+ prefix= @prefix@
+ exec_prefix= @exec_prefix@
++template_dir= @TEMPLATE_DIR@
+ DESTDIR=
+
+ CC= @CC@
+@@ -37,7 +38,7 @@ DEFS= @DEFS@
+
+ OPT= @OPT@
+ CFLAGS= $(OPT) $(DEFS)
+-TEMPLATEDIR= $(prefix)/templates
++TEMPLATEDIR= $(template_dir)
+
+ SHELL= /bin/sh
+
diff --git a/SOURCES/mailman-2.1.13-archive-reply.patch b/SOURCES/mailman-2.1.13-archive-reply.patch
new file mode 100644
index 0000000..7e1779b
--- /dev/null
+++ b/SOURCES/mailman-2.1.13-archive-reply.patch
@@ -0,0 +1,21 @@
+diff -up mailman-2.1.13/templates/en/article.html.archive-reply mailman-2.1.13/templates/en/article.html
+--- mailman-2.1.13/templates/en/article.html.archive-reply 2009-12-22 19:00:43.000000000 +0100
++++ mailman-2.1.13/templates/en/article.html 2010-03-25 13:50:02.000000000 +0100
+@@ -4,7 +4,7 @@
+ %(title)s
+
+
+-
++
+
+