diff -u -N -r Mail-SpamAssassin-2.60-dist/Makefile.PL Mail-SpamAssassin-2.60/Makefile.PL --- Mail-SpamAssassin-2.60-dist/Makefile.PL Fri Jun 27 11:48:37 2003 +++ Mail-SpamAssassin-2.60/Makefile.PL Mon Jun 30 16:22:34 2003 @@ -90,7 +90,7 @@ 'VERSION_FROM' => 'lib/Mail/SpamAssassin.pm', # finds $VERSION 'EXE_FILES' => [ - 'spamassassin', 'sa-learn', + 'spamassassin', 'sa-learn', 'sa-btok-learn', @SPAMD_EXE_FILES ], @@ -322,6 +322,10 @@ $(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@ $(CHMOD) $(PERM_RWX) $@ +sa-btok-learn: sa-btok-learn.raw + $(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@ + $(CHMOD) $(PERM_RWX) $@ + spamd/spamd: spamd/spamd.raw $(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@ $(CHMOD) $(PERM_RWX) $@ diff -u -N -r Mail-SpamAssassin-2.60-dist/Makefile.old Mail-SpamAssassin-2.60/Makefile.old --- Mail-SpamAssassin-2.60-dist/Makefile.old Wed Dec 31 16:00:00 1969 +++ Mail-SpamAssassin-2.60/Makefile.old Tue Jul 1 14:39:10 2003 @@ -0,0 +1,1060 @@ +# This Makefile is for the Mail::SpamAssassin extension to perl. +# +# It was generated automatically by MakeMaker version +# 5.45 (Revision: 1.222) from the contents of +# Makefile.PL. Don't edit this file, edit Makefile.PL instead. +# +# ANY CHANGES MADE HERE WILL BE LOST! +# +# MakeMaker ARGV: () +# +# MakeMaker Parameters: + +# ABSTRACT => q[identify spam mail using text analysis] +# AUTHOR => q[Justin Mason ] +# EXE_FILES => [q[spamassassin], q[sa-learn], q[sa-btok-learn], q[spamd/spamc$(EXE_EXT)], q[spamd/spamd]] +# MAN1PODS => { spamd/spamd=>q[$(INST_MAN1DIR)/spamd.$(MAN1EXT)], sa-learn=>q[$(INST_MAN1DIR)/sa-learn.$(MAN1EXT)], spamassassin=>q[$(INST_MAN1DIR)/spamassassin.$(MAN1EXT)], spamd/spamc.pod=>q[$(INST_MAN1DIR)/spamc.$(MAN1EXT)] } +# NAME => q[Mail::SpamAssassin] +# PL_FILES => { } +# PMLIBDIRS => [q[lib]] +# PM_FILTER => q[$(PERL) build/preprocessor -Mconditional $(FIXBYTES) -Mvars -DVERSION="$(VERSION)" -DPREFIX="$(INST_PREFIX)"] +# PREREQ_PM => { Text::Wrap=>q[0], Pod::Usage=>q[0], Errno=>q[0], HTML::Parser=>q[3], File::Spec=>q[0.8], ExtUtils::MakeMaker=>q[0], Time::Local=>q[0], File::Copy=>q[0] } +# VERSION_FROM => q[lib/Mail/SpamAssassin.pm] +# clean => { FILES=>q[pod2htm* spamassassin sa-learn spamd/spamc$(EXE_EXT) spamd/libspamc.so spamd/spamd doc spamd/libsslspamc.so binaries.mk config.h config.status config.cache config.log autom4te.cache qmail/qmail-spamct/do_razor2 t/log] } +# dist => { DIST_DEFAULT=>q[tardist], COMPRESS=>q[gzip -9f], SUFFIX=>q[gz] } +# macro => { RULES=>q[10_misc.cf 20_anti_ratware.cf 20_body_tests.cf 20_compensate.cf 20_dnsbl_tests.cf 20_fake_helo_tests.cf 20_head_tests.cf 20_html_tests.cf 20_meta_tests.cf 20_phrases.cf 20_porn.cf 20_ratware.cf 20_uri_tests.cf 23_bayes.cf 25_body_tests_es.cf 25_body_tests_pl.cf 25_head_tests_es.cf 25_head_tests_pl.cf 30_text_de.cf 30_text_es.cf 30_text_fr.cf 30_text_it.cf 30_text_pl.cf 30_text_sk.cf 50_scores.cf 60_whitelist.cf user_prefs.template triplets.txt languages] } + +# --- MakeMaker post_initialize section: + + +# --- MakeMaker const_config section: + +# These definitions are from config.sh (via /usr/lib/perl5/5.6.1/i386-linux/Config.pm) + +# They may have been overridden via Makefile.PL or on the command line +AR = ar +CC = gcc +CCCDLFLAGS = -fPIC +CCDLFLAGS = -rdynamic +DLEXT = so +DLSRC = dl_dlopen.xs +LD = gcc +LDDLFLAGS = -shared -L/usr/local/lib +LDFLAGS = -L/usr/local/lib +LIBC = /lib/libc-2.2.5.so +LIB_EXT = .a +OBJ_EXT = .o +OSNAME = linux +OSVERS = 2.4.17-0.13smp +RANLIB = : +SO = so +EXE_EXT = +FULL_AR = /usr/bin/ar + + +# --- MakeMaker constants section: +AR_STATIC_ARGS = cr +NAME = Mail::SpamAssassin +DISTNAME = Mail-SpamAssassin +NAME_SYM = Mail_SpamAssassin +VERSION = 2.60 +VERSION_SYM = 2_60 +XS_VERSION = 2.60 +INST_BIN = blib/bin +INST_EXE = blib/script +INST_LIB = blib/lib +INST_ARCHLIB = blib/arch +INST_SCRIPT = blib/script +PREFIX = /usr +SITEPREFIX = $(PREFIX) +VENDORPREFIX = $(PREFIX) +INSTALLDIRS = site +INSTALLPRIVLIB = $(PREFIX)/lib/perl5/5.6.1 +INSTALLARCHLIB = $(PREFIX)/lib/perl5/5.6.1/i386-linux +INSTALLSITELIB = $(SITEPREFIX)/lib/perl5/site_perl/5.6.1 +INSTALLSITEARCH = $(SITEPREFIX)/lib/perl5/site_perl/5.6.1/i386-linux +INSTALLVENDORLIB = $(VENDORPREFIX)/lib/perl5/vendor_perl/5.6.1 +INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5/vendor_perl/5.6.1/i386-linux +INSTALLBIN = $(PREFIX)/bin +INSTALLSCRIPT = $(PREFIX)/bin +INSTALLSITEBIN = $(SITEPREFIX)/bin +PERL_LIB = /usr/lib/perl5/5.6.1 +PERL_ARCHLIB = /usr/lib/perl5/5.6.1/i386-linux +SITELIBEXP = /usr/lib/perl5/site_perl/5.6.1 +SITEARCHEXP = /usr/lib/perl5/site_perl/5.6.1/i386-linux +LIBPERL_A = libperl.a +FIRST_MAKEFILE = Makefile +MAKE_APERL_FILE = Makefile.aperl +PERLMAINCC = $(CC) +PERL_INC = /usr/lib/perl5/5.6.1/i386-linux/CORE +PERL = /usr/bin/perl +FULLPERL = /usr/bin/perl +FULL_AR = /usr/bin/ar + +VERSION_MACRO = VERSION +DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\" +XS_VERSION_MACRO = XS_VERSION +XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\" +PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc + +MAKEMAKER = /usr/lib/perl5/5.6.1/ExtUtils/MakeMaker.pm +MM_VERSION = 5.45 + +# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle). +# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle) +# ROOTEXT = Directory part of FULLEXT with leading slash (eg /DBD) !!! Deprecated from MM 5.32 !!! +# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar) +# DLBASE = Basename part of dynamic library. May be just equal BASEEXT. +FULLEXT = Mail/SpamAssassin +BASEEXT = SpamAssassin +PARENT_NAME = Mail +DLBASE = $(BASEEXT) +VERSION_FROM = lib/Mail/SpamAssassin.pm +OBJECT = +LDFROM = $(OBJECT) +LINKTYPE = dynamic +PM_FILTER = $(PERL) build/preprocessor -Mconditional $(FIXBYTES) -Mvars -DVERSION="$(VERSION)" -DPREFIX="$(INST_PREFIX)" + +# Handy lists of source code files: +XS_FILES= +C_FILES = +O_FILES = +H_FILES = acconfig.h +HTMLLIBPODS = +HTMLSCRIPTPODS = +MAN1PODS = sa-learn \ + spamassassin \ + spamd/spamc.pod \ + spamd/spamd +MAN3PODS = lib/Mail/SpamAssassin.pm \ + lib/Mail/SpamAssassin/AutoWhitelist.pm \ + lib/Mail/SpamAssassin/Bayes.pm \ + lib/Mail/SpamAssassin/BayesTokenLog.pm \ + lib/Mail/SpamAssassin/Conf.pm \ + lib/Mail/SpamAssassin/ConfSourceSQL.pm \ + lib/Mail/SpamAssassin/PerMsgLearner.pm \ + lib/Mail/SpamAssassin/PerMsgStatus.pm \ + lib/Mail/SpamAssassin/PersistentAddrList.pm \ + lib/Mail/SpamAssassin/StateDirHash.pm +HTMLEXT = html +INST_MAN1DIR = blib/man1 +INSTALLMAN1DIR = $(PREFIX)/share/man/man1 +INSTALLSITEMAN1DIR = $(SITEPREFIX)/share/man/man1 +INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1 +MAN1EXT = 1 +INST_MAN3DIR = blib/man3 +INSTALLMAN3DIR = $(PREFIX)/share/man/man3 +INSTALLSITEMAN3DIR = $(SITEPREFIX)/share/man/man3 +INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3 +MAN3EXT = 3pm +PERM_RW = 644 +PERM_RWX = 755 + +# work around a famous dec-osf make(1) feature(?): +makemakerdflt: all + +.SUFFIXES: .xs .c .C .cpp .cxx .cc $(OBJ_EXT) + +# Nick wanted to get rid of .PRECIOUS. I don't remember why. I seem to recall, that +# some make implementations will delete the Makefile when we rebuild it. Because +# we call false(1) when we rebuild it. So make(1) is not completely wrong when it +# does so. Our milage may vary. +# .PRECIOUS: Makefile # seems to be not necessary anymore + +.PHONY: all config static dynamic test linkext manifest + +# Where is the Config information that we are using/depend on +CONFIGDEP = $(PERL_ARCHLIB)/Config.pm $(PERL_INC)/config.h + +# Where to put things: +INST_LIBDIR = $(INST_LIB)/Mail +INST_ARCHLIBDIR = $(INST_ARCHLIB)/Mail + +INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT) +INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT) + +INST_STATIC = +INST_DYNAMIC = +INST_BOOT = + +EXPORT_LIST = + +PERL_ARCHIVE = + +PERL_ARCHIVE_AFTER = + +TO_INST_PM = lib/Mail/SpamAssassin.pm \ + lib/Mail/SpamAssassin/ArchiveIterator.pm \ + lib/Mail/SpamAssassin/AuditMessage.pm \ + lib/Mail/SpamAssassin/AutoWhitelist.pm \ + lib/Mail/SpamAssassin/Bayes.pm \ + lib/Mail/SpamAssassin/BayesStore.pm \ + lib/Mail/SpamAssassin/BayesTokenLog.pm \ + lib/Mail/SpamAssassin/CmdLearn.pm \ + lib/Mail/SpamAssassin/Conf.pm \ + lib/Mail/SpamAssassin/ConfSourceSQL.pm \ + lib/Mail/SpamAssassin/DBBasedAddrList.pm \ + lib/Mail/SpamAssassin/Dns.pm \ + lib/Mail/SpamAssassin/EncappedMIME.pm \ + lib/Mail/SpamAssassin/EncappedMessage.pm \ + lib/Mail/SpamAssassin/EvalTests.pm \ + lib/Mail/SpamAssassin/HTML.pm \ + lib/Mail/SpamAssassin/Locales.pm \ + lib/Mail/SpamAssassin/Locker.pm \ + lib/Mail/SpamAssassin/MailingList.pm \ + lib/Mail/SpamAssassin/Message.pm \ + lib/Mail/SpamAssassin/NetSet.pm \ + lib/Mail/SpamAssassin/NoMailAudit.pm \ + lib/Mail/SpamAssassin/PerMsgLearner.pm \ + lib/Mail/SpamAssassin/PerMsgStatus.pm \ + lib/Mail/SpamAssassin/PersistentAddrList.pm \ + lib/Mail/SpamAssassin/PhraseFreqs.pm \ + lib/Mail/SpamAssassin/Received.pm \ + lib/Mail/SpamAssassin/Replier.pm \ + lib/Mail/SpamAssassin/Reporter.pm \ + lib/Mail/SpamAssassin/SHA1.pm \ + lib/Mail/SpamAssassin/StateDirHash.pm \ + lib/Mail/SpamAssassin/TextCat.pm \ + lib/Mail/SpamAssassin/UnixLocker.pm \ + lib/Mail/SpamAssassin/Util.pm \ + lib/Mail/SpamAssassin/Win32Locker.pm + +PM_TO_BLIB = lib/Mail/SpamAssassin/NetSet.pm \ + $(INST_LIB)/Mail/SpamAssassin/NetSet.pm \ + lib/Mail/SpamAssassin/StateDirHash.pm \ + $(INST_LIB)/Mail/SpamAssassin/StateDirHash.pm \ + lib/Mail/SpamAssassin/Bayes.pm \ + $(INST_LIB)/Mail/SpamAssassin/Bayes.pm \ + lib/Mail/SpamAssassin/ConfSourceSQL.pm \ + $(INST_LIB)/Mail/SpamAssassin/ConfSourceSQL.pm \ + lib/Mail/SpamAssassin/DBBasedAddrList.pm \ + $(INST_LIB)/Mail/SpamAssassin/DBBasedAddrList.pm \ + lib/Mail/SpamAssassin/PerMsgStatus.pm \ + $(INST_LIB)/Mail/SpamAssassin/PerMsgStatus.pm \ + lib/Mail/SpamAssassin/Reporter.pm \ + $(INST_LIB)/Mail/SpamAssassin/Reporter.pm \ + lib/Mail/SpamAssassin/SHA1.pm \ + $(INST_LIB)/Mail/SpamAssassin/SHA1.pm \ + lib/Mail/SpamAssassin/HTML.pm \ + $(INST_LIB)/Mail/SpamAssassin/HTML.pm \ + lib/Mail/SpamAssassin/Win32Locker.pm \ + $(INST_LIB)/Mail/SpamAssassin/Win32Locker.pm \ + lib/Mail/SpamAssassin/ArchiveIterator.pm \ + $(INST_LIB)/Mail/SpamAssassin/ArchiveIterator.pm \ + lib/Mail/SpamAssassin/PerMsgLearner.pm \ + $(INST_LIB)/Mail/SpamAssassin/PerMsgLearner.pm \ + lib/Mail/SpamAssassin/AutoWhitelist.pm \ + $(INST_LIB)/Mail/SpamAssassin/AutoWhitelist.pm \ + lib/Mail/SpamAssassin/PhraseFreqs.pm \ + $(INST_LIB)/Mail/SpamAssassin/PhraseFreqs.pm \ + lib/Mail/SpamAssassin/Util.pm \ + $(INST_LIB)/Mail/SpamAssassin/Util.pm \ + lib/Mail/SpamAssassin/Dns.pm \ + $(INST_LIB)/Mail/SpamAssassin/Dns.pm \ + lib/Mail/SpamAssassin/Message.pm \ + $(INST_LIB)/Mail/SpamAssassin/Message.pm \ + lib/Mail/SpamAssassin/EvalTests.pm \ + $(INST_LIB)/Mail/SpamAssassin/EvalTests.pm \ + lib/Mail/SpamAssassin/Locales.pm \ + $(INST_LIB)/Mail/SpamAssassin/Locales.pm \ + lib/Mail/SpamAssassin/Conf.pm \ + $(INST_LIB)/Mail/SpamAssassin/Conf.pm \ + lib/Mail/SpamAssassin/Replier.pm \ + $(INST_LIB)/Mail/SpamAssassin/Replier.pm \ + lib/Mail/SpamAssassin.pm \ + $(INST_LIB)/Mail/SpamAssassin.pm \ + lib/Mail/SpamAssassin/AuditMessage.pm \ + $(INST_LIB)/Mail/SpamAssassin/AuditMessage.pm \ + lib/Mail/SpamAssassin/Locker.pm \ + $(INST_LIB)/Mail/SpamAssassin/Locker.pm \ + lib/Mail/SpamAssassin/MailingList.pm \ + $(INST_LIB)/Mail/SpamAssassin/MailingList.pm \ + lib/Mail/SpamAssassin/BayesTokenLog.pm \ + $(INST_LIB)/Mail/SpamAssassin/BayesTokenLog.pm \ + lib/Mail/SpamAssassin/CmdLearn.pm \ + $(INST_LIB)/Mail/SpamAssassin/CmdLearn.pm \ + lib/Mail/SpamAssassin/EncappedMIME.pm \ + $(INST_LIB)/Mail/SpamAssassin/EncappedMIME.pm \ + lib/Mail/SpamAssassin/NoMailAudit.pm \ + $(INST_LIB)/Mail/SpamAssassin/NoMailAudit.pm \ + lib/Mail/SpamAssassin/BayesStore.pm \ + $(INST_LIB)/Mail/SpamAssassin/BayesStore.pm \ + lib/Mail/SpamAssassin/PersistentAddrList.pm \ + $(INST_LIB)/Mail/SpamAssassin/PersistentAddrList.pm \ + lib/Mail/SpamAssassin/Received.pm \ + $(INST_LIB)/Mail/SpamAssassin/Received.pm \ + lib/Mail/SpamAssassin/TextCat.pm \ + $(INST_LIB)/Mail/SpamAssassin/TextCat.pm \ + lib/Mail/SpamAssassin/UnixLocker.pm \ + $(INST_LIB)/Mail/SpamAssassin/UnixLocker.pm \ + lib/Mail/SpamAssassin/EncappedMessage.pm \ + $(INST_LIB)/Mail/SpamAssassin/EncappedMessage.pm + + +# --- MakeMaker tool_autosplit section: + +# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto +AUTOSPLITFILE = $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e 'use AutoSplit;autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) ;' + + +# --- MakeMaker tool_xsubpp section: + + +# --- MakeMaker tools_other section: + +SHELL = /bin/sh +CHMOD = chmod +CP = cp +LD = gcc +MV = mv +NOOP = $(SHELL) -c true +RM_F = rm -f +RM_RF = rm -rf +TEST_F = test -f +TOUCH = touch +UMASK_NULL = umask 0 +DEV_NULL = > /dev/null 2>&1 + +# The following is a portable way to say mkdir -p +# To see which directories are created, change the if 0 to if 1 +MKPATH = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e mkpath + +# This helps us to minimize the effect of the .exists files A yet +# better solution would be to have a stable file in the perl +# distribution with a timestamp of zero. But this solution doesn't +# need any changes to the core distribution and works with older perls +EQUALIZE_TIMESTAMP = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Command -e eqtime + +# Here we warn users that an old packlist file was found somewhere, +# and that they should call some uninstall routine +WARN_IF_OLD_PACKLIST = $(PERL) -we 'exit unless -f $$ARGV[0];' \ +-e 'print "WARNING: I have found an old package in\n";' \ +-e 'print "\t$$ARGV[0].\n";' \ +-e 'print "Please make sure the two installations are not conflicting\n";' + +UNINST=0 +VERBINST=0 + +MOD_INSTALL = $(PERL) -I$(INST_LIB) -I$(PERL_LIB) -MExtUtils::Install \ +-e "install({@ARGV},'$(VERBINST)',0,'$(UNINST)');" + +DOC_INSTALL = $(PERL) -e '$$\="\n\n";' \ +-e 'print "=head2 ", scalar(localtime), ": C<", shift, ">", " L<", $$arg=shift, "|", $$arg, ">";' \ +-e 'print "=over 4";' \ +-e 'while (defined($$key = shift) and defined($$val = shift)){print "=item *";print "C<$$key: $$val>";}' \ +-e 'print "=back";' + +UNINSTALL = $(PERL) -MExtUtils::Install \ +-e 'uninstall($$ARGV[0],1,1); print "\nUninstall is deprecated. Please check the";' \ +-e 'print " packlist above carefully.\n There may be errors. Remove the";' \ +-e 'print " appropriate files manually.\n Sorry for the inconveniences.\n"' + + +# --- MakeMaker dist section: + +DISTVNAME = $(DISTNAME)-$(VERSION) +TAR = tar +TARFLAGS = cvf +ZIP = zip +ZIPFLAGS = -r +COMPRESS = gzip -9f +SUFFIX = gz +SHAR = shar +PREOP = @$(NOOP) +POSTOP = @$(NOOP) +TO_UNIX = @$(NOOP) +CI = ci -u +RCS_LABEL = rcs -Nv$(VERSION_SYM): -q +DIST_CP = best +DIST_DEFAULT = tardist + + +# --- MakeMaker macro section: +RULES = 10_misc.cf 20_anti_ratware.cf 20_body_tests.cf 20_compensate.cf 20_dnsbl_tests.cf 20_fake_helo_tests.cf 20_head_tests.cf 20_html_tests.cf 20_meta_tests.cf 20_phrases.cf 20_porn.cf 20_ratware.cf 20_uri_tests.cf 23_bayes.cf 25_body_tests_es.cf 25_body_tests_pl.cf 25_head_tests_es.cf 25_head_tests_pl.cf 30_text_de.cf 30_text_es.cf 30_text_fr.cf 30_text_it.cf 30_text_pl.cf 30_text_sk.cf 50_scores.cf 60_whitelist.cf user_prefs.template triplets.txt languages + + +# --- MakeMaker depend section: + + +# --- MakeMaker cflags section: + + +# --- MakeMaker const_loadlibs section: + + +# --- MakeMaker const_cccmd section: + + +# --- MakeMaker post_constants section: + + +# --- MakeMaker pasthru section: + +PASTHRU = LIB="$(LIB)"\ + LIBPERL_A="$(LIBPERL_A)"\ + LINKTYPE="$(LINKTYPE)"\ + PREFIX="$(PREFIX)"\ + OPTIMIZE="$(OPTIMIZE)" + + +# --- MakeMaker c_o section: + + +# --- MakeMaker xs_c section: + + +# --- MakeMaker xs_o section: + + +# --- MakeMaker top_targets section: + +#all :: config $(INST_PM) subdirs linkext manifypods + +all :: pure_all htmlifypods manifypods + @$(NOOP) + +pure_all :: config pm_to_blib subdirs linkext + @$(NOOP) + +subdirs :: $(MYEXTLIB) + @$(NOOP) + +config :: Makefile $(INST_LIBDIR)/.exists + @$(NOOP) + +config :: $(INST_ARCHAUTODIR)/.exists + @$(NOOP) + +config :: $(INST_AUTODIR)/.exists + @$(NOOP) + +$(INST_AUTODIR)/.exists :: /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h + @$(MKPATH) $(INST_AUTODIR) + @$(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h $(INST_AUTODIR)/.exists + + -@$(CHMOD) $(PERM_RWX) $(INST_AUTODIR) + +$(INST_LIBDIR)/.exists :: /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h + @$(MKPATH) $(INST_LIBDIR) + @$(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h $(INST_LIBDIR)/.exists + + -@$(CHMOD) $(PERM_RWX) $(INST_LIBDIR) + +$(INST_ARCHAUTODIR)/.exists :: /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h + @$(MKPATH) $(INST_ARCHAUTODIR) + @$(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h $(INST_ARCHAUTODIR)/.exists + + -@$(CHMOD) $(PERM_RWX) $(INST_ARCHAUTODIR) + +config :: $(INST_MAN1DIR)/.exists + @$(NOOP) + + +$(INST_MAN1DIR)/.exists :: /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h + @$(MKPATH) $(INST_MAN1DIR) + @$(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h $(INST_MAN1DIR)/.exists + + -@$(CHMOD) $(PERM_RWX) $(INST_MAN1DIR) + +config :: $(INST_MAN3DIR)/.exists + @$(NOOP) + + +$(INST_MAN3DIR)/.exists :: /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h + @$(MKPATH) $(INST_MAN3DIR) + @$(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h $(INST_MAN3DIR)/.exists + + -@$(CHMOD) $(PERM_RWX) $(INST_MAN3DIR) + +help: + perldoc ExtUtils::MakeMaker + +Version_check: + @$(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \ + -MExtUtils::MakeMaker=Version_check \ + -e "Version_check('$(MM_VERSION)')" + + +# --- MakeMaker linkext section: + +linkext :: $(LINKTYPE) + @$(NOOP) + + +# --- MakeMaker dlsyms section: + + +# --- MakeMaker dynamic section: + +## $(INST_PM) has been moved to the all: target. +## It remains here for awhile to allow for old usage: "make dynamic" +#dynamic :: Makefile $(INST_DYNAMIC) $(INST_BOOT) $(INST_PM) +dynamic :: Makefile $(INST_DYNAMIC) $(INST_BOOT) + @$(NOOP) + + +# --- MakeMaker dynamic_bs section: + +BOOTSTRAP = + + +# --- MakeMaker dynamic_lib section: + + +# --- MakeMaker static section: + +## $(INST_PM) has been moved to the all: target. +## It remains here for awhile to allow for old usage: "make static" +#static :: Makefile $(INST_STATIC) $(INST_PM) +static :: Makefile $(INST_STATIC) + @$(NOOP) + + +# --- MakeMaker static_lib section: + + +# --- MakeMaker htmlifypods section: + +htmlifypods : pure_all + @$(NOOP) + + +# --- MakeMaker manifypods section: +POD2MAN_EXE = /usr/bin/pod2man +POD2MAN = $(PERL) -we '%m=@ARGV;for (keys %m){' \ +-e 'next if -e $$m{$$_} && -M $$m{$$_} < -M $$_ && -M $$m{$$_} < -M "Makefile";' \ +-e 'print "Manifying $$m{$$_}\n";' \ +-e 'system(qq[$$^X ].q["-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" $(POD2MAN_EXE) ].qq[$$_>$$m{$$_}])==0 or warn "Couldn\047t install $$m{$$_}\n";' \ +-e 'chmod(oct($(PERM_RW))), $$m{$$_} or warn "chmod $(PERM_RW) $$m{$$_}: $$!\n";}' + +manifypods : pure_all spamd/spamd \ + sa-learn \ + spamassassin \ + spamd/spamc.pod \ + lib/Mail/SpamAssassin/PersistentAddrList.pm \ + lib/Mail/SpamAssassin/Conf.pm \ + lib/Mail/SpamAssassin/StateDirHash.pm \ + lib/Mail/SpamAssassin/BayesTokenLog.pm \ + lib/Mail/SpamAssassin/Bayes.pm \ + lib/Mail/SpamAssassin/ConfSourceSQL.pm \ + lib/Mail/SpamAssassin/PerMsgLearner.pm \ + lib/Mail/SpamAssassin/PerMsgStatus.pm \ + lib/Mail/SpamAssassin/AutoWhitelist.pm \ + lib/Mail/SpamAssassin.pm + @$(POD2MAN) \ + spamd/spamd \ + $(INST_MAN1DIR)/spamd.$(MAN1EXT) \ + sa-learn \ + $(INST_MAN1DIR)/sa-learn.$(MAN1EXT) \ + spamassassin \ + $(INST_MAN1DIR)/spamassassin.$(MAN1EXT) \ + spamd/spamc.pod \ + $(INST_MAN1DIR)/spamc.$(MAN1EXT) \ + lib/Mail/SpamAssassin/PersistentAddrList.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin::PersistentAddrList.$(MAN3EXT) \ + lib/Mail/SpamAssassin/Conf.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin::Conf.$(MAN3EXT) \ + lib/Mail/SpamAssassin/StateDirHash.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin::StateDirHash.$(MAN3EXT) \ + lib/Mail/SpamAssassin/BayesTokenLog.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin::BayesTokenLog.$(MAN3EXT) \ + lib/Mail/SpamAssassin/Bayes.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin::Bayes.$(MAN3EXT) \ + lib/Mail/SpamAssassin/ConfSourceSQL.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin::ConfSourceSQL.$(MAN3EXT) \ + lib/Mail/SpamAssassin/PerMsgLearner.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin::PerMsgLearner.$(MAN3EXT) \ + lib/Mail/SpamAssassin/PerMsgStatus.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin::PerMsgStatus.$(MAN3EXT) \ + lib/Mail/SpamAssassin/AutoWhitelist.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin::AutoWhitelist.$(MAN3EXT) \ + lib/Mail/SpamAssassin.pm \ + $(INST_MAN3DIR)/Mail::SpamAssassin.$(MAN3EXT) + +# --- MakeMaker processPL section: + + +# --- MakeMaker installbin section: + +$(INST_SCRIPT)/.exists :: /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h + @$(MKPATH) $(INST_SCRIPT) + @$(EQUALIZE_TIMESTAMP) /usr/lib/perl5/5.6.1/i386-linux/CORE/perl.h $(INST_SCRIPT)/.exists + + -@$(CHMOD) $(PERM_RWX) $(INST_SCRIPT) + +EXE_FILES = spamassassin sa-learn sa-btok-learn spamd/spamc$(EXE_EXT) spamd/spamd + +FIXIN = $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::MakeMaker \ + -e "MY->fixin(shift)" + +pure_all :: $(INST_SCRIPT)/sa-btok-learn $(INST_SCRIPT)/spamd $(INST_SCRIPT)/sa-learn $(INST_SCRIPT)/spamc$(EXE_EXT) $(INST_SCRIPT)/spamassassin + @$(NOOP) + +realclean :: + rm -f $(INST_SCRIPT)/sa-btok-learn $(INST_SCRIPT)/spamd $(INST_SCRIPT)/sa-learn $(INST_SCRIPT)/spamc$(EXE_EXT) $(INST_SCRIPT)/spamassassin + +$(INST_SCRIPT)/sa-btok-learn: sa-btok-learn Makefile $(INST_SCRIPT)/.exists + @rm -f $(INST_SCRIPT)/sa-btok-learn + cp sa-btok-learn $(INST_SCRIPT)/sa-btok-learn + $(FIXIN) $(INST_SCRIPT)/sa-btok-learn + -@$(CHMOD) $(PERM_RWX) $(INST_SCRIPT)/sa-btok-learn + +$(INST_SCRIPT)/spamd: spamd/spamd Makefile $(INST_SCRIPT)/.exists + @rm -f $(INST_SCRIPT)/spamd + cp spamd/spamd $(INST_SCRIPT)/spamd + $(FIXIN) $(INST_SCRIPT)/spamd + -@$(CHMOD) $(PERM_RWX) $(INST_SCRIPT)/spamd + +$(INST_SCRIPT)/sa-learn: sa-learn Makefile $(INST_SCRIPT)/.exists + @rm -f $(INST_SCRIPT)/sa-learn + cp sa-learn $(INST_SCRIPT)/sa-learn + $(FIXIN) $(INST_SCRIPT)/sa-learn + -@$(CHMOD) $(PERM_RWX) $(INST_SCRIPT)/sa-learn + +$(INST_SCRIPT)/spamc$(EXE_EXT): spamd/spamc$(EXE_EXT) Makefile $(INST_SCRIPT)/.exists + @rm -f $(INST_SCRIPT)/spamc$(EXE_EXT) + cp spamd/spamc$(EXE_EXT) $(INST_SCRIPT)/spamc$(EXE_EXT) + $(FIXIN) $(INST_SCRIPT)/spamc$(EXE_EXT) + -@$(CHMOD) $(PERM_RWX) $(INST_SCRIPT)/spamc$(EXE_EXT) + +$(INST_SCRIPT)/spamassassin: spamassassin Makefile $(INST_SCRIPT)/.exists + @rm -f $(INST_SCRIPT)/spamassassin + cp spamassassin $(INST_SCRIPT)/spamassassin + $(FIXIN) $(INST_SCRIPT)/spamassassin + -@$(CHMOD) $(PERM_RWX) $(INST_SCRIPT)/spamassassin + + +# --- MakeMaker subdirs section: + +# none + +# --- MakeMaker clean section: + +# Delete temporary files but do not touch installed files. We don't delete +# the Makefile here so a later make realclean still has a makefile to use. + +clean :: + -rm -rf pod2htm* spamassassin sa-learn spamd/spamc$(EXE_EXT) spamd/libspamc.so spamd/spamd doc spamd/libsslspamc.so binaries.mk config.h config.status config.cache config.log autom4te.cache qmail/qmail-spamct/do_razor2 t/log ./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all perlmain.c mon.out core core.*perl.*.? *perl.core so_locations pm_to_blib *$(OBJ_EXT) *$(LIB_EXT) perl.exe $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def $(BASEEXT).exp + -mv Makefile Makefile.old $(DEV_NULL) + + +# --- MakeMaker realclean section: + +# Delete temporary files (via clean) and also delete installed files +realclean purge :: clean + rm -rf $(INST_AUTODIR) $(INST_ARCHAUTODIR) + rm -f $(INST_LIB)/Mail/SpamAssassin/NetSet.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/StateDirHash.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/Bayes.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/ConfSourceSQL.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/DBBasedAddrList.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/PerMsgStatus.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/Reporter.pm $(INST_LIB)/Mail/SpamAssassin/SHA1.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/HTML.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/Win32Locker.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/ArchiveIterator.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/PerMsgLearner.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/AutoWhitelist.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/PhraseFreqs.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/Util.pm $(INST_LIB)/Mail/SpamAssassin/Dns.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/Message.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/EvalTests.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/Locales.pm $(INST_LIB)/Mail/SpamAssassin/Conf.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/Replier.pm $(INST_LIB)/Mail/SpamAssassin.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/AuditMessage.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/Locker.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/MailingList.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/BayesTokenLog.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/CmdLearn.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/EncappedMIME.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/NoMailAudit.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/BayesStore.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/PersistentAddrList.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/Received.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/TextCat.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/UnixLocker.pm + rm -f $(INST_LIB)/Mail/SpamAssassin/EncappedMessage.pm + rm -rf Makefile Makefile.old + + +# --- MakeMaker dist_basics section: + +distclean :: realclean distcheck + +distcheck : + $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=fullcheck \ + -e fullcheck + +skipcheck : + $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=skipcheck \ + -e skipcheck + +manifest : + $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=mkmanifest \ + -e mkmanifest + +veryclean : realclean + $(RM_F) *~ *.orig */*~ */*.orig + + +# --- MakeMaker dist_core section: + +dist : $(DIST_DEFAULT) + @$(PERL) -le 'print "Warning: Makefile possibly out of date with $$vf" if ' \ + -e '-e ($$vf="$(VERSION_FROM)") and -M $$vf < -M "Makefile";' + +tardist : $(DISTVNAME).tar$(SUFFIX) + +zipdist : $(DISTVNAME).zip + +$(DISTVNAME).tar$(SUFFIX) : distdir + $(PREOP) + $(TO_UNIX) + $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME) + $(RM_RF) $(DISTVNAME) + $(COMPRESS) $(DISTVNAME).tar + $(POSTOP) + +$(DISTVNAME).zip : distdir + $(PREOP) + $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME) + $(RM_RF) $(DISTVNAME) + $(POSTOP) + +uutardist : $(DISTVNAME).tar$(SUFFIX) + uuencode $(DISTVNAME).tar$(SUFFIX) \ + $(DISTVNAME).tar$(SUFFIX) > \ + $(DISTVNAME).tar$(SUFFIX)_uu + +shdist : distdir + $(PREOP) + $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar + $(RM_RF) $(DISTVNAME) + $(POSTOP) + + +# --- MakeMaker dist_dir section: + +distdir : + $(RM_RF) $(DISTVNAME) + $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=manicopy,maniread \ + -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');" + + +# --- MakeMaker dist_test section: + +disttest : distdir + cd $(DISTVNAME) && $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) Makefile.PL + cd $(DISTVNAME) && $(MAKE) + cd $(DISTVNAME) && $(MAKE) test + + +# --- MakeMaker dist_ci section: + +ci : + $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -MExtUtils::Manifest=maniread \ + -e "@all = keys %{ maniread() };" \ + -e 'print("Executing $(CI) @all\n"); system("$(CI) @all");' \ + -e 'print("Executing $(RCS_LABEL) ...\n"); system("$(RCS_LABEL) @all");' + + +# --- MakeMaker install section: + +install :: all pure_install doc_install inst_cfs + +install_perl :: all pure_perl_install doc_perl_install + +install_site :: all pure_site_install doc_site_install + +install_vendor :: all pure_vendor_install doc_vendor_install + +install_ :: install_site + @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site + +pure_install :: pure_$(INSTALLDIRS)_install + +doc_install :: doc_$(INSTALLDIRS)_install + @echo Appending installation info to $(INSTALLARCHLIB)/perllocal.pod + +pure__install : pure_site_install + @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site + +doc__install : doc_site_install + @echo INSTALLDIRS not defined, defaulting to INSTALLDIRS=site + +pure_perl_install :: + @$(MOD_INSTALL) \ + read $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist \ + write $(INSTALLARCHLIB)/auto/$(FULLEXT)/.packlist \ + $(INST_LIB) $(INSTALLPRIVLIB) \ + $(INST_ARCHLIB) $(INSTALLARCHLIB) \ + $(INST_BIN) $(INSTALLBIN) \ + $(INST_SCRIPT) $(INSTALLSCRIPT) \ + $(INST_HTMLLIBDIR) $(INSTALLHTMLPRIVLIBDIR) \ + $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \ + $(INST_MAN1DIR) $(INSTALLMAN1DIR) \ + $(INST_MAN3DIR) $(INSTALLMAN3DIR) + @$(WARN_IF_OLD_PACKLIST) \ + $(SITEARCHEXP)/auto/$(FULLEXT) + + +pure_site_install :: + @$(MOD_INSTALL) \ + read $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist \ + write $(INSTALLSITEARCH)/auto/$(FULLEXT)/.packlist \ + $(INST_LIB) $(INSTALLSITELIB) \ + $(INST_ARCHLIB) $(INSTALLSITEARCH) \ + $(INST_BIN) $(INSTALLBIN) \ + $(INST_SCRIPT) $(INSTALLSCRIPT) \ + $(INST_HTMLLIBDIR) $(INSTALLHTMLSITELIBDIR) \ + $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \ + $(INST_MAN1DIR) $(INSTALLSITEMAN1DIR) \ + $(INST_MAN3DIR) $(INSTALLSITEMAN3DIR) + @$(WARN_IF_OLD_PACKLIST) \ + $(PERL_ARCHLIB)/auto/$(FULLEXT) + +pure_vendor_install :: + @$(MOD_INSTALL) \ + read $(VENDORARCHEXP)/auto/$(FULLEXT)/.packlist \ + write $(INSTALLVENDORARCH)/auto/$(FULLEXT)/.packlist \ + $(INST_LIB) $(INSTALLVENDORLIB) \ + $(INST_ARCHLIB) $(INSTALLVENDORARCH) \ + $(INST_BIN) $(INSTALLBIN) \ + $(INST_SCRIPT) $(INSTALLSCRIPT) \ + $(INST_HTMLLIBDIR) $(INSTALLHTMLVENDORLIBDIR) \ + $(INST_HTMLSCRIPTDIR) $(INSTALLHTMLSCRIPTDIR) \ + $(INST_MAN1DIR) $(INSTALLVENDORMAN1DIR) \ + $(INST_MAN3DIR) $(INSTALLVENDORMAN3DIR) + @$(WARN_IF_OLD_PACKLIST) \ + $(PERL_ARCHLIB)/auto/$(FULLEXT) + +doc_perl_install :: + -@$(MKPATH) $(INSTALLARCHLIB) + -@$(DOC_INSTALL) \ + "Module" "$(NAME)" \ + "installed into" "$(INSTALLPRIVLIB)" \ + LINKTYPE "$(LINKTYPE)" \ + VERSION "$(VERSION)" \ + EXE_FILES "$(EXE_FILES)" \ + >> $(INSTALLARCHLIB)/perllocal.pod + +doc_site_install :: + -@$(MKPATH) $(INSTALLSITEARCHLIB) + -@$(DOC_INSTALL) \ + "Module" "$(NAME)" \ + "installed into" "$(INSTALLSITELIB)" \ + LINKTYPE "$(LINKTYPE)" \ + VERSION "$(VERSION)" \ + EXE_FILES "$(EXE_FILES)" \ + >> $(INSTALLSITEARCHLIB)/perllocal.pod + +doc_vendor_install :: + -@$(MKPATH) $(INSTALLVENDORARCHLIB) + -@$(DOC_INSTALL) \ + "Module" "$(NAME)" \ + "installed into" "$(INSTALLVENDORLIB)" \ + LINKTYPE "$(LINKTYPE)" \ + VERSION "$(VERSION)" \ + EXE_FILES "$(EXE_FILES)" \ + >> $(INSTALLVENDORARCHLIB)/perllocal.pod + + +uninstall :: uninstall_from_$(INSTALLDIRS)dirs + +uninstall_from_perldirs :: + @$(UNINSTALL) $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist + +uninstall_from_sitedirs :: + @$(UNINSTALL) $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist + + +# --- MakeMaker force section: +# Phony target to force checking subdirectories. +FORCE: + @$(NOOP) + + +# --- MakeMaker perldepend section: + + +# --- MakeMaker makefile section: + +# We take a very conservative approach here, but it\'s worth it. +# We move Makefile to Makefile.old here to avoid gnu make looping. +Makefile : Makefile.PL $(CONFIGDEP) + @echo "Makefile out-of-date with respect to $?" + @echo "Cleaning current config before rebuilding Makefile..." + -@$(RM_F) Makefile.old + -@$(MV) Makefile Makefile.old + -$(MAKE) -f Makefile.old clean $(DEV_NULL) || $(NOOP) + $(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" Makefile.PL + @echo "==> Your Makefile has been rebuilt. <==" + @echo "==> Please rerun the make command. <==" + false + +# To change behavior to :: would be nice, but would break Tk b9.02 +# so you find such a warning below the dist target. +#Makefile :: $(VERSION_FROM) +# @echo "Warning: Makefile possibly out of date with $(VERSION_FROM)" + + +# --- MakeMaker staticmake section: + +# --- MakeMaker makeaperl section --- +MAP_TARGET = perl +FULLPERL = /usr/bin/perl + +$(MAP_TARGET) :: static $(MAKE_APERL_FILE) + $(MAKE) -f $(MAKE_APERL_FILE) $@ + +$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) + @echo Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET) + @$(PERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) \ + Makefile.PL DIR= \ + MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ + MAKEAPERL=1 NORECURS=1 CCCDLFLAGS= + + +# --- MakeMaker test section: + +TEST_VERBOSE=0 +TEST_TYPE=test_$(LINKTYPE) +TEST_FILE = test.pl +TEST_FILES = t/*.t +TESTDB_SW = -d + +testdb :: testdb_$(LINKTYPE) + +test :: $(TEST_TYPE) + +test_dynamic :: pure_all + PERL_DL_NONLAZY=1 $(FULLPERL) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) -e 'use Test::Harness qw(&runtests $$verbose); $$verbose=$(TEST_VERBOSE); runtests @ARGV;' $(TEST_FILES) + +testdb_dynamic :: pure_all + PERL_DL_NONLAZY=1 $(FULLPERL) $(TESTDB_SW) -I$(INST_ARCHLIB) -I$(INST_LIB) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(TEST_FILE) + +test_ : test_dynamic + +test_static :: test_dynamic +testdb_static :: testdb_dynamic + + +# --- MakeMaker ppd section: +# Creates a PPD (Perl Package Description) for a binary distribution. +ppd: + @$(PERL) -e "print qq{\n}. qq{\tMail-SpamAssassin\n}. qq{\tidentify spam mail using text analysis\n}. qq{\tJustin Mason <jm\@jmason.org>\n}. qq{\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\t\n}. qq{\t\n}. qq{\n}" > Mail-SpamAssassin.ppd + +# --- MakeMaker pm_to_blib section: + +pm_to_blib: $(TO_INST_PM) + @$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \ + "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \ + -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'$(INST_LIB)/auto','$(PM_FILTER)')" + @$(TOUCH) $@ + + +# --- MakeMaker selfdocument section: + + +# --- MakeMaker postamble section: + +INST_PREFIX = /usr +SYSCONFDIR = /etc +INST_SYSCONFDIR = /etc +PKG_DEF_RULES_DIR = $(PREFIX)/share/spamassassin +DEF_RULES_DIR = $(INST_PREFIX)/share/spamassassin +PKG_LOCAL_RULES_DIR = $(SYSCONFDIR)/mail/spamassassin +LOCAL_RULES_DIR = $(INST_SYSCONFDIR)/mail/spamassassin +INST_SITELIB = $(INSTALLSITELIB) +ENABLE_SSL = no +CONTACT_ADDRESS = the administrator of that system + +PERL_BIN = this +PERL_WARN = auto +PERL_VERSION = this + + + +FIXVARS = -Mvars \ + -DVERSION="$(VERSION)" \ + -DPREFIX="$(INST_PREFIX)" \ + -DDEF_RULES_DIR="$(DEF_RULES_DIR)" \ + -DLOCAL_RULES_DIR="$(LOCAL_RULES_DIR)" \ + -DINSTALLSITELIB="$(INST_SITELIB)" \ + -DCONTACT_ADDRESS="$(CONTACT_ADDRESS)" + +FIXBYTES = -Mbytes \ + -DPERL_VERSION="$(PERL_VERSION)" + +FIXBANG = -Msharpbang \ + -DPERL_BIN="$(PERL_BIN)" \ + -DPERL_WARN="$(PERL_WARN)" + +SPAMC_SOURCES = spamd/spamc.c qmail/qmail-spamc.c spamd/libspamc.c spamd/utils.c + + + +spamassassin: spamassassin.raw + $(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@ + $(CHMOD) $(PERM_RWX) $@ + +sa-learn: sa-learn.raw + $(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@ + $(CHMOD) $(PERM_RWX) $@ + +sa-btok-learn: sa-btok-learn.raw + $(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@ + $(CHMOD) $(PERM_RWX) $@ + +spamd/spamd: spamd/spamd.raw + $(PERL) build/preprocessor $(FIXBYTES) $(FIXVARS) $(FIXBANG) -i$? -o$@ + $(CHMOD) $(PERM_RWX) $@ + +spamd/libspamc.so: binaries.mk $(SPAMC_SOURCES) + $(MAKE) -f binaries.mk $@ + +spamd/libspamc.dll: binaries.mk $(SPAMC_SOURCES) + $(MAKE) -f binaries.mk $@ + +spamd/spamc$(EXE_EXT): binaries.mk $(SPAMC_SOURCES) + $(MAKE) -f binaries.mk $@ + +spamd/libsslspamc.so: binaries.mk $(SPAMC_SOURCES) + $(MAKE) -f binaries.mk $@ + +spamd/libsslspamc.dll: binaries.mk $(SPAMC_SOURCES) + $(MAKE) -f binaries.mk $@ + +qmail/qmail-spamc: binaries.mk $(SPAMC_SOURCES) + $(MAKE) -f binaries.mk $@ + +binaries.mk: configure + ./configure --enable-ssl=$(ENABLE_SSL) + +inst_cfs: $(PKG_LOCAL_RULES_DIR) $(PKG_LOCAL_RULES_DIR)/local.cf + $(MKPATH) $(PKG_DEF_RULES_DIR) + $(RM_RF) $(PKG_DEF_RULES_DIR)/* + $(PERL) build/preprocessor $(FIXVARS) -m$(PERM_RW) -Irules -O$(PKG_DEF_RULES_DIR) $(RULES) + $(CHMOD) $(PERM_RWX) $(PKG_DEF_RULES_DIR) + +$(PKG_LOCAL_RULES_DIR): + $(MKPATH) $@ + +$(PKG_LOCAL_RULES_DIR)/local.cf: rules/local.cf + $(PERL) -e "use File::Copy; (-f '$@') or copy ('$?', '$@');" + +text_html_doc: made-doc-stamp + $(NOOP) + +doc: + $(MKPATH) $@ + +made-doc-stamp: doc $(MAN1PODS) $(MAN3PODS) $(EXTRAPODS) + $(PERL) build/convert_pods_to_doc $(MAN1PODS) $(MAN3PODS) $(EXTRAPODS) + + $(TOUCH) made-doc-stamp + $(RM_F) pod2htm* + + + +# End. diff -u -N -r Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/Bayes.pm Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/Bayes.pm --- Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/Bayes.pm Fri Jun 27 11:48:36 2003 +++ Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/Bayes.pm Mon Jun 30 16:28:19 2003 @@ -29,6 +29,10 @@ use strict; use bytes; +use Sys::Hostname; +use File::Path; +use File::Spec; +use File::Basename; use Mail::SpamAssassin; use Mail::SpamAssassin::BayesStore; @@ -295,6 +299,7 @@ } my @toks = @{$self->{tokens}}; delete $self->{tokens}; + ($wc, @toks); } @@ -606,6 +611,39 @@ ########################################################################### +sub learn_tokens { + my ($self, $toks, $id, $isspam) = @_; + + my $ret; + + eval { + local $SIG{'__DIE__'}; # do not run user die() traps in here + + my $ok; + if ($self->{main}->{learn_to_journal}) { + $ok = $self->{store}->tie_db_readonly(); + } else { + $ok = $self->{store}->tie_db_writable(); + } + + if ($ok) { + $ret = $self->learn_trapped_tokens ($toks, $id, $isspam); + + if (!$self->{main}->{learn_caller_will_untie}) { + $self->{store}->untie_db(); + } + } + }; + + if ($@) { # if we died, untie the dbs. + my $failure = $@; + $self->{store}->untie_db(); + die $failure; + } + + return $ret; +} + sub learn { my ($self, $isspam, $msg) = @_; @@ -686,6 +724,49 @@ 1; } +sub learn_trapped_tokens { + my ($self, $toks, $id, $isspam) = @_; + + my $seen = $self->{store}->seen_get($id); + + if (defined($seen)) { + if (($seen eq 's' && $isspam) || ($seen eq 'h' && !$isspam)) { + dbg ("$id: already learnt correctly, not learning twice"); + return; + } elsif ($seen !~ /^[hs]$/) { + warn ("db_seen corrupt: value='$seen' for $id. ignored"); + } else { + dbg ("$id: already learnt as opposite, forgetting first"); + $self->forget_tokens ($toks, $id); + } + } + + if ($isspam) { + $self->{store}->nspam_nham_change(1,0); + } else { + $self->{store}->nspam_nham_change(0,1); + } + + my @tokens = @$toks; + my %seen = (); + + my $msgatime = time(); # this is sort of incorrect. + + for (@tokens) { + if ($seen{$_}) { next; } else { $seen{$_} = 1; } + + if ($isspam) { + $self->{store}->tok_count_change (1, 0, $_, $msgatime); + } else { + $self->{store}->tok_count_change (0, 1, $_, $msgatime); + } + } + + $self->{store}->seen_put ($id, ($isspam ? 's' : 'h')); + $self->{store}->add_touches_to_journal(); + 1; +} + ########################################################################### sub forget { @@ -719,6 +800,36 @@ return $ret; } +sub forget_tokens { + my ($self, $toks, $id) = @_; + + if (!$self->{conf}->{use_bayes}) { return; } + my $ret; + + # we still tie for writing here, since we write to the seen db + # synchronously + eval { + local $SIG{'__DIE__'}; # do not run user die() traps in here + + if ($self->{store}->tie_db_writable()) { + $ret = $self->forget_trapped_tokens ($toks, $id); + + if (!$self->{main}->{learn_caller_will_untie}) { + $self->{store}->untie_db(); + } + } + }; + + if ($@) { # if we died, untie the dbs. + my $failure = $@; + $self->{store}->untie_db(); + die $failure; + } + + return $ret; +} + + # this function is trapped by the wrapper above sub forget_trapped { my ($self, $msg, $body) = @_; @@ -750,6 +861,47 @@ my %seen = (); for (@tokens) { if ($seen{$_}) { next; } else { $seen{$_} = 1; } + + if ($isspam) { + $self->{store}->tok_count_change (-1, 0, $_); + } else { + $self->{store}->tok_count_change (0, -1, $_); + } + } + + $self->{store}->seen_delete ($msgid); + 1; +} + +sub forget_trapped_tokens { + my ($self, $toks, $msgid) = @_; + + my $seen = $self->{store}->seen_get ($msgid); + my $isspam; + if (defined ($seen)) { + if ($seen eq 's') { + $isspam = 1; + } elsif ($seen eq 'h') { + $isspam = 0; + } else { + dbg ("forget: message $msgid seen entry is neither ham nor spam, ignored"); + return; + } + } else { + dbg ("forget: message $msgid not learnt, ignored"); + return; + } + + if ($isspam) { + $self->{store}->nspam_nham_change (-1, 0); + } else { + $self->{store}->nspam_nham_change (0, -1); + } + + my @tokens = @$toks; + my %seen = (); + for (@tokens) { + if ($seen{$_}) { next; } else { $seen{$_} = 1; } if ($isspam) { $self->{store}->tok_count_change (-1, 0, $_); diff -u -N -r Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/BayesStore.pm Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/BayesStore.pm --- Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/BayesStore.pm Fri Jun 27 11:48:36 2003 +++ Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/BayesStore.pm Fri Jun 27 14:28:55 2003 @@ -136,7 +136,6 @@ dbg ("bayes_path not defined"); return 0; } - my $path = $main->sed_path ($main->{conf}->{bayes_path}); my $found=0; diff -u -N -r Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/BayesTokenLog.pm Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/BayesTokenLog.pm --- Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/BayesTokenLog.pm Wed Dec 31 16:00:00 1969 +++ Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/BayesTokenLog.pm Fri Jun 27 15:02:44 2003 @@ -0,0 +1,49 @@ +=head1 NAME + +Mail::SpamAssassin::BayesTokenLog - per message logging of Bayes Tokens for +use in training bayes. + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head1 METHODS + +=over 4 + +=cut + +package Mail::SpamAssassin::BayesTokenLog; + +use strict; + +use Mail::SpamAssassin; +use Mail::SpamAssassin::Conf; + +use vars qw{ + @ISA +}; + +@ISA = qw(); + + +########################################################################### + +sub new { + my $class = shift; + $class = ref($class) || $class; + my ($main) = @_; + my $self = { + 'main' => $main, + 'conf' => $main->{conf}, + }; + + bless ($self, $class); + + $self; +} + + +########################################################################### + +1; diff -u -N -r Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/Conf.pm Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/Conf.pm --- Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/Conf.pm Fri Jun 27 11:48:36 2003 +++ Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/Conf.pm Fri Jun 27 16:12:12 2003 @@ -2384,6 +2384,53 @@ $self->{user_scores_sql_field_scope} = $1; next; } +=item state_dir_hash_base field_value + +The base path for the state_dir_hash + +=cut + if(/^state_dir_hash_base\s+(\S+)$/) { + $self->{state_dir_hash_base} = $1; next; + } + +=item use_state_dir_hash field_value + +set to 1 to enable + +=cut + if(/^use_state_dir_hash\s+(\S+)$/) { + $self->{use_state_dir_hash} = $1; next; + } + +=item per_msg_bayes_token_log field_value + +set to 1 to enable + +=cut + if(/^per_msg_bayes_token_log\s+(\S+)$/) { + $self->{per_msg_bayes_token_log} = $1; next; + } + +=item per_msg_bayes_token_dir field_value + +set to something like __statedir__/bayes_loken_log + +=cut + if(/^per_msg_bayes_token_dir\s+(\S+)$/) { + $self->{per_msg_bayes_token_dir} = $1; next; + } + +=item per_msg_bayes_token_retries field_value + +number of times to retry for the token file + +=cut + if(/^per_msg_bayes_token_retries\s+(\S+)$/) { + $self->{per_msg_bayes_token_retries} = $1; next; + } + + + ########################################################################### failed_line: diff -u -N -r Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/PerMsgStatus.pm Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/PerMsgStatus.pm --- Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/PerMsgStatus.pm Fri Jun 27 11:48:36 2003 +++ Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/PerMsgStatus.pm Tue Jul 1 14:39:02 2003 @@ -38,6 +38,7 @@ use Text::Wrap qw(); use POSIX qw(strftime); use Sys::Hostname; +use File::Path qw(mkpath); use Mail::SpamAssassin::EvalTests; use Mail::SpamAssassin::AutoWhitelist; @@ -112,6 +113,16 @@ $self->{head_only_hits} = 0; $self->{hits} = 0; + my $toks; + + # Log all bayesian tokens to a file for later training + if ($self->{conf}->{per_msg_bayes_token_log}) + { + $toks = join("\n", $self->{main}->{bayes_scanner}->tokenize( + $self->{msg}, $self->{main}->{bayes_scanner}->get_body_from_msg( + $self->{msg})))."\n"; + } + # Resident Mail::SpamAssassin code will possibly never change score # sets, even if bayes becomes available. So we should do a quick check # to see if we should go from {0,1} to {2,3}. We of course don't need @@ -237,6 +248,41 @@ $report =~ s/\n*$/\n\n/s; $self->{report} = $report; + if ($self->{conf}->{per_msg_bayes_token_log}) + { + my $path = $self->{main}->sed_path($self->{conf}->{per_msg_bayes_token_dir}); + + if (! -d $path) + { + dbg("Making (mkdiring) path for token log: $path"); + eval { mkpath($path, 0, 0700) } or dbg ("mkdir $path failed: $@ $!"); + } + + my $file = $self->get_maildir_file($path); + dbg("Writing token log to file: $file"); + + if (!open(F, ">$file")) + { + dbg("Couldn't open file $file for writing of tokens: $!"); + return; + } + + my $hits = $self->{hits}."\n"; + my $is_spam = $self->{is_spam} ? "1\n" : "0\n"; + my $from = $self->{msg}->get_pristine_header('From'); + my $date = $self->{msg}->get_pristine_header('Date'); + my $subj = $self->{msg}->get_pristine_header('Subject'); + + print F $hits; + print F $is_spam; + print F $from; + print F $date; + print F $subj; + + print F $toks; + + close(F); + } } ########################################################################### @@ -2507,6 +2553,23 @@ return ($reportfile, \*TMPFILE); } +sub get_maildir_file { + my ($self, $dir) = @_; + + my $ctime = time(); + my $pid = $$; + my $hostname = hostname(); + my $i; + + for ( $i = 0; $i < $self->{conf}->{per_msg_bayes_token_retries}; $i++ ) { + my $name = $ctime . '.' .$pid . '_' . $i . '.' . $hostname; + return ("$dir/$name") if ( ! -e "$dir/$name" ); + } + + return(''); #return undef if it hit the max. + +} + ########################################################################### 1; diff -u -N -r Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/StateDirHash.pm Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/StateDirHash.pm --- Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin/StateDirHash.pm Wed Dec 31 16:00:00 1969 +++ Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin/StateDirHash.pm Fri Jun 27 14:03:20 2003 @@ -0,0 +1,61 @@ +=head1 NAME + +Mail::SpamAssassin::StateDirHash - determine StateDir Location + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head1 METHODS + +=over 4 + +=cut + +package Mail::SpamAssassin::StateDirHash; + +use strict; + +use Mail::SpamAssassin; +use Mail::SpamAssassin::Conf; + +use vars qw{ + @ISA +}; + +@ISA = qw(); + + +########################################################################### + +sub new { + my $class = shift; + $class = ref($class) || $class; + my ($main) = @_; + my $self = { + 'main' => $main, + 'conf' => $main->{conf}, + }; + + bless ($self, $class); + + $self; +} + +sub get_state_dir { + my ($self, $user) = @_; + + my $state_dir = ''; + + if ( $user =~ /^(.)(.)/ ) { + $state_dir = $self->{conf}->{state_dir_hash_base} . "/$1/$2/$user/.spamassassin"; + } + + return ($state_dir); +} + + + +########################################################################### + +1; diff -u -N -r Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin.pm Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin.pm --- Mail-SpamAssassin-2.60-dist/lib/Mail/SpamAssassin.pm Fri Jun 27 11:48:36 2003 +++ Mail-SpamAssassin-2.60/lib/Mail/SpamAssassin.pm Fri Jun 27 14:44:36 2003 @@ -58,6 +58,7 @@ use 5.005; use Mail::SpamAssassin::Conf; +use Mail::SpamAssassin::StateDirHash; use Mail::SpamAssassin::ConfSourceSQL; use Mail::SpamAssassin::PerMsgStatus; use Mail::SpamAssassin::NoMailAudit; @@ -1263,11 +1264,21 @@ # user state directory my $fname = $self->{userstate_dir}; + + # get statedir hash from module if the config says so + if ($self->{conf}->{use_state_dir_hash}) + { + my $sdh = Mail::SpamAssassin::StateDirHash->new($self); + my $dir = $sdh->get_state_dir($self->{username}); + + unshift(@default_userstate_dir, $dir); + } + $fname ||= $self->first_existing_path (@default_userstate_dir); # If vpopmail is enabled then set fname to virtual homedir # - if (defined $self->{user_dir}) { + if (!$self->{conf}->{use_state_dir_hash} && defined $self->{user_dir}) { $fname = File::Spec->catdir ($self->{user_dir}, ".spamassassin"); } @@ -1374,7 +1385,7 @@ $path =~ s/__local_rules_dir__/$self->{LOCAL_RULES_DIR} || ''/ges; $path =~ s/__def_rules_dir__/$self->{DEF_RULES_DIR} || ''/ges; $path =~ s{__prefix__}{$self->{PREFIX} || $Config{prefix} || '/usr'}ges; - $path =~ s{__userstate__}{$self->get_and_create_userstate_dir()}ges; + $path =~ s/__userstate__/$self->get_and_create_userstate_dir()/ges; $path =~ s/^\~([^\/]*)/$self->expand_name($1)/es; return Mail::SpamAssassin::Util::untaint_file_path ($path); @@ -1383,6 +1394,7 @@ sub first_existing_path { my $self = shift; my $path; + foreach my $p (@_) { $path = $self->sed_path ($p); if (defined $path && -e $path) { return $path; } diff -u -N -r Mail-SpamAssassin-2.60-dist/rules/local.cf Mail-SpamAssassin-2.60/rules/local.cf --- Mail-SpamAssassin-2.60-dist/rules/local.cf Fri Jun 27 11:48:36 2003 +++ Mail-SpamAssassin-2.60/rules/local.cf Fri Jun 27 13:40:00 2003 @@ -9,3 +9,4 @@ # report_safe 1 # trusted_networks 212.17.35. +state_dir_hash_base /tmp diff -u -N -r Mail-SpamAssassin-2.60-dist/sa-btok-learn Mail-SpamAssassin-2.60/sa-btok-learn --- Mail-SpamAssassin-2.60-dist/sa-btok-learn Wed Dec 31 16:00:00 1969 +++ Mail-SpamAssassin-2.60/sa-btok-learn Tue Jul 1 14:39:14 2003 @@ -0,0 +1,94 @@ +#!/usr/bin/perl + +use strict; +use bytes; + +use Mail::SpamAssassin; +use Mail::SpamAssassin::Bayes; +use Mail::SpamAssassin::PerMsgLearner; + +# create the tester factory +my $spamtest = new Mail::SpamAssassin ({ + rules_filename => 0, + userprefs_filename => 0, # perhaps use later + debug => 0, + local_tests_only => 1, + dont_copy_prefs => 1, + }); + +$spamtest->init (1); + +$spamtest->init_learner({ + force_expire => 0, + learn_to_journal => 0, + wait_for_lock => 1, + caller_will_untie => 1 + }); + +# sync the journal first if we're going to go r/w so we make sure to +# learn everything before doing anything else. +# +$spamtest->rebuild_learner_caches(); + +my $processed = 0; + +while (<>) +{ + my @a = split(/\s/, $_); + &do($a[0], $a[1]); + $processed++; +} + +print "Learned from $processed messages.\n"; + +$spamtest->finish_learner(); +exit(0); + +sub do { + my ($file, $isspam) = @_; + + # message ID is the last directory piece (the filename) + my @id = split(/\//, $file); + my $id = $id[scalar(@id)-1]; + + my @toks; + + if (!open (F, $file)) + { + warn "Couldn't open file $file for reading of tokens: $!"; + } else { + + # always ignore the first 6 lines. + ; + ; + ; + ; + ; + ; + + # copy out the tokens + while () + { + chomp; + push (@toks, $_); + } + + close(F); + + eval { + my $status = &learn_tokens(\@toks, $id, $isspam); + }; + + if ($@) + { + print "Couldn't learn tokens out of file $file: $@"; + } + } +} + +sub learn_tokens +{ + my ($toks, $id, $isspam) = @_; + + $spamtest->{bayes_scanner}->learn_tokens($toks, $id, $isspam); +} diff -u -N -r Mail-SpamAssassin-2.60-dist/sa-btok-learn.raw Mail-SpamAssassin-2.60/sa-btok-learn.raw --- Mail-SpamAssassin-2.60-dist/sa-btok-learn.raw Wed Dec 31 16:00:00 1969 +++ Mail-SpamAssassin-2.60/sa-btok-learn.raw Mon Jun 30 16:23:19 2003 @@ -0,0 +1,94 @@ +#!/usr/bin/perl -w + +use strict; +use bytes; + +use Mail::SpamAssassin; +use Mail::SpamAssassin::Bayes; +use Mail::SpamAssassin::PerMsgLearner; + +# create the tester factory +my $spamtest = new Mail::SpamAssassin ({ + rules_filename => 0, + userprefs_filename => 0, # perhaps use later + debug => 0, + local_tests_only => 1, + dont_copy_prefs => 1, + }); + +$spamtest->init (1); + +$spamtest->init_learner({ + force_expire => 0, + learn_to_journal => 0, + wait_for_lock => 1, + caller_will_untie => 1 + }); + +# sync the journal first if we're going to go r/w so we make sure to +# learn everything before doing anything else. +# +$spamtest->rebuild_learner_caches(); + +my $processed = 0; + +while (<>) +{ + my @a = split(/\s/, $_); + &do($a[0], $a[1]); + $processed++; +} + +print "Learned from $processed messages.\n"; + +$spamtest->finish_learner(); +exit(0); + +sub do { + my ($file, $isspam) = @_; + + # message ID is the last directory piece (the filename) + my @id = split(/\//, $file); + my $id = $id[scalar(@id)-1]; + + my @toks; + + if (!open (F, $file)) + { + warn "Couldn't open file $file for reading of tokens: $!"; + } else { + + # always ignore the first 6 lines. + ; + ; + ; + ; + ; + ; + + # copy out the tokens + while () + { + chomp; + push (@toks, $_); + } + + close(F); + + eval { + my $status = &learn_tokens(\@toks, $id, $isspam); + }; + + if ($@) + { + print "Couldn't learn tokens out of file $file: $@"; + } + } +} + +sub learn_tokens +{ + my ($toks, $id, $isspam) = @_; + + $spamtest->{bayes_scanner}->learn_tokens($toks, $id, $isspam); +} diff -u -N -r Mail-SpamAssassin-2.60-dist/spamd/spamd.raw Mail-SpamAssassin-2.60/spamd/spamd.raw --- Mail-SpamAssassin-2.60-dist/spamd/spamd.raw Fri Jun 27 11:48:35 2003 +++ Mail-SpamAssassin-2.60/spamd/spamd.raw Fri Jun 27 13:44:16 2003 @@ -105,6 +105,8 @@ 'vpopmail!' => \$opt{'vpopmail'}, 'v' => \$opt{'vpopmail'}, 'configpath|C=s' => \$opt{'configpath'}, + 'use-statedir-hash' => \$opt{'use_statedir_hash'}, + 'U' => \$opt{'use_statedir_hash'}, 'user-config' => \$opt{'user-config'}, 'nouser-config|x' => sub{ $opt{'user-config'} = 0 }, 'allowed-ips|A=s' => \@{$opt{'allowed-ip'}}, @@ -222,6 +224,7 @@ rules_filename => ($opt{'configpath'} || 0), local_tests_only => ($opt{'local'} || 0), debug => ($opt{'debug'} || 0), + use_statedir_hash => ($opt{'use_statedir_hash'} || 0), paranoid => ($opt{'paranoid'} || 0), home_dir_for_helpers => (defined $opt{'home_dir_for_helpers'} ? $opt{'home_dir_for_helpers'} : $orighome), PREFIX => $PREFIX,