From 4b9defbcfe01fb05acf9ecd74a683390d6110872 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Sun, 11 Nov 2007 11:42:46 +0000 Subject: * 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. git-svn-id: file:///svnroot/mailfromd/trunk@1526 7a8a7f39-df28-0410-adc6-e0d955640f24 --- ChangeLog | 14 +++ THANKS | 15 ++- doc/Makefile.am | 4 +- doc/gendocs.sh | 310 --------------------------------------------------- doc/gendocs_template | 14 ++- src/bi_sa.m4 | 218 +++++++----------------------------- src/engine.c | 1 + 7 files changed, 82 insertions(+), 494 deletions(-) delete mode 100755 doc/gendocs.sh diff --git a/ChangeLog b/ChangeLog index 39c25464..24ee13f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2007-11-11 Sergey Poznyakoff + + * 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 * 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 +Brent Spencer Jan Rafaj +Jeff Ballard +Nacho González López Peter Markeloff Sergey Afonin -Zeus Panchenko \ No newline at end of file +Zeus Panchenko + + +;;;; 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 . -# -# 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 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); } -- cgit v1.2.1