aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroam <roam@FreeBSD.org>2003-11-03 21:42:16 +0800
committerroam <roam@FreeBSD.org>2003-11-03 21:42:16 +0800
commit74f876aca6c8764fdf861bacdcfb382328497586 (patch)
tree7c297ad9bf1a40997ecee93caab5413e72e12fb3
parent3b914aa475672256aa8da2551a127ab62d69d172 (diff)
downloadfreebsd-ports-gnome-74f876aca6c8764fdf861bacdcfb382328497586.tar.gz
freebsd-ports-gnome-74f876aca6c8764fdf861bacdcfb382328497586.tar.zst
freebsd-ports-gnome-74f876aca6c8764fdf861bacdcfb382328497586.zip
Update to 5.3.29 and add the new SpamAssassion patch from Alex Dupre,
with a configurable spam threshold value set by the SPAM_THRESHOLD knob. PR: 58306, 58805 Submitted by: Alex Dupre <sysadmin@alexdupre.com>
-rw-r--r--mail/vpopmail-devel/Makefile7
-rw-r--r--mail/vpopmail-devel/distinfo2
-rw-r--r--mail/vpopmail-devel/files/patch-config.h.in9
-rw-r--r--mail/vpopmail-devel/files/patch-configure36
-rw-r--r--mail/vpopmail-devel/files/patch-vdelivermail.c166
-rw-r--r--mail/vpopmail/Makefile7
-rw-r--r--mail/vpopmail/distinfo2
-rw-r--r--mail/vpopmail/files/patch-config.h.in9
-rw-r--r--mail/vpopmail/files/patch-configure36
-rw-r--r--mail/vpopmail/files/patch-vdelivermail.c166
10 files changed, 406 insertions, 34 deletions
diff --git a/mail/vpopmail-devel/Makefile b/mail/vpopmail-devel/Makefile
index 98d51a4f888b..61f06c59cdb4 100644
--- a/mail/vpopmail-devel/Makefile
+++ b/mail/vpopmail-devel/Makefile
@@ -6,7 +6,7 @@
#
PORTNAME= vpopmail
-PORTVERSION= 5.3.28
+PORTVERSION= 5.3.29
CATEGORIES= mail
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ${PORTNAME}
@@ -61,6 +61,7 @@ CONFIGURE_ARGS= --enable-qmaildir=${QMAIL_DIR} \
#
# HARDQUOTA - size of hard quota, or 'n' for no hard quota
# RELAYCLEAR - time in minutes before clearing relay hole (requires roaming)
+# SPAM_THRESHOLD - minimum score required to delete spam messages (requires spamassassin)
# DEFAULT_DOMAIN - default domain for non-vhost lookups
# WITH_SINGLE_DOMAIN - optimize for a site with many users in a single domain
# LOGLEVEL - n - no logging, y - log all,
@@ -115,6 +116,7 @@ CONFIGURE_ARGS= --enable-qmaildir=${QMAIL_DIR} \
HARDQUOTA?= 10000000
RELAYCLEAR?= 30
+SPAM_THRESHOLD?=15
LOGLEVEL?= y
.if defined(WITH_MYSQL)
@@ -243,7 +245,8 @@ CONFIGURE_ARGS+= --enable-domainquotas=y
.if defined(WITH_SPAMASSASSIN)
BUILD_DEPENDS= spamc:${PORTSDIR}/mail/p5-Mail-SpamAssassin
-CONFIGURE_ARGS+= --enable-spamassassin=${LOCALBASE}/bin/spamc
+CONFIGURE_ARGS+= --enable-spamassassin=${LOCALBASE}/bin/spamc \
+ --enable-spam-threshold=${SPAM_THRESHOLD}
.endif
# autoconf and automake can remove our patches to the configure scripts.
diff --git a/mail/vpopmail-devel/distinfo b/mail/vpopmail-devel/distinfo
index fbf89bc15ed2..50e88b0f4b7d 100644
--- a/mail/vpopmail-devel/distinfo
+++ b/mail/vpopmail-devel/distinfo
@@ -1 +1 @@
-MD5 (vpopmail-5.3.28.tar.gz) = 68495c9309aa03aec2a754702c4d8a67
+MD5 (vpopmail-5.3.29.tar.gz) = 42904ce91d4b0398ae8f964d692f88af
diff --git a/mail/vpopmail-devel/files/patch-config.h.in b/mail/vpopmail-devel/files/patch-config.h.in
index f795be18e767..be792244bff0 100644
--- a/mail/vpopmail-devel/files/patch-config.h.in
+++ b/mail/vpopmail-devel/files/patch-config.h.in
@@ -1,12 +1,15 @@
---- config.h.in.orig Fri Oct 24 18:43:20 2003
-+++ config.h.in Fri Oct 24 18:43:45 2003
-@@ -89,6 +89,9 @@
+--- config.h.in.orig Tue Oct 7 03:25:53 2003
++++ config.h.in Sat Nov 1 10:59:26 2003
+@@ -89,6 +89,12 @@
#undef QMAILNEWU
/* */
+#undef SPAMC
+
+/* */
++#undef SPAM_THRESHOLD
++
++/* */
#undef QMAILINJECT
/* */
diff --git a/mail/vpopmail-devel/files/patch-configure b/mail/vpopmail-devel/files/patch-configure
index af635b3504dc..1045f191c5be 100644
--- a/mail/vpopmail-devel/files/patch-configure
+++ b/mail/vpopmail-devel/files/patch-configure
@@ -1,15 +1,17 @@
--- configure.orig Fri Oct 17 01:12:22 2003
-+++ configure Sat Oct 25 01:18:27 2003
-@@ -20,6 +20,8 @@
++++ configure Sat Nov 1 14:01:27 2003
+@@ -20,6 +20,10 @@
ac_help="$ac_help
--enable-qmail-newmrh=path Full path to qmail-newmrh program"
ac_help="$ac_help
+ --enable-spamassassin=path Enable SpamAssassin. Full path to spamc program. default /usr/local/bin/spamc"
+ac_help="$ac_help
++ --enable-spam-threshold=# or n Automatically delete messages that score more than # spam hits"
++ac_help="$ac_help
--enable-vpopuser=vpopmail user vchkpw was installed as."
ac_help="$ac_help
--enable-vpopgroup=vchkpw group vchkpw was installed as."
-@@ -1317,7 +1319,7 @@
+@@ -1317,7 +1321,7 @@
;;
esac
@@ -18,7 +20,7 @@
then
echo "configure: warning: === vpopmail must be configured as root. ===" 1>&2
echo "configure: warning: === please switch to the root user and ===" 1>&2
-@@ -1446,6 +1448,27 @@
+@@ -1446,6 +1450,49 @@
EOF
@@ -41,12 +43,34 @@
+ cat >> confdefs.h <<EOF
+#define SPAMC "$spamc"
+EOF
++
++# Check whether --enable-spam-threshold or --disable-spam-threshold was given.
++if test "${enable_spam_threshold+set}" = set; then
++ enableval="$enable_spam_threshold"
++ ENABLE_SPAM_THRESHOLD=$enableval
++else
++
++ ENABLE_SPAM_THRESHOLD=0
++
++fi
++
++
++case $ENABLE_SPAM_THRESHOLD in
++0*|n*|N*)
++ ;;
++*)
++ cat >> confdefs.h <<EOF
++#define SPAM_THRESHOLD $ENABLE_SPAM_THRESHOLD
++EOF
++
++ ;;
++esac
+fi
+
vpopuser="vpopmail"
# Check whether --enable-vpopuser or --disable-vpopuser was given.
-@@ -1601,15 +1624,6 @@
+@@ -1601,15 +1648,6 @@
EOF
@@ -62,7 +86,7 @@
# Check whether --enable-roaming-users or --disable-roaming-users was given.
if test "${enable_roaming_users+set}" = set; then
enableval="$enable_roaming_users"
-@@ -1671,17 +1685,7 @@
+@@ -1671,17 +1709,7 @@
if test "${enable_tcpserver_file+set}" = set; then
enableval="$enable_tcpserver_file"
tcpserver_file="$enableval"
diff --git a/mail/vpopmail-devel/files/patch-vdelivermail.c b/mail/vpopmail-devel/files/patch-vdelivermail.c
index 8a23e9bb5c43..fd897a634c51 100644
--- a/mail/vpopmail-devel/files/patch-vdelivermail.c
+++ b/mail/vpopmail-devel/files/patch-vdelivermail.c
@@ -1,6 +1,25 @@
--- vdelivermail.c.orig Mon Oct 20 20:59:57 2003
-+++ vdelivermail.c Fri Oct 24 18:31:45 2003
-@@ -257,7 +257,7 @@
++++ vdelivermail.c Sat Nov 1 11:21:15 2003
+@@ -62,6 +62,7 @@
+ #define FILE_SIZE 156
+ char hostname[FILE_SIZE];
+ char loop_buf[FILE_SIZE];
++char spam_buf[FILE_SIZE];
+
+ #define MSG_BUF_SIZE 5000
+ char msgbuf[MSG_BUF_SIZE];
+@@ -90,6 +91,10 @@
+ void usernotfound(void);
+ int is_loop_match( char *dt, char *address);
+ int deliver_quota_warning(const char *dir, const char *q);
++#ifdef SPAM_THRESHOLD
++int is_spam(int threshold);
++int is_spam_match(char *xsl, int threshold);
++#endif
+
+ static char local_file[156];
+ static char local_file_new[156];
+@@ -257,7 +262,7 @@
/* check for wildcard if there's no match */
if(tmpstr == NULL) {
@@ -9,7 +28,7 @@
if(TheUser[i-1]=='-') {
tmpuser[0] = '\0';
strncat(tmpuser,TheUser,i);
-@@ -444,6 +444,7 @@
+@@ -444,6 +449,7 @@
int inject = 0;
FILE *fs;
char tmp_file[256];
@@ -17,7 +36,7 @@
/* check if the email is looping to this user */
if ( is_looping( address ) == 1 ) {
-@@ -631,6 +632,30 @@
+@@ -631,6 +637,51 @@
}
}
@@ -35,7 +54,7 @@
+ dup2(pim[1], 1);
+ close(pim[1]);
+ if (execl(SPAMC, SPAMC, "-u", maildir_to_email(address), 0) == -1) {
-+ while ((file_count=read(0, msgbuf, MSG_BUF_SIZE)) > 0)
++ while ((file_count = read(0, msgbuf, MSG_BUF_SIZE)) > 0)
+ write(1, msgbuf, file_count);
+ _exit(0);
+ }
@@ -44,7 +63,144 @@
+ dup2(pim[0], 0);
+ close(pim[0]);
+ }
++#ifdef SPAM_THRESHOLD
++ /* silently delete message if spam level > SPAM_THRESHOLD */
++ if (is_spam(SPAM_THRESHOLD) == 1) {
++ close(write_fd);
++ if (unlink(local_file) != 0) {
++ printf("unlink failed %s errno = %d\n", local_file, errno);
++ return(errno);
++ }
++ return(0);
++ }
++
++#ifdef MAKE_SEEKABLE
++ if (!Seekable(0))
++ MakeSeekable(stdin);
++#endif
++
++ if (lseek(0, 0L, SEEK_SET) < 0) {
++ printf("lseek errno=%d\n", errno);
++ return(errno);
++ }
++#endif
+#endif
/* read it in chunks and write it to the new file */
while((file_count=read(0,msgbuf,MSG_BUF_SIZE))>0) {
+@@ -881,6 +932,9 @@
+ if (strncmp(loop_buf, "Delivered-To: ", 14) == 0 &&
+ is_loop_match(loop_buf, address)==1 ) {
+
++ /* seek to the end of stdin */
++ fseek(stdin, 0L, SEEK_END);
++
+ /* return the loop found */
+ return(1);
+
+@@ -919,6 +973,8 @@
+ * looping not found value
+ */
+ if ( found == 0 ) {
++ /* seek to the end of stdin */
++ fseek(stdin, 0L, SEEK_END);
+ /* return not found looping message value */
+ return(0);
+ }
+@@ -1335,3 +1391,96 @@
+ return(1);
+ }
+
++#ifdef SPAM_THRESHOLD
++/* Check for a spam message
++ * This is done by checking for a matching line
++ * in the email headers for X-Spam-Level: which
++ * we put in each spam email
++ *
++ * Return 1 if spam
++ * Return 0 if not spam
++ * Return -1 on error
++ */
++int is_spam(int threshold)
++{
++ int i;
++ int found;
++
++#ifdef MAKE_SEEKABLE
++ if (!Seekable(0))
++ MakeSeekable(stdin);
++#endif
++
++ if ( lseek(0, 0L, SEEK_SET) < 0 ) {
++ printf("lseek errno=%d\n", errno);
++ return(errno);
++ }
++
++ while (fgets(spam_buf, sizeof(spam_buf), stdin) != NULL){
++
++ /* if we find the line, return error (looping) */
++ if (strncmp(spam_buf, "X-Spam-Level: ", 14) == 0 &&
++ is_spam_match(spam_buf, threshold) ==1) {
++
++ /* seek to the end of stdin */
++ fseek(stdin, 0L, SEEK_END);
++
++ /* return the spam found */
++ return(1);
++
++ /* check for the start of the body, we only need
++ * to check the headers.
++ */
++ } else {
++
++ /* walk through the charaters in the body */
++ for (i = 0, found = 0; spam_buf[i] != 0 && found == 0; ++i) {
++ switch(spam_buf[i]) {
++
++ /* skip blank spaces and new lines */
++ case ' ':
++ case '\n':
++ case '\t':
++ case '\r':
++ break;
++
++ /* found a non blank, so we are still
++ * in the headers
++ */
++ default:
++
++ /* set the found non blank char flag */
++ found = 1;
++ break;
++ }
++ }
++
++ /* if the line only had blanks, then it is the
++ * delimiting line between the headers and the
++ * body. We don't need to check the body for
++ * the X-Spam-Level: line. Hence, we
++ * are done with our search and can return the
++ * spam not found value
++ */
++ if (found == 0) {
++ /* seek to the end of stdin */
++ fseek(stdin, 0L, SEEK_END);
++ /* return not found spam message value */
++ return(0);
++ }
++ }
++ }
++
++ /* if we get here then the there is either no body
++ * or the logic above failed and we scanned
++ * the whole email, headers and body.
++ */
++ return(0);
++}
++
++int is_spam_match(char *xsl, int threshold)
++{
++ if (strlen(xsl) - strlen("X-Spam-Level: ") > threshold) return(1);
++ else return(0);
++}
++#endif
diff --git a/mail/vpopmail/Makefile b/mail/vpopmail/Makefile
index 98d51a4f888b..61f06c59cdb4 100644
--- a/mail/vpopmail/Makefile
+++ b/mail/vpopmail/Makefile
@@ -6,7 +6,7 @@
#
PORTNAME= vpopmail
-PORTVERSION= 5.3.28
+PORTVERSION= 5.3.29
CATEGORIES= mail
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE}
MASTER_SITE_SUBDIR= ${PORTNAME}
@@ -61,6 +61,7 @@ CONFIGURE_ARGS= --enable-qmaildir=${QMAIL_DIR} \
#
# HARDQUOTA - size of hard quota, or 'n' for no hard quota
# RELAYCLEAR - time in minutes before clearing relay hole (requires roaming)
+# SPAM_THRESHOLD - minimum score required to delete spam messages (requires spamassassin)
# DEFAULT_DOMAIN - default domain for non-vhost lookups
# WITH_SINGLE_DOMAIN - optimize for a site with many users in a single domain
# LOGLEVEL - n - no logging, y - log all,
@@ -115,6 +116,7 @@ CONFIGURE_ARGS= --enable-qmaildir=${QMAIL_DIR} \
HARDQUOTA?= 10000000
RELAYCLEAR?= 30
+SPAM_THRESHOLD?=15
LOGLEVEL?= y
.if defined(WITH_MYSQL)
@@ -243,7 +245,8 @@ CONFIGURE_ARGS+= --enable-domainquotas=y
.if defined(WITH_SPAMASSASSIN)
BUILD_DEPENDS= spamc:${PORTSDIR}/mail/p5-Mail-SpamAssassin
-CONFIGURE_ARGS+= --enable-spamassassin=${LOCALBASE}/bin/spamc
+CONFIGURE_ARGS+= --enable-spamassassin=${LOCALBASE}/bin/spamc \
+ --enable-spam-threshold=${SPAM_THRESHOLD}
.endif
# autoconf and automake can remove our patches to the configure scripts.
diff --git a/mail/vpopmail/distinfo b/mail/vpopmail/distinfo
index fbf89bc15ed2..50e88b0f4b7d 100644
--- a/mail/vpopmail/distinfo
+++ b/mail/vpopmail/distinfo
@@ -1 +1 @@
-MD5 (vpopmail-5.3.28.tar.gz) = 68495c9309aa03aec2a754702c4d8a67
+MD5 (vpopmail-5.3.29.tar.gz) = 42904ce91d4b0398ae8f964d692f88af
diff --git a/mail/vpopmail/files/patch-config.h.in b/mail/vpopmail/files/patch-config.h.in
index f795be18e767..be792244bff0 100644
--- a/mail/vpopmail/files/patch-config.h.in
+++ b/mail/vpopmail/files/patch-config.h.in
@@ -1,12 +1,15 @@
---- config.h.in.orig Fri Oct 24 18:43:20 2003
-+++ config.h.in Fri Oct 24 18:43:45 2003
-@@ -89,6 +89,9 @@
+--- config.h.in.orig Tue Oct 7 03:25:53 2003
++++ config.h.in Sat Nov 1 10:59:26 2003
+@@ -89,6 +89,12 @@
#undef QMAILNEWU
/* */
+#undef SPAMC
+
+/* */
++#undef SPAM_THRESHOLD
++
++/* */
#undef QMAILINJECT
/* */
diff --git a/mail/vpopmail/files/patch-configure b/mail/vpopmail/files/patch-configure
index af635b3504dc..1045f191c5be 100644
--- a/mail/vpopmail/files/patch-configure
+++ b/mail/vpopmail/files/patch-configure
@@ -1,15 +1,17 @@
--- configure.orig Fri Oct 17 01:12:22 2003
-+++ configure Sat Oct 25 01:18:27 2003
-@@ -20,6 +20,8 @@
++++ configure Sat Nov 1 14:01:27 2003
+@@ -20,6 +20,10 @@
ac_help="$ac_help
--enable-qmail-newmrh=path Full path to qmail-newmrh program"
ac_help="$ac_help
+ --enable-spamassassin=path Enable SpamAssassin. Full path to spamc program. default /usr/local/bin/spamc"
+ac_help="$ac_help
++ --enable-spam-threshold=# or n Automatically delete messages that score more than # spam hits"
++ac_help="$ac_help
--enable-vpopuser=vpopmail user vchkpw was installed as."
ac_help="$ac_help
--enable-vpopgroup=vchkpw group vchkpw was installed as."
-@@ -1317,7 +1319,7 @@
+@@ -1317,7 +1321,7 @@
;;
esac
@@ -18,7 +20,7 @@
then
echo "configure: warning: === vpopmail must be configured as root. ===" 1>&2
echo "configure: warning: === please switch to the root user and ===" 1>&2
-@@ -1446,6 +1448,27 @@
+@@ -1446,6 +1450,49 @@
EOF
@@ -41,12 +43,34 @@
+ cat >> confdefs.h <<EOF
+#define SPAMC "$spamc"
+EOF
++
++# Check whether --enable-spam-threshold or --disable-spam-threshold was given.
++if test "${enable_spam_threshold+set}" = set; then
++ enableval="$enable_spam_threshold"
++ ENABLE_SPAM_THRESHOLD=$enableval
++else
++
++ ENABLE_SPAM_THRESHOLD=0
++
++fi
++
++
++case $ENABLE_SPAM_THRESHOLD in
++0*|n*|N*)
++ ;;
++*)
++ cat >> confdefs.h <<EOF
++#define SPAM_THRESHOLD $ENABLE_SPAM_THRESHOLD
++EOF
++
++ ;;
++esac
+fi
+
vpopuser="vpopmail"
# Check whether --enable-vpopuser or --disable-vpopuser was given.
-@@ -1601,15 +1624,6 @@
+@@ -1601,15 +1648,6 @@
EOF
@@ -62,7 +86,7 @@
# Check whether --enable-roaming-users or --disable-roaming-users was given.
if test "${enable_roaming_users+set}" = set; then
enableval="$enable_roaming_users"
-@@ -1671,17 +1685,7 @@
+@@ -1671,17 +1709,7 @@
if test "${enable_tcpserver_file+set}" = set; then
enableval="$enable_tcpserver_file"
tcpserver_file="$enableval"
diff --git a/mail/vpopmail/files/patch-vdelivermail.c b/mail/vpopmail/files/patch-vdelivermail.c
index 8a23e9bb5c43..fd897a634c51 100644
--- a/mail/vpopmail/files/patch-vdelivermail.c
+++ b/mail/vpopmail/files/patch-vdelivermail.c
@@ -1,6 +1,25 @@
--- vdelivermail.c.orig Mon Oct 20 20:59:57 2003
-+++ vdelivermail.c Fri Oct 24 18:31:45 2003
-@@ -257,7 +257,7 @@
++++ vdelivermail.c Sat Nov 1 11:21:15 2003
+@@ -62,6 +62,7 @@
+ #define FILE_SIZE 156
+ char hostname[FILE_SIZE];
+ char loop_buf[FILE_SIZE];
++char spam_buf[FILE_SIZE];
+
+ #define MSG_BUF_SIZE 5000
+ char msgbuf[MSG_BUF_SIZE];
+@@ -90,6 +91,10 @@
+ void usernotfound(void);
+ int is_loop_match( char *dt, char *address);
+ int deliver_quota_warning(const char *dir, const char *q);
++#ifdef SPAM_THRESHOLD
++int is_spam(int threshold);
++int is_spam_match(char *xsl, int threshold);
++#endif
+
+ static char local_file[156];
+ static char local_file_new[156];
+@@ -257,7 +262,7 @@
/* check for wildcard if there's no match */
if(tmpstr == NULL) {
@@ -9,7 +28,7 @@
if(TheUser[i-1]=='-') {
tmpuser[0] = '\0';
strncat(tmpuser,TheUser,i);
-@@ -444,6 +444,7 @@
+@@ -444,6 +449,7 @@
int inject = 0;
FILE *fs;
char tmp_file[256];
@@ -17,7 +36,7 @@
/* check if the email is looping to this user */
if ( is_looping( address ) == 1 ) {
-@@ -631,6 +632,30 @@
+@@ -631,6 +637,51 @@
}
}
@@ -35,7 +54,7 @@
+ dup2(pim[1], 1);
+ close(pim[1]);
+ if (execl(SPAMC, SPAMC, "-u", maildir_to_email(address), 0) == -1) {
-+ while ((file_count=read(0, msgbuf, MSG_BUF_SIZE)) > 0)
++ while ((file_count = read(0, msgbuf, MSG_BUF_SIZE)) > 0)
+ write(1, msgbuf, file_count);
+ _exit(0);
+ }
@@ -44,7 +63,144 @@
+ dup2(pim[0], 0);
+ close(pim[0]);
+ }
++#ifdef SPAM_THRESHOLD
++ /* silently delete message if spam level > SPAM_THRESHOLD */
++ if (is_spam(SPAM_THRESHOLD) == 1) {
++ close(write_fd);
++ if (unlink(local_file) != 0) {
++ printf("unlink failed %s errno = %d\n", local_file, errno);
++ return(errno);
++ }
++ return(0);
++ }
++
++#ifdef MAKE_SEEKABLE
++ if (!Seekable(0))
++ MakeSeekable(stdin);
++#endif
++
++ if (lseek(0, 0L, SEEK_SET) < 0) {
++ printf("lseek errno=%d\n", errno);
++ return(errno);
++ }
++#endif
+#endif
/* read it in chunks and write it to the new file */
while((file_count=read(0,msgbuf,MSG_BUF_SIZE))>0) {
+@@ -881,6 +932,9 @@
+ if (strncmp(loop_buf, "Delivered-To: ", 14) == 0 &&
+ is_loop_match(loop_buf, address)==1 ) {
+
++ /* seek to the end of stdin */
++ fseek(stdin, 0L, SEEK_END);
++
+ /* return the loop found */
+ return(1);
+
+@@ -919,6 +973,8 @@
+ * looping not found value
+ */
+ if ( found == 0 ) {
++ /* seek to the end of stdin */
++ fseek(stdin, 0L, SEEK_END);
+ /* return not found looping message value */
+ return(0);
+ }
+@@ -1335,3 +1391,96 @@
+ return(1);
+ }
+
++#ifdef SPAM_THRESHOLD
++/* Check for a spam message
++ * This is done by checking for a matching line
++ * in the email headers for X-Spam-Level: which
++ * we put in each spam email
++ *
++ * Return 1 if spam
++ * Return 0 if not spam
++ * Return -1 on error
++ */
++int is_spam(int threshold)
++{
++ int i;
++ int found;
++
++#ifdef MAKE_SEEKABLE
++ if (!Seekable(0))
++ MakeSeekable(stdin);
++#endif
++
++ if ( lseek(0, 0L, SEEK_SET) < 0 ) {
++ printf("lseek errno=%d\n", errno);
++ return(errno);
++ }
++
++ while (fgets(spam_buf, sizeof(spam_buf), stdin) != NULL){
++
++ /* if we find the line, return error (looping) */
++ if (strncmp(spam_buf, "X-Spam-Level: ", 14) == 0 &&
++ is_spam_match(spam_buf, threshold) ==1) {
++
++ /* seek to the end of stdin */
++ fseek(stdin, 0L, SEEK_END);
++
++ /* return the spam found */
++ return(1);
++
++ /* check for the start of the body, we only need
++ * to check the headers.
++ */
++ } else {
++
++ /* walk through the charaters in the body */
++ for (i = 0, found = 0; spam_buf[i] != 0 && found == 0; ++i) {
++ switch(spam_buf[i]) {
++
++ /* skip blank spaces and new lines */
++ case ' ':
++ case '\n':
++ case '\t':
++ case '\r':
++ break;
++
++ /* found a non blank, so we are still
++ * in the headers
++ */
++ default:
++
++ /* set the found non blank char flag */
++ found = 1;
++ break;
++ }
++ }
++
++ /* if the line only had blanks, then it is the
++ * delimiting line between the headers and the
++ * body. We don't need to check the body for
++ * the X-Spam-Level: line. Hence, we
++ * are done with our search and can return the
++ * spam not found value
++ */
++ if (found == 0) {
++ /* seek to the end of stdin */
++ fseek(stdin, 0L, SEEK_END);
++ /* return not found spam message value */
++ return(0);
++ }
++ }
++ }
++
++ /* if we get here then the there is either no body
++ * or the logic above failed and we scanned
++ * the whole email, headers and body.
++ */
++ return(0);
++}
++
++int is_spam_match(char *xsl, int threshold)
++{
++ if (strlen(xsl) - strlen("X-Spam-Level: ") > threshold) return(1);
++ else return(0);
++}
++#endif