diff options
Diffstat (limited to 'src/bi_sa.m4')
-rw-r--r-- | src/bi_sa.m4 | 218 |
1 files changed, 41 insertions, 177 deletions
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); |