aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--src/bi_sa.m4218
-rw-r--r--src/dnsbase.c4
3 files changed, 182 insertions, 43 deletions
diff --git a/ChangeLog b/ChangeLog
index c50cbd64..053fa59c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
12007-10-21 Sergey Poznyakoff <gray@gnu.org.ua> 12007-10-21 Sergey Poznyakoff <gray@gnu.org.ua>
2 2
3 * src/dnsbase.c (cname_loop_body): Return TXT only if explicitly
4 required. Bug reported by Jan Rafaj.
5
3 * src/engine.c: Fix timeout calculations 6 * src/engine.c: Fix timeout calculations
4 (struct timeout_ctl): New data type 7 (struct timeout_ctl): New data type
5 (UPDATE_TTW,smtp_stream_wait,smtp_wait): Operate on struct timeout_ctl. 8 (UPDATE_TTW,smtp_stream_wait,smtp_wait): Operate on struct timeout_ctl.
diff --git a/src/bi_sa.m4 b/src/bi_sa.m4
index 0ed7472b..8472bbe9 100644
--- a/src/bi_sa.m4
+++ b/src/bi_sa.m4
@@ -27,27 +27,150 @@ MF_VAR(sa_threshold, NUMBER);
27MF_VAR(sa_keywords, STRING); 27MF_VAR(sa_keywords, STRING);
28MF_VAR(clamav_virus_name, STRING); 28MF_VAR(clamav_virus_name, STRING);
29 29
30
31struct mf_stream {
32 eval_environ_t env;
33 mu_stream_t str;
34 time_t start;
35 time_t timeout;
36};
37
38typedef struct mf_stream *mf_stream_t;
39
40/* FIXME: duplicated in engine.c */
41#define UPDATE_TTW(t,start) do { \
42 time_t delta = time(NULL) - start; \
43 if (t > delta) \
44 t -= delta; \
45 else \
46 t = 0; \
47} while (0)
48
49extern int smtp_stream_wait(mu_stream_t stream, int flags, time_t *timeout);
50static void spamd_destroy(mf_stream_t *pstream);
51
52mf_stream_t
53mf_stream_new (eval_environ_t env, mu_stream_t stream, time_t start,
54 time_t timeout)
55{
56 mf_stream_t pmfs = xmalloc (sizeof pmfs[0]);
57 pmfs->env = env;
58 pmfs->str = stream;
59 pmfs->start = start;
60 pmfs->timeout = timeout;
61 return pmfs;
62}
63
64int
65mf_stream_sequential_read(mf_stream_t stream, char *buf, size_t size)
66{
67 int rc;
68 eval_environ_t env = stream->env;
69
70 if (stream->timeout == 0) {
71 spamd_destroy(&stream);
72 MF_THROW(mf_temp_failure,
73 "sa_sequential_read: %s",
74 mu_strerror(ETIMEDOUT));
75 }
76
77 rc = smtp_stream_wait(stream->str, MU_STREAM_READY_RD,
78 &stream->timeout);
79 if (rc == 0) {
80 UPDATE_TTW(stream->timeout, stream->start);
81 rc = mu_stream_sequential_read(stream->str, buf, size, NULL);
82 } else {
83 spamd_destroy(&stream);
84 MF_THROW(mf_temp_failure,
85 "sa_sequential_read: %s",
86 mu_strerror(ETIMEDOUT));
87 }
88
89 return rc;
90}
91
92int
93mf_stream_sequential_readline(mf_stream_t stream, char *buf, size_t size,
94 size_t *nbytes)
95{
96 int rc;
97 eval_environ_t env = stream->env;
98
99 if (stream->timeout == 0) {
100 spamd_destroy(&stream);
101 MF_THROW(mf_temp_failure,
102 "sa_sequential_readline: %s",
103 mu_strerror(ETIMEDOUT));
104 }
105 rc = smtp_stream_wait(stream->str, MU_STREAM_READY_RD,
106 &stream->timeout);
107 if (rc == 0) {
108 UPDATE_TTW(stream->timeout, stream->start);
109 rc = mu_stream_sequential_readline(stream->str, buf, size,
110 nbytes);
111 } else {
112 spamd_destroy(&stream);
113 MF_THROW(mf_temp_failure,
114 "sa_sequential_readline: %s",
115 mu_strerror(ETIMEDOUT));
116 }
117 return rc;
118}
119
120int
121mf_stream_sequential_write(mf_stream_t stream, char *buf, size_t size)
122{
123 int rc;
124 eval_environ_t env = stream->env;
125
126 if (stream->timeout == 0) {
127 spamd_destroy(&stream);
128 MF_THROW(mf_temp_failure,
129 "sa_sequential_write: %s",
130 mu_strerror(ETIMEDOUT));
131 }
132
133 rc = smtp_stream_wait(stream->str, MU_STREAM_READY_WR,
134 &stream->timeout);
135 if (rc == 0) {
136 UPDATE_TTW(stream->timeout, stream->start);
137 rc = mu_stream_sequential_write(stream->str, buf, size);
138 } else {
139 spamd_destroy(&stream);
140 MF_THROW(mf_temp_failure,
141 "sa_sequential_write: %s",
142 mu_strerror(ETIMEDOUT));
143 }
144 return rc;
145}
146
147
148
30static int 149static int
31spamd_connect_tcp(eval_environ_t env, mu_stream_t *stream, 150spamd_connect_tcp(eval_environ_t env, mf_stream_t *pmfs,
32 char *host, int port) 151 char *host, int port, time_t timeout)
33{ 152{
34 int rc = mu_tcp_stream_create(stream, host, port, 0); 153 mu_stream_t stream;
154 int rc = mu_tcp_stream_create(&stream, host, port, 0);
35 MF_ASSERT(rc == 0, mf_failure, 155 MF_ASSERT(rc == 0, mf_failure,
36 "mu_tcp_stream_create: %s", 156 "mu_tcp_stream_create: %s",
37 mu_strerror(rc)); 157 mu_strerror(rc));
38 rc = mu_stream_open(*stream); 158 rc = mu_stream_open(stream);
39 MF_ASSERT(rc == 0, mf_failure, 159 MF_ASSERT(rc == 0, mf_failure,
40 "mu_stream_open: %s", 160 "mu_stream_open: %s",
41 mu_strerror(rc)); 161 mu_strerror(rc));
162 *pmfs = mf_stream_new(env, stream, time(NULL), timeout);
42 return rc; 163 return rc;
43} 164}
44 165
45static int 166static int
46spamd_connect_socket(eval_environ_t env, mu_stream_t *stream, char *path) 167spamd_connect_socket(eval_environ_t env, mf_stream_t *pmfs, char *path,
168 time_t timeout)
47{ 169{
48 int fd, rc; 170 int fd, rc;
49 FILE *fp; 171 FILE *fp;
50 struct sockaddr_un addr; 172 struct sockaddr_un addr;
173 mu_stream_t stream;
51 174
52 fd = socket(PF_UNIX, SOCK_STREAM, 0); 175 fd = socket(PF_UNIX, SOCK_STREAM, 0);
53 MF_ASSERT(fd >= 0, mf_failure, 176 MF_ASSERT(fd >= 0, mf_failure,
@@ -63,7 +186,7 @@ spamd_connect_socket(eval_environ_t env, mu_stream_t *stream, char *path)
63 } 186 }
64 187
65 fp = fdopen(fd, "w+"); 188 fp = fdopen(fd, "w+");
66 rc = mu_stdio_stream_create(stream, fp, MU_STREAM_RDWR); 189 rc = mu_stdio_stream_create(&stream, fp, MU_STREAM_RDWR);
67 if (rc) { 190 if (rc) {
68 fclose(fp); 191 fclose(fp);
69 MF_THROW(mf_failure, 192 MF_THROW(mf_failure,
@@ -71,25 +194,28 @@ spamd_connect_socket(eval_environ_t env, mu_stream_t *stream, char *path)
71 mu_strerror(rc)); 194 mu_strerror(rc));
72 } 195 }
73 196
74 rc = mu_stream_open(*stream); 197 rc = mu_stream_open(stream);
75 if (rc) { 198 if (rc) {
76 mu_stream_destroy (stream, mu_stream_get_owner (*stream)); 199 mu_stream_destroy(&stream, mu_stream_get_owner(stream));
77 fclose(fp); 200 fclose(fp);
78 MF_THROW(mf_failure, 201 MF_THROW(mf_failure,
79 "mu_stream_open: %s", 202 "mu_stream_open: %s",
80 mu_strerror(rc)); 203 mu_strerror(rc));
81 } 204 }
205
206 *pmfs = mf_stream_new(env, stream, time(NULL), timeout);
207
82 return rc; 208 return rc;
83} 209}
84 210
85static void 211static void
86spamd_shutdown(mu_stream_t stream, int isfile, int flag) 212spamd_shutdown(mf_stream_t stream, int isfile, int flag)
87{ 213{
88 int fd; 214 int fd;
89
90 mu_transport_t trans; 215 mu_transport_t trans;
91 mu_stream_flush(stream); 216
92 mu_stream_get_transport(stream, &trans); 217 mu_stream_flush(stream->str);
218 mu_stream_get_transport(stream->str, &trans);
93 if (isfile) 219 if (isfile)
94 fd = fileno((FILE*)trans); 220 fd = fileno((FILE*)trans);
95 else 221 else
@@ -98,14 +224,17 @@ spamd_shutdown(mu_stream_t stream, int isfile, int flag)
98} 224}
99 225
100static void