aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--THANKS15
-rw-r--r--doc/Makefile.am4
-rwxr-xr-xdoc/gendocs.sh310
-rwxr-xr-xdoc/gendocs_template14
-rw-r--r--src/bi_sa.m4218
-rw-r--r--src/engine.c1
7 files changed, 82 insertions, 494 deletions
diff --git a/ChangeLog b/ChangeLog
index 39c25464..24ee13f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2007-11-11 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ * src/engine.c (check_on_host): Wait for an answer to QUIT.
+ Fix courtesy of Nacho Gonzalez Lopez.
+ * src/bi_sa.m4: Revert the changes inadvertently pushed on
+ 2007-10-21.
+ * doc/Makefile.am: Use texi2html to produce HTML version of the
+ manual.
+ * doc/gendocs_template: Likewise
+ * doc/gendocs.sh: Remove. Changes incorporated into the Texinfo
+ repository.
+ * doc/gendocs_template: Use conditionals, introduced in the
+ Texinfo CVS.
+
2007-10-29 Sergey Poznyakoff <gray@gnu.org.ua>
* src/dnsbase.c (domain_name_cmp): Allow for trailing dot after
diff --git a/THANKS b/THANKS
index af3cb58c..d5d03e90 100644
--- a/THANKS
+++ b/THANKS
@@ -2,9 +2,20 @@ Mailfromd THANKS file.
Many people further contributed to mailfromd by reporting problems,
suggesting various improvements or submitting actual code. Here is a list
-of these people. Help us keep it complete and exempt of errors.
+of these people in alphabetical order. Help us keep it complete and exempt
+of errors.
+Alan Dobkin <MailFromD@omnicomp.org>
+Brent Spencer <bspencer@XsiteDesigns.com>
Jan Rafaj <jr-mailfromd@cedric.unob.cz>
+Jeff Ballard <ballard@engr.wisc.edu>
+Nacho González López <nacho@es.gnu.org>
Peter Markeloff <magic@farlep.net>
Sergey Afonin <a_s_y@sama.ru>
-Zeus Panchenko <zeus@dn.farlep.net> \ No newline at end of file
+Zeus Panchenko <zeus@dn.farlep.net>
+
+
+;;;; Local Variables:
+;;;; mode: Fundamental
+;;;; coding: utf-8
+;;;; End:
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 77ac5efe..2ac69c35 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -127,7 +127,7 @@ final: untabify master-menu
MAKEINFOFLAGS=-D$(RENDITION)
-GENDOCS=${top_srcdir}/doc/gendocs.sh
+GENDOCS=gendocs.sh
TEXI2DVI=texi2dvi -t '@set $(RENDITION)' -E
@@ -137,5 +137,5 @@ manual:
TEXINPUTS=$(srcdir):$(top_srcdir)/build-aux:$(TEXINPUTS) \
MAKEINFO="$(MAKEINFO) $(MAKEINFOFLAGS)" \
TEXI2DVI="$(TEXI2DVI) -t @finalout" \
- $(GENDOCS) $(PACKAGE) '$(PACKAGE_NAME) manual'
+ $(GENDOCS) --texi2html $(PACKAGE) '$(PACKAGE_NAME) manual'
diff --git a/doc/gendocs.sh b/doc/gendocs.sh
deleted file mode 100755
index fc5beeb6..00000000
--- a/doc/gendocs.sh
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/bin/sh
-# gendocs.sh -- generate a GNU manual in many formats. This script is
-# mentioned in maintain.texi. See the help message below for usage details.
-
-scriptversion=2007-10-23.16.gray
-
-# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License,
-# or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# Original author: Mohit Agarwal.
-# Send bug reports and any other correspondence to bug-texinfo@gnu.org.
-
-prog=`basename "$0"`
-srcdir=`pwd`
-
-scripturl="http://svn.gnu.org.ua/viewvc/mailfromd/trunk/doc/gendocs.sh"
-templateurl="http://svn.gnu.org.ua/viewvc/mailfromd/trunk/doc/gendocs_template"
-
-: ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="}
-: ${MAKEINFO="makeinfo"}
-: ${TEXI2DVI="texi2dvi -t @finalout"}
-: ${DVIPS="dvips"}
-: ${DOCBOOK2HTML="docbook2html"}
-: ${DOCBOOK2PDF="docbook2pdf"}
-: ${DOCBOOK2PS="docbook2ps"}
-: ${DOCBOOK2TXT="docbook2txt"}
-: ${GENDOCS_TEMPLATE_DIR="."}
-: ${TEXI2HTML="texi2html"}
-unset CDPATH
-
-version="gendocs.sh $scriptversion
-
-Copyright (C) 2007 Free Software Foundation, Inc.
-There is NO warranty. You may redistribute this software
-under the terms of the GNU General Public License.
-For more information about these matters, see the files named COPYING."
-
-usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
-
-Generate various output formats from PACKAGE.texinfo (or .texi or .txi) source.
-See the GNU Maintainers document for a more extensive discussion:
- http://www.gnu.org/prep/maintain_toc.html
-
-Options:
- -o OUTDIR write files into OUTDIR, instead of manual/.
- --docbook convert to DocBook too (xml, txt, html, pdf and ps).
- --html ARG pass indicated ARG to makeinfo for HTML targets.
- --help display this help and exit successfully.
- --version display version information and exit successfully.
-
-Simple example: $prog emacs \"GNU Emacs Manual\"
-
-Typical sequence:
- cd YOURPACKAGESOURCE/doc
- wget \"$scripturl\"
- wget \"$templateurl\"
- $prog YOURMANUAL \"GNU YOURMANUAL - One-line description\"
-
-Output will be in a new subdirectory \"manual\" (by default, use -o OUTDIR
-to override). Move all the new files into your web CVS tree, as
-explained in the Web Pages node of maintain.texi.
-
-MANUAL-TITLE is included as part of the HTML <title> of the overall
-manual/index.html file. It should include the name of the package being
-documented. manual/index.html is created by substitution from the file
-$GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the
-generic template for your own purposes.)
-
-If you have several manuals, you'll need to run this script several
-times with different YOURMANUAL values, specifying a different output
-directory with -o each time. Then write (by hand) an overall index.html
-with links to them all.
-
-If a manual's texinfo sources are spread across several directories,
-first copy or symlink all Texinfo sources into a single directory.
-(Part of the script's work is to make a tar.gz of the sources.)
-
-You can set the environment variables MAKEINFO, TEXI2DVI, and DVIPS to
-control the programs that get executed, and GENDOCS_TEMPLATE_DIR to
-control where the gendocs_template file is looked for. (With --docbook,
-the environment variables DOCBOOK2HTML, DOCBOOK2PDF, DOCBOOK2PS, and
-DOCBOOK2TXT are also respected.)
-
-By default, makeinfo is run in the default (English) locale, since
-that's the language of most Texinfo manuals. If you happen to have a
-non-English manual and non-English web site, check the SETLANG setting
-in the source.
-
-Email bug reports or enhancement requests to bug-texinfo@gnu.org.
-"
-
-calcsize()
-{
- size=`ls -ksl $1 | awk '{print $1}'`
- echo $size
-}
-
-outdir=manual
-html=
-PACKAGE=
-MANUAL_TITLE=
-
-while test $# -gt 0; do
- case $1 in
- --help) echo "$usage"; exit 0;;
- --version) echo "$version"; exit 0;;
- -o) shift; outdir=$1;;
- --docbook) docbook=yes;;
- --html) shift; html=$1;;
- -*)
- echo "$0: Unknown or ambiguous option \`$1'." >&2
- echo "$0: Try \`--help' for more information." >&2
- exit 1;;
- *)
- if test -z "$PACKAGE"; then
- PACKAGE=$1
- elif test -z "$MANUAL_TITLE"; then
- MANUAL_TITLE=$1
- else
- echo "$0: extra non-option argument \`$1'." >&2
- exit 1
- fi;;
- esac
- shift
-done
-
-if test -s "$srcdir/$PACKAGE.texinfo"; then
- srcfile=$srcdir/$PACKAGE.texinfo
-elif test -s "$srcdir/$PACKAGE.texi"; then
- srcfile=$srcdir/$PACKAGE.texi
-elif test -s "$srcdir/$PACKAGE.txi"; then
- srcfile=$srcdir/$PACKAGE.txi
-else
- echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
- exit 1
-fi
-
-if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
- echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
- echo "$0: it is available from $templateurl." >&2
- exit 1
-fi
-
-echo Generating output formats for $srcfile
-
-cmd="$SETLANG $MAKEINFO -o $PACKAGE.info \"$srcfile\""
-echo "Generating info files... ($cmd)"
-eval "$cmd"
-mkdir -p $outdir/
-tar czf $outdir/$PACKAGE.info.tar.gz $PACKAGE.info*
-info_tgz_size=`calcsize $outdir/$PACKAGE.info.tar.gz`
-# do not mv the info files, there's no point in having them available
-# separately on the web.
-
-cmd="${TEXI2DVI} \"$srcfile\""
-echo "Generating dvi ... ($cmd)"
-eval "$cmd"
-
-# now, before we compress dvi:
-echo Generating postscript...
-${DVIPS} $PACKAGE -o
-gzip -f -9 $PACKAGE.ps
-ps_gz_size=`calcsize $PACKAGE.ps.gz`
-mv $PACKAGE.ps.gz $outdir/
-
-# compress/finish dvi:
-gzip -f -9 $PACKAGE.dvi
-dvi_gz_size=`calcsize $PACKAGE.dvi.gz`
-mv $PACKAGE.dvi.gz $outdir/
-
-cmd="${TEXI2DVI} --pdf \"$srcfile\""
-echo "Generating pdf ... ($cmd)"
-eval "$cmd"
-pdf_size=`calcsize $PACKAGE.pdf`
-mv $PACKAGE.pdf $outdir/
-
-cmd="$SETLANG $MAKEINFO -o $PACKAGE.txt --no-split --no-headers \"$srcfile\""
-echo "Generating ASCII... ($cmd)"
-eval "$cmd"
-ascii_size=`calcsize $PACKAGE.txt`
-gzip -f -9 -c $PACKAGE.txt >$outdir/$PACKAGE.txt.gz
-ascii_gz_size=`calcsize $outdir/$PACKAGE.txt.gz`
-mv $PACKAGE.txt $outdir/
-
-cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html $html \"$srcfile\""
-echo "Generating monolithic html... ($cmd)"
-rm -rf $PACKAGE.html # in case a directory is left over
-eval "$cmd"
-html_mono_size=`calcsize $PACKAGE.html`
-gzip -f -9 -c $PACKAGE.html >$outdir/$PACKAGE.html.gz
-html_mono_gz_size=`calcsize $outdir/$PACKAGE.html.gz`
-mv $PACKAGE.html $outdir/
-
-html_split() {
- cmd="$SETLANG $TEXI2HTML --output $PACKAGE.html --split=$1 $html \"$srcfile\""
- echo "Generating html by $1... ($cmd)"
- eval "$cmd"
- split_html_dir=$PACKAGE.html
- (
- cd ${split_html_dir} || exit 1
- ln -sf ${PACKAGE}.html index.html
- tar -czf ../$outdir/${PACKAGE}.html_$1.tar.gz -- *.html
- )
- eval html_$1_tgz_size=`calcsize $outdir/${PACKAGE}.html_$1.tar.gz`
- rm -f $outdir/html_$1/*.html
- mkdir -p $outdir/html_$1/
- mv ${split_html_dir}/*.html $outdir/html_$1/
- rmdir ${split_html_dir}
-}
-
-html_split node
-html_split chapter
-html_split section
-
-echo Making .tar.gz for sources...
-srcfiles=`ls *.texinfo *.texi *.txi *.eps 2>/dev/null`
-tar cvzfh $outdir/$PACKAGE.texi.tar.gz $srcfiles
-texi_tgz_size=`calcsize $outdir/$PACKAGE.texi.tar.gz`
-
-if test -n "$docbook"; then
- cmd="$SETLANG $MAKEINFO -o - --docbook \"$srcfile\" > ${srcdir}/$PACKAGE-db.xml"
- echo "Generating docbook XML... $(cmd)"
- eval "$cmd"
- docbook_xml_size=`calcsize $PACKAGE-db.xml`
- gzip -f -9 -c $PACKAGE-db.xml >$outdir/$PACKAGE-db.xml.gz
- docbook_xml_gz_size=`calcsize $outdir/$PACKAGE-db.xml.gz`
- mv $PACKAGE-db.xml $outdir/
-
- cmd="${DOCBOOK2HTML} -o $split_html_db_dir ${outdir}/$PACKAGE-db.xml"
- echo "Generating docbook HTML... ($cmd)"
- eval "$cmd"
- split_html_db_dir=html_node_db
- (
- cd ${split_html_db_dir} || exit 1
- tar -czf ../$outdir/${PACKAGE}.html_node_db.tar.gz -- *.html
- )
- html_node_db_tgz_size=`calcsize $outdir/${PACKAGE}.html_node_db.tar.gz`
- rm -f $outdir/html_node_db/*.html
- mkdir -p $outdir/html_node_db
- mv ${split_html_db_dir}/*.html $outdir/html_node_db/
- rmdir ${split_html_db_dir}
-
- cmd="${DOCBOOK2TXT} ${outdir}/$PACKAGE-db.xml"
- echo "Generating docbook ASCII... ($cmd)"
- eval "$cmd"
- docbook_ascii_size=`calcsize $PACKAGE-db.txt`
- mv $PACKAGE-db.txt $outdir/
-
- cmd="${DOCBOOK2PS} ${outdir}/$PACKAGE-db.xml"
- echo "Generating docbook PS... $(cmd)"
- eval "$cmd"
- gzip -f -9 -c $PACKAGE-db.ps >$outdir/$PACKAGE-db.ps.gz
- docbook_ps_gz_size=`calcsize $outdir/$PACKAGE-db.ps.gz`
- mv $PACKAGE-db.ps $outdir/
-
- cmd="${DOCBOOK2PDF} ${outdir}/$PACKAGE-db.xml"
- echo "Generating docbook PDF... ($cmd)"
- eval "$cmd"
- docbook_pdf_size=`calcsize $PACKAGE-db.pdf`
- mv $PACKAGE-db.pdf $outdir/
-fi
-
-echo Writing index file...
-curdate=`date '+%B %d, %Y'`
-sed \
- -e "s!%%TITLE%%!$MANUAL_TITLE!g" \
- -e "s!%%DATE%%!$curdate!g" \
- -e "s!%%PACKAGE%%!$PACKAGE!g" \
- -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
- -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
- -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
- -e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \
- -e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \
- -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
- -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
- -e "s!%%PDF_SIZE%%!$pdf_size!g" \
- -e "s!%%PS_GZ_SIZE%%!$ps_gz_size!g" \
- -e "s!%%ASCII_SIZE%%!$ascii_size!g" \
- -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
- -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
- -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
- -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
- -e "s!%%DOCBOOK_PS_GZ_SIZE%%!$docbook_ps_gz_size!g" \
- -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
- -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
- -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
- -e "s,%%SCRIPTURL%%,$scripturl,g" \
- -e "s!%%SCRIPTNAME%%!$prog!g" \
-$GENDOCS_TEMPLATE_DIR/gendocs_template >$outdir/index.html
-
-echo "Done! See $outdir/ subdirectory for new files."
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H.gray"
-# time-stamp-end: "$"
-# End:
diff --git a/doc/gendocs_template b/doc/gendocs_template
index 030f311c..c8b7c059 100755
--- a/doc/gendocs_template
+++ b/doc/gendocs_template
@@ -38,25 +38,33 @@
<ul>
<li><a href="%%PACKAGE%%.html">HTML
- (%%HTML_MONO_SIZE%%K characters)</a> - entirely on one web page.</li>
+ (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
<li><a href="html_node/index.html">HTML</a> - with one web page per
node.</li>
+%%IF HTML_SECTION%%
<li><a href="html_section/index.html">HTML</a> - with one web page per
section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
<li><a href="html_chapter/index.html">HTML</a> - with one web page per
chapter.</li>
+%%ENDIF HTML_CHAPTER%%
<li><a href="%%PACKAGE%%.html.gz">HTML compressed
- (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
- one web page.</li>
+ (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
+ one web page.</li>
<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
(%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
with one web page per node.</li>
+%%IF HTML_SECTION%%
<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
(%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
with one web page per section.</li>
+%%ENDIF HTML_SECTION%%
+%%IF HTML_CHAPTER%%
<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
(%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
with one web page per chapter.</li>
+%%ENDIF HTML_CHAPTER%%
<li><a href="%%PACKAGE%%.info.tar.gz">Info document
(%%INFO_TGZ_SIZE%%K characters gzipped tar file)</a>.</li>
<li><a href="%%PACKAGE%%.txt">ASCII text
diff --git a/src/bi_sa.m4 b/src/bi_sa.m4
index 8472bbe9..0ed7472b 100644
--- a/src/bi_sa.m4
+++ b/src/bi_sa.m4
@@ -27,150 +27,27 @@ MF_VAR(sa_threshold, NUMBER);
MF_VAR(sa_keywords, STRING);
MF_VAR(clamav_virus_name, STRING);
-
-struct mf_stream {
- eval_environ_t env;
- mu_stream_t str;
- time_t start;
- time_t timeout;
-};
-
-typedef struct mf_stream *mf_stream_t;
-
-/* FIXME: duplicated in engine.c */
-#define UPDATE_TTW(t,start) do { \
- time_t delta = time(NULL) - start; \
- if (t > delta) \
- t -= delta; \
- else \
- t = 0; \
-} while (0)
-
-extern int smtp_stream_wait(mu_stream_t stream, int flags, time_t *timeout);
-static void spamd_destroy(mf_stream_t *pstream);
-
-mf_stream_t
-mf_stream_new (eval_environ_t env, mu_stream_t stream, time_t start,
- time_t timeout)
-{
- mf_stream_t pmfs = xmalloc (sizeof pmfs[0]);
- pmfs->env = env;
- pmfs->str = stream;
- pmfs->start = start;
- pmfs->timeout = timeout;
- return pmfs;
-}
-
-int
-mf_stream_sequential_read(mf_stream_t stream, char *buf, size_t size)
-{
- int rc;
- eval_environ_t env = stream->env;
-
- if (stream->timeout == 0) {
- spamd_destroy(&stream);
- MF_THROW(mf_temp_failure,
- "sa_sequential_read: %s",
- mu_strerror(ETIMEDOUT));
- }
-
- rc = smtp_stream_wait(stream->str, MU_STREAM_READY_RD,
- &stream->timeout);
- if (rc == 0) {
- UPDATE_TTW(stream->timeout, stream->start);
- rc = mu_stream_sequential_read(stream->str, buf, size, NULL);
- } else {
- spamd_destroy(&stream);
- MF_THROW(mf_temp_failure,
- "sa_sequential_read: %s",
- mu_strerror(ETIMEDOUT));
- }
-
- return rc;
-}
-
-int
-mf_stream_sequential_readline(mf_stream_t stream, char *buf, size_t size,
- size_t *nbytes)
-{
- int rc;
- eval_environ_t env = stream->env;
-
- if (stream->timeout == 0) {
- spamd_destroy(&stream);
- MF_THROW(mf_temp_failure,
- "sa_sequential_readline: %s",
- mu_strerror(ETIMEDOUT));
- }
- rc = smtp_stream_wait(stream->str, MU_STREAM_READY_RD,
- &stream->timeout);
- if (rc == 0) {
- UPDATE_TTW(stream->timeout, stream->start);
- rc = mu_stream_sequential_readline(stream->str, buf, size,
- nbytes);
- } else {
- spamd_destroy(&stream);
- MF_THROW(mf_temp_failure,
- "sa_sequential_readline: %s",
- mu_strerror(ETIMEDOUT));
- }
- return rc;
-}
-
-int
-mf_stream_sequential_write(mf_stream_t stream, char *buf, size_t size)
-{
- int rc;
- eval_environ_t env = stream->env;
-
- if (stream->timeout == 0) {
- spamd_destroy(&stream);
- MF_THROW(mf_temp_failure,
- "sa_sequential_write: %s",
- mu_strerror(ETIMEDOUT));
- }
-
- rc = smtp_stream_wait(stream->str, MU_STREAM_READY_WR,
- &stream->timeout);
- if (rc == 0) {
- UPDATE_TTW(stream->timeout, stream->start);
- rc = mu_stream_sequential_write(stream->str, buf, size);
- } else {
- spamd_destroy(&stream);
- MF_THROW(mf_temp_failure,
- "sa_sequential_write: %s",
- mu_strerror(ETIMEDOUT));
- }
- return rc;
-}
-
-
-
static int
-spamd_connect_tcp(eval_environ_t env, mf_stream_t *pmfs,
- char *host, int port, time_t timeout)
+spamd_connect_tcp(eval_environ_t env, mu_stream_t *stream,
+ char *host, int port)
{
- mu_stream_t stream;
- int rc = mu_tcp_stream_create(&stream, host, port, 0);
+ int rc = mu_tcp_stream_create(stream, host, port, 0);
MF_ASSERT(rc == 0, mf_failure,
"mu_tcp_stream_create: %s",
mu_strerror(rc));
- rc = mu_stream_open(stream);
+ rc = mu_stream_open(*stream);
MF_ASSERT(rc == 0, mf_failure,
"mu_stream_open: %s",
mu_strerror(rc));
- *pmfs = mf_stream_new(env, stream, time(NULL), timeout);
return rc;
}
static int
-spamd_connect_socket(eval_environ_t env, mf_stream_t *pmfs, char *path,
- time_t timeout)
+spamd_connect_socket(eval_environ_t env, mu_stream_t *stream, char *path)
{
int fd, rc;
FILE *fp;
struct sockaddr_un addr;
- mu_stream_t stream;
fd = socket(PF_UNIX, SOCK_STREAM, 0);
MF_ASSERT(fd >= 0, mf_failure,
@@ -186,7 +63,7 @@ spamd_connect_socket(eval_environ_t env, mf_stream_t *pmfs, char *path,
}
fp = fdopen(fd, "w+");
- rc = mu_stdio_stream_create(&stream, fp, MU_STREAM_RDWR);
+ rc = mu_stdio_stream_create(stream, fp, MU_STREAM_RDWR);
if (rc) {
fclose(fp);
MF_THROW(mf_failure,
@@ -194,28 +71,25 @@ spamd_connect_socket(eval_environ_t env, mf_stream_t *pmfs, char *path,
mu_strerror(rc));
}
- rc = mu_stream_open(stream);
+ rc = mu_stream_open(*stream);
if (rc) {
- mu_stream_destroy(&stream, mu_stream_get_owner(stream));
+ mu_stream_destroy (stream, mu_stream_get_owner (*stream));
fclose(fp);
MF_THROW(mf_failure,
"mu_stream_open: %s",
mu_strerror(rc));
}
-
- *pmfs = mf_stream_new(env, stream, time(NULL), timeout);
-
return rc;
}
static void
-spamd_shutdown(mf_stream_t stream, int isfile, int flag)
+spamd_shutdown(mu_stream_t stream, int isfile, int flag)
{
int fd;
- mu_transport_t trans;
- mu_stream_flush(stream->str);
- mu_stream_get_transport(stream->str, &trans);
+ mu_transport_t trans;
+ mu_stream_flush(stream);
+ mu_stream_get_transport(stream, &trans);
if (isfile)
fd = fileno((FILE*)trans);
else
@@ -224,17 +98,14 @@ spamd_shutdown(mf_stream_t stream, int isfile, int flag)
}
static void
-spamd_destroy(mf_stream_t *pstream)
+spamd_destroy(mu_stream_t *stream)
{
- mf_stream_t stream = *pstream;
- mu_stream_close(stream->str);
- mu_stream_destroy(&stream->str, mu_stream_get_owner(stream->str));
- free(stream);
- *pstream = NULL;
+ mu_stream_close(*stream);
+ mu_stream_destroy(stream, mu_stream_get_owner(*stream));
}
static void
-spamd_send_command(mf_stream_t stream, const char *fmt, ...)
+spamd_send_command(mu_stream_t stream, const char *fmt, ...)
{
char buf[512];
size_t n;
@@ -243,12 +114,12 @@ spamd_send_command(mf_stream_t stream, const char *fmt, ...)
va_start (ap, fmt);
n = vsnprintf (buf, sizeof buf, fmt, ap);
va_end (ap);
- mf_stream_sequential_write(stream, buf, n);
- mf_stream_sequential_write(stream, "\r\n", 2);
+ mu_stream_sequential_write(stream, buf, n);
+ mu_stream_sequential_write(stream, "\r\n", 2);
}
static void
-spamd_send_stream(mf_stream_t stream, mu_stream_t instr)
+spamd_send_stream(mu_stream_t stream, mu_stream_t instr)
{
size_t size;
char buf[512];
@@ -258,15 +129,15 @@ spamd_send_stream(mf_stream_t stream, mu_stream_t instr)
&size) == 0
&& size > 0) {
debug3(80,"<< %*.*s", size, size, buf);
- mf_stream_sequential_write(stream, buf, size);
+ mu_stream_sequential_write (stream, buf, size);
}
}
static int
-spamd_read_line(mf_stream_t stream, char *buffer, size_t size, size_t *pn)
+spamd_read_line(mu_stream_t stream, char *buffer, size_t size, size_t *pn)
{
size_t n = 0;
- int rc = mf_stream_sequential_readline(stream, buffer, size, &n);
+ int rc = mu_stream_sequential_readline(stream, buffer, size, &n);
if (rc == 0) {
if (pn)
*pn = n;
@@ -316,11 +187,11 @@ decode_float(long *vn, char *str, int digits)
}
static int
-decode_boolean(char *str)
+decode_boolean (char *str)
{
- if (strcasecmp(str, "true") == 0)
+ if (strcasecmp (str, "true") == 0)
return 1;
- else if (strcasecmp(str, "false") == 0)
+ else if (strcasecmp (str, "false") == 0)
return 0;
/*else?*/
return 0;
@@ -351,13 +222,12 @@ sigpipe_handler (int sig)
got_sigpipe = 1;
}
-mf_stream_t
-open_connection(eval_environ_t env, char *urlstr, int *isfile, char **phost,
- long timeout)
+mu_stream_t
+open_connection(eval_environ_t env, char *urlstr, int *isfile, char **phost)
{
char *path = NULL;
short port = 0;
- mf_stream_t str = NULL;
+ mu_stream_t str = NULL;
int rc;
if (urlstr[0] == '/') {
@@ -440,10 +310,10 @@ open_connection(eval_environ_t env, char *urlstr, int *isfile, char **phost,
}
if (port == 0) {
- rc = spamd_connect_socket(env, &str, path, timeout);
+ rc = spamd_connect_socket(env, &str, path);
*isfile = 1;
} else {
- rc = spamd_connect_tcp(env, &str, path, port, timeout);
+ rc = spamd_connect_tcp(env, &str, path, port);
*isfile = 0;
}
@@ -462,12 +332,12 @@ open_connection(eval_environ_t env, char *urlstr, int *isfile, char **phost,
MF_STATE(eom)
MF_CAPTURE
-MF_DEFUN(sa, NUMBER, STRING urlstr, NUMBER prec, OPTIONAL, NUMBER timeout)
+MF_DEFUN(sa, NUMBER, STRING urlstr, NUMBER prec)
{
mu_off_t msize;
size_t size;
mu_stream_t mstr = env_get_stream(env);
- mf_stream_t ostr;
+ mu_stream_t ostr;
signal_handler_fn handler;
char buffer[512];
char version_str[19];
@@ -477,8 +347,7 @@ MF_DEFUN(sa, NUMBER, STRING urlstr, NUMBER prec, OPTIONAL, NUMBER timeout)
long score, threshold;
int isfile;
- ostr = open_connection(env, urlstr, &isfile, NULL,
- MF_OPTVAL(timeout, 7200));
+ ostr = open_connection(env, urlstr, &isfile, NULL);
mu_stream_size(mstr, &msize);
spamd_send_command(ostr, "SYMBOLS SPAMC/1.2");
spamd_send_command(ostr, "Content-length: %lu",
@@ -545,11 +414,10 @@ END
MF_STATE(eom)
MF_CAPTURE
-MF_DEFUN(clamav, NUMBER, STRING urlstr, OPTIONAL, NUMBER timeout)
+MF_DEFUN(clamav, NUMBER, STRING urlstr)
{
mu_stream_t mstr = env_get_stream(env);
- mf_stream_t cstr, dstr;
- mu_stream_t str;
+ mu_stream_t cstr, dstr;
char buffer[512];
char *host;
unsigned short port;
@@ -557,9 +425,8 @@ MF_DEFUN(clamav, NUMBER, STRING urlstr, OPTIONAL, NUMBER timeout)
signal_handler_fn handler;
char *p;
int isfile;
-
- cstr = open_connection(env, urlstr, &isfile, &host,
- MF_OPTVAL(timeout, 7200));
+
+ cstr = open_connection(env, urlstr, &isfile, &host);
spamd_send_command(cstr, "STREAM");
spamd_read_line(cstr, buffer, sizeof buffer, NULL);
@@ -572,8 +439,8 @@ MF_DEFUN(clamav, NUMBER, STRING urlstr, OPTIONAL, NUMBER timeout)
if (!host)
host = strdup("127.0.0.1"); /* FIXME */
-
- rc = mu_tcp_stream_create(&str, host, port, 0);
+
+ rc = mu_tcp_stream_create(&dstr, host, port, 0);
free(host);
if (rc) {
spamd_destroy(&cstr);
@@ -582,21 +449,18 @@ MF_DEFUN(clamav, NUMBER, STRING urlstr, OPTIONAL, NUMBER timeout)
mu_strerror(rc));
}
- rc = mu_stream_open(str);
+ rc = mu_stream_open(dstr);
if (rc) {
spamd_destroy(&cstr);
- mu_stream_destroy(&str, mu_stream_get_owner(str));
+ mu_stream_destroy(&dstr, mu_stream_get_owner(dstr));
MF_THROW(mf_failure,
"mu_stream_open: %s",
mu_strerror(rc));
}
handler = set_signal_handler(SIGPIPE, sigpipe_handler);
- dstr = mf_stream_new (env, str, cstr->start, cstr->timeout);
spamd_send_stream(dstr, mstr);
spamd_shutdown(dstr, 0, SHUT_WR);
- spamd_destroy(&dstr);
-
set_signal_handler(SIGPIPE, handler);
rc = spamd_read_line(cstr, buffer, sizeof buffer, NULL);
diff --git a/src/engine.c b/src/engine.c
index bb3fa18c..a2b26f50 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -713,6 +713,7 @@ check_on_host(eval_environ_t env, char *email, char *client_addr,
smtp_last_received(&io));
smtp_send2(&io, "QUIT", NULL);
+ smtp_recv(&io);
smtp_io_data_destroy(&io);
}

Return to:

Send suggestions and report system problems to the System administrator.