git-svn: trunk@4797
Török Edvin authored on 2009/02/17 03:27:03... | ... |
@@ -1,3 +1,7 @@ |
1 |
+Mon Feb 16 16:15:21 EET 2009 (edwin) |
|
2 |
+------------------------------------ |
|
3 |
+ * unit_tests/check_clamd.c: test for FILDES |
|
4 |
+ |
|
1 | 5 |
Mon Feb 16 14:08:50 EET 2009 (edwin) |
2 | 6 |
------------------------------------ |
3 | 7 |
* clamd/server-th.c, clamd/session.c, unit_tests/check_clamd.c: add |
... | ... |
@@ -21,6 +21,7 @@ |
21 | 21 |
#include "checks_common.h" |
22 | 22 |
#include "libclamav/version.h" |
23 | 23 |
#include "libclamav/cltypes.h" |
24 |
+#include "shared/fdpassing.h" |
|
24 | 25 |
|
25 | 26 |
#ifdef CHECK_HAVE_LOOPS |
26 | 27 |
|
... | ... |
@@ -147,8 +148,8 @@ static void *recvfull(int sd, size_t *len) |
147 | 147 |
fail_unless_fmt(rc != -1, "recv() failed: %s\n", strerror(errno)); |
148 | 148 |
off += rc; |
149 | 149 |
} while (rc); |
150 |
- buf[*len] = '\0'; |
|
151 | 150 |
*len = off; |
151 |
+ buf[*len] = '\0'; |
|
152 | 152 |
return buf; |
153 | 153 |
} |
154 | 154 |
|
... | ... |
@@ -166,8 +167,8 @@ static void test_command(const char *cmd, size_t len, const char *extra, const c |
166 | 166 |
|
167 | 167 |
recvdata = recvfull(sockd, &len); |
168 | 168 |
|
169 |
- fail_unless_fmt(len == expect_len, "Reply has wrong size: %lu, expected %lu, reply: %s\n", |
|
170 |
- len, expect_len, recvdata); |
|
169 |
+ fail_unless_fmt(len == expect_len, "Reply has wrong size: %lu, expected %lu, reply: %s, expected: %s\n", |
|
170 |
+ len, expect_len, recvdata, expect); |
|
171 | 171 |
|
172 | 172 |
rc = memcmp(recvdata, expect, expect_len); |
173 | 173 |
fail_unless_fmt(!rc, "Wrong reply for command %s: |%s|, expected: |%s|\n", cmd, recvdata, expect); |
... | ... |
@@ -225,7 +226,7 @@ END_TEST |
225 | 225 |
#define EXPECT_INSTREAM "stream: ClamAV-Test-File.UNOFFICIAL FOUND\n" |
226 | 226 |
|
227 | 227 |
#define STATS_REPLY "POOLS: 1\n\nSTATE: VALID PRIMARY\n" |
228 |
-START_TEST (tc_stats) |
|
228 |
+START_TEST (test_stats) |
|
229 | 229 |
{ |
230 | 230 |
char *recvdata; |
231 | 231 |
size_t len = strlen("nSTATS\n"); |
... | ... |
@@ -250,7 +251,7 @@ START_TEST (tc_stats) |
250 | 250 |
} |
251 | 251 |
END_TEST |
252 | 252 |
|
253 |
-START_TEST (tc_instream) |
|
253 |
+START_TEST (test_instream) |
|
254 | 254 |
{ |
255 | 255 |
int fd, nread, rc; |
256 | 256 |
struct stat stbuf; |
... | ... |
@@ -294,6 +295,94 @@ START_TEST (tc_instream) |
294 | 294 |
} |
295 | 295 |
END_TEST |
296 | 296 |
|
297 |
+static void tst_fildes(const char *cmd, size_t len, int fd, |
|
298 |
+ const char *expect, size_t expect_len, int closefd) |
|
299 |
+{ |
|
300 |
+ struct msghdr msg; |
|
301 |
+ struct cmsghdr *cmsg; |
|
302 |
+ unsigned char fdbuf[CMSG_SPACE(sizeof(int))]; |
|
303 |
+ char dummy[] = ""; |
|
304 |
+ off_t pos; |
|
305 |
+ struct iovec iov[1]; |
|
306 |
+ char *recvdata, *p; |
|
307 |
+ int rc; |
|
308 |
+ |
|
309 |
+ conn_setup(); |
|
310 |
+ |
|
311 |
+ iov[0].iov_base = dummy; |
|
312 |
+ iov[0].iov_len = 1; |
|
313 |
+ |
|
314 |
+ memset(&msg, 0, sizeof(msg)); |
|
315 |
+ msg.msg_control = fdbuf; |
|
316 |
+ msg.msg_iov = iov; |
|
317 |
+ msg.msg_iovlen = 1; |
|
318 |
+ msg.msg_controllen = CMSG_LEN(sizeof(int)); |
|
319 |
+ |
|
320 |
+ cmsg = CMSG_FIRSTHDR(&msg); |
|
321 |
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int)); |
|
322 |
+ cmsg->cmsg_level = SOL_SOCKET; |
|
323 |
+ cmsg->cmsg_type = SCM_RIGHTS; |
|
324 |
+ *(int *)CMSG_DATA(cmsg) = fd; |
|
325 |
+ |
|
326 |
+ fail_unless_fmt(write(sockd, cmd, len) == len, "Failed to write: %s\n", strerror(errno)); |
|
327 |
+ |
|
328 |
+ rc = sendmsg(sockd, &msg, 0); |
|
329 |
+ fail_unless_fmt(rc != -1, "Failed to sendmsg: %s\n", strerror(errno)); |
|
330 |
+ |
|
331 |
+ if (closefd) |
|
332 |
+ close(fd); |
|
333 |
+ |
|
334 |
+ recvdata = recvfull(sockd, &len); |
|
335 |
+ p = strchr(recvdata, ':'); |
|
336 |
+ |
|
337 |
+ fail_unless_fmt(!!p, "Reply doesn't contain ':' : %s\n", recvdata); |
|
338 |
+ *p++ = '\0'; |
|
339 |
+ |
|
340 |
+ fail_unless_fmt(sscanf(recvdata, "fd[%u]", &rc) == 1, "Reply doesn't contain fd: %s\n", recvdata); |
|
341 |
+ |
|
342 |
+ len -= p - recvdata; |
|
343 |
+ fail_unless_fmt(len == expect_len, "Reply has wrong size: %lu, expected %lu, reply: %s, expected: %s\n", |
|
344 |
+ len, expect_len, p, expect); |
|
345 |
+ |
|
346 |
+ rc = memcmp(p, expect, expect_len); |
|
347 |
+ fail_unless_fmt(!rc, "Wrong reply for command %s: |%s|, expected: |%s|\n", cmd, p, expect); |
|
348 |
+ free(recvdata); |
|
349 |
+ conn_teardown(); |
|
350 |
+} |
|
351 |
+ |
|
352 |
+#define FOUNDFDREPLY " ClamAV-Test-File.UNOFFICIAL FOUND" |
|
353 |
+#define CLEANFDREPLY " OK" |
|
354 |
+ |
|
355 |
+START_TEST (test_fildes) |
|
356 |
+{ |
|
357 |
+ char nreply[BUFSIZ]; |
|
358 |
+ int fd = open(SCANFILE, O_RDONLY); |
|
359 |
+ |
|
360 |
+ snprintf(nreply, sizeof(nreply), "%s\n", FOUNDFDREPLY); |
|
361 |
+ |
|
362 |
+ fail_unless_fmt(fd != -1, "Failed to open: %s\n", strerror(errno)); |
|
363 |
+ |
|
364 |
+ tst_fildes("FILDES\n", strlen("FILDES\n"), fd, nreply, strlen(nreply), 0); |
|
365 |
+ tst_fildes("nFILDES\n", strlen("nFILDES\n"), fd, nreply, strlen(nreply), 0); |
|
366 |
+ tst_fildes("zFILDES", sizeof("zFILDES"), fd, FOUNDFDREPLY, sizeof(FOUNDFDREPLY), 0); |
|
367 |
+ |
|
368 |
+ close(fd); |
|
369 |
+ |
|
370 |
+ snprintf(nreply, sizeof(nreply), "%s\n", CLEANFDREPLY); |
|
371 |
+ |
|
372 |
+ fd = open(CLEANFILE, O_RDONLY); |
|
373 |
+ fail_unless_fmt(fd != -1, "Failed to open: %s\n", strerror(errno)); |
|
374 |
+ |
|
375 |
+ tst_fildes("FILDES\n", strlen("FILDES\n"), fd, nreply, strlen(nreply), 0); |
|
376 |
+ tst_fildes("nFILDES\n", strlen("nFILDES\n"), fd, nreply, strlen(nreply), 0); |
|
377 |
+ tst_fildes("zFILDES", sizeof("zFILDES"), fd, CLEANFDREPLY, sizeof(CLEANFDREPLY), 0); |
|
378 |
+ |
|
379 |
+ snprintf(nreply, sizeof(nreply), "%s\n", FOUNDFDREPLY); |
|
380 |
+ fd = open(SCANFILE, O_RDONLY); |
|
381 |
+ fail_unless_fmt(fd != -1, "Failed to open: %s\n", strerror(errno)); |
|
382 |
+ tst_fildes("FILDES\n", strlen("FILDES\n"), fd, nreply, strlen(nreply), 1); |
|
383 |
+} |
|
384 |
+END_TEST |
|
297 | 385 |
|
298 | 386 |
static Suite *test_clamd_suite(void) |
299 | 387 |
{ |
... | ... |
@@ -303,8 +392,9 @@ static Suite *test_clamd_suite(void) |
303 | 303 |
tcase_add_unchecked_fixture(tc_commands, commands_setup, commands_teardown); |
304 | 304 |
tcase_add_loop_test(tc_commands, test_basic_commands, 0, sizeof(basic_tests)/sizeof(basic_tests[0])); |
305 | 305 |
tcase_add_loop_test(tc_commands, test_compat_commands, 0, sizeof(basic_tests)/sizeof(basic_tests[0])); |
306 |
- tcase_add_test(tc_commands, tc_instream); |
|
307 |
- tcase_add_test(tc_commands, tc_stats); |
|
306 |
+ tcase_add_test(tc_commands, test_fildes); |
|
307 |
+ tcase_add_test(tc_commands, test_stats); |
|
308 |
+ tcase_add_test(tc_commands, test_instream); |
|
308 | 309 |
return s; |
309 | 310 |
} |
310 | 311 |
|