diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | src/bi_sa.m4 | 218 | ||||
-rw-r--r-- | src/dnsbase.c | 4 |
3 files changed, 182 insertions, 43 deletions
@@ -1,5 +1,8 @@ | |||
1 | 2007-10-21 Sergey Poznyakoff <gray@gnu.org.ua> | 1 | 2007-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); | |||
27 | MF_VAR(sa_keywords, STRING); | 27 | MF_VAR(sa_keywords, STRING); |
28 | MF_VAR(clamav_virus_name, STRING); | 28 | MF_VAR(clamav_virus_name, STRING); |
29 | 29 | ||
30 | |||
31 | struct mf_stream { | ||
32 | eval_environ_t env; | ||
33 | mu_stream_t str; | ||
34 | time_t start; | ||
35 | time_t timeout; | ||
36 | }; | ||
37 | |||
38 | typedef 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 | |||
49 | extern int smtp_stream_wait(mu_stream_t stream, int flags, time_t *timeout); | ||
50 | static void spamd_destroy(mf_stream_t *pstream); | ||
51 | |||
52 | mf_stream_t | ||
53 | mf_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 | |||
64 | int | ||
65 | mf_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 | |||
92 | int | ||
93 | mf_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 | |||
120 | int | ||
121 | mf_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 | |||
30 | static int | 149 | static int |
31 | spamd_connect_tcp(eval_environ_t env, mu_stream_t *stream, | 150 | spamd_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 | ||
45 | static int | 166 | static int |
46 | spamd_connect_socket(eval_environ_t env, mu_stream_t *stream, char *path) | 167 | spamd_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 | ||
85 | static void | 211 | static void |
86 | spamd_shutdown(mu_stream_t stream, int isfile, int flag) | 212 | spamd_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 | ||
100 | static void |