diff options
author | roam <roam@FreeBSD.org> | 2003-11-03 21:42:16 +0800 |
---|---|---|
committer | roam <roam@FreeBSD.org> | 2003-11-03 21:42:16 +0800 |
commit | 74f876aca6c8764fdf861bacdcfb382328497586 (patch) | |
tree | 7c297ad9bf1a40997ecee93caab5413e72e12fb3 | |
parent | 3b914aa475672256aa8da2551a127ab62d69d172 (diff) | |
download | freebsd-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/Makefile | 7 | ||||
-rw-r--r-- | mail/vpopmail-devel/distinfo | 2 | ||||
-rw-r--r-- | mail/vpopmail-devel/files/patch-config.h.in | 9 | ||||
-rw-r--r-- | mail/vpopmail-devel/files/patch-configure | 36 | ||||
-rw-r--r-- | mail/vpopmail-devel/files/patch-vdelivermail.c | 166 | ||||
-rw-r--r-- | mail/vpopmail/Makefile | 7 | ||||
-rw-r--r-- | mail/vpopmail/distinfo | 2 | ||||
-rw-r--r-- | mail/vpopmail/files/patch-config.h.in | 9 | ||||
-rw-r--r-- | mail/vpopmail/files/patch-configure | 36 | ||||
-rw-r--r-- | mail/vpopmail/files/patch-vdelivermail.c | 166 |
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 |