git-svn: trunk@4922
Török Edvin authored on 2009/03/11 02:51:06... | ... |
@@ -1,3 +1,8 @@ |
1 |
+Tue Mar 10 19:50:59 EET 2009 (edwin) |
|
2 |
+------------------------------------ |
|
3 |
+ * clamd/session.c, clamd/session.h, unit_tests/check_clamd.c: new |
|
4 |
+ clamd command: nVERSIONCOMMANDS (bb #1437). |
|
5 |
+ |
|
1 | 6 |
Tue Mar 10 16:14:30 EET 2009 (edwin) |
2 | 7 |
------------------------------------ |
3 | 8 |
* libclamav/mpool.c, shared/output.c: fix uninitialized value |
... | ... |
@@ -72,27 +72,36 @@ |
72 | 72 |
#include "session.h" |
73 | 73 |
#include "thrmgr.h" |
74 | 74 |
|
75 |
+#ifndef HAVE_FDPASSING |
|
76 |
+#define FEATURE_FDPASSING 0 |
|
77 |
+#else |
|
78 |
+#define FEATURE_FDPASSING 1 |
|
79 |
+#endif |
|
80 |
+ |
|
75 | 81 |
static struct { |
76 | 82 |
const char *cmd; |
77 | 83 |
const size_t len; |
78 | 84 |
enum commands cmdtype; |
79 | 85 |
int need_arg; |
80 | 86 |
int support_old; |
87 |
+ int enabled; |
|
81 | 88 |
} commands[] = { |
82 |
- {CMD1, sizeof(CMD1)-1, COMMAND_SCAN, 1, 1}, |
|
83 |
- {CMD3, sizeof(CMD3)-1, COMMAND_SHUTDOWN, 0, 1}, |
|
84 |
- {CMD4, sizeof(CMD4)-1, COMMAND_RELOAD, 0, 1}, |
|
85 |
- {CMD5, sizeof(CMD5)-1, COMMAND_PING, 0, 1}, |
|
86 |
- {CMD6, sizeof(CMD6)-1, COMMAND_CONTSCAN, 1, 1}, |
|
87 |
- {CMD7, sizeof(CMD7)-1, COMMAND_VERSION, 0, 1}, |
|
88 |
- {CMD8, sizeof(CMD8)-1, COMMAND_STREAM, 0, 1}, |
|
89 |
- {CMD10, sizeof(CMD10)-1, COMMAND_END, 0, 0}, |
|
90 |
- {CMD11, sizeof(CMD11)-1, COMMAND_SHUTDOWN, 0, 1}, |
|
91 |
- {CMD13, sizeof(CMD13)-1, COMMAND_MULTISCAN, 1, 1}, |
|
92 |
- {CMD14, sizeof(CMD14)-1, COMMAND_FILDES, 0, 1}, |
|
93 |
- {CMD15, sizeof(CMD15)-1, COMMAND_STATS, 0, 0}, |
|
94 |
- {CMD16, sizeof(CMD16)-1, COMMAND_IDSESSION, 0, 0}, |
|
95 |
- {CMD17, sizeof(CMD17)-1, COMMAND_INSTREAM, 0, 0} |
|
89 |
+ {CMD1, sizeof(CMD1)-1, COMMAND_SCAN, 1, 1, 0}, |
|
90 |
+ {CMD3, sizeof(CMD3)-1, COMMAND_SHUTDOWN, 0, 1, 0}, |
|
91 |
+ {CMD4, sizeof(CMD4)-1, COMMAND_RELOAD, 0, 1, 0}, |
|
92 |
+ {CMD5, sizeof(CMD5)-1, COMMAND_PING, 0, 1, 0}, |
|
93 |
+ {CMD6, sizeof(CMD6)-1, COMMAND_CONTSCAN, 1, 1, 0}, |
|
94 |
+ /* must be before VERSION, because they share common prefix! */ |
|
95 |
+ {CMD18, sizeof(CMD18)-1, COMMAND_COMMANDS, 0, 0, 1}, |
|
96 |
+ {CMD7, sizeof(CMD7)-1, COMMAND_VERSION, 0, 1, 1}, |
|
97 |
+ {CMD8, sizeof(CMD8)-1, COMMAND_STREAM, 0, 1, 1}, |
|
98 |
+ {CMD10, sizeof(CMD10)-1, COMMAND_END, 0, 0, 1}, |
|
99 |
+ {CMD11, sizeof(CMD11)-1, COMMAND_SHUTDOWN, 0, 1, 1}, |
|
100 |
+ {CMD13, sizeof(CMD13)-1, COMMAND_MULTISCAN, 1, 1, 1}, |
|
101 |
+ {CMD14, sizeof(CMD14)-1, COMMAND_FILDES, 0, 1, FEATURE_FDPASSING}, |
|
102 |
+ {CMD15, sizeof(CMD15)-1, COMMAND_STATS, 0, 0, 1}, |
|
103 |
+ {CMD16, sizeof(CMD16)-1, COMMAND_IDSESSION, 0, 0, 1}, |
|
104 |
+ {CMD17, sizeof(CMD17)-1, COMMAND_INSTREAM, 0, 0, 1} |
|
96 | 105 |
}; |
97 | 106 |
|
98 | 107 |
|
... | ... |
@@ -403,6 +412,43 @@ static int dispatch_command(client_conn_t *conn, enum commands cmd, const char * |
403 | 403 |
return ret; |
404 | 404 |
} |
405 | 405 |
|
406 |
+static int print_ver(int desc, char term, const struct cl_engine *engine) |
|
407 |
+{ |
|
408 |
+ uint32_t ver; |
|
409 |
+ |
|
410 |
+ cl_engine_get(engine, CL_ENGINE_DB_VERSION, &ver); |
|
411 |
+ if(ver) { |
|
412 |
+ char timestr[32]; |
|
413 |
+ const char *tstr; |
|
414 |
+ time_t t; |
|
415 |
+ cl_engine_get(engine, CL_ENGINE_DB_TIME, &t); |
|
416 |
+ tstr = cli_ctime(&t, timestr, sizeof(timestr)); |
|
417 |
+ /* cut trailing \n */ |
|
418 |
+ timestr[strlen(tstr)-1] = '\0'; |
|
419 |
+ return mdprintf(desc, "ClamAV %s/%u/%s%c", get_version(), (unsigned int) ver, tstr, term); |
|
420 |
+ } |
|
421 |
+ return mdprintf(desc, "ClamAV %s%c", get_version(), term); |
|
422 |
+} |
|
423 |
+ |
|
424 |
+static void print_commands(int desc, char term, const struct cl_engine *engine) |
|
425 |
+{ |
|
426 |
+ unsigned i, n; |
|
427 |
+ const char *engine_ver = cl_retver(); |
|
428 |
+ const char *clamd_ver = get_version(); |
|
429 |
+ if (strcmp(engine_ver, clamd_ver)) { |
|
430 |
+ mdprintf(desc, "ENGINE VERSION MISMATCH: %s != %s. ERROR%c", |
|
431 |
+ engine_ver, clamd_ver, term); |
|
432 |
+ return; |
|
433 |
+ } |
|
434 |
+ print_ver(desc, '|', engine); |
|
435 |
+ mdprintf(desc, " COMMANDS:"); |
|
436 |
+ n = sizeof(commands)/sizeof(commands[0]); |
|
437 |
+ for (i=0;i<n;i++) { |
|
438 |
+ mdprintf(desc, " %s", commands[i].cmd); |
|
439 |
+ } |
|
440 |
+ mdprintf(desc, "%c", term); |
|
441 |
+} |
|
442 |
+ |
|
406 | 443 |
/* returns: |
407 | 444 |
* <0 for error |
408 | 445 |
* -1 out of memory |
... | ... |
@@ -429,7 +475,9 @@ int execute_or_dispatch_command(client_conn_t *conn, enum commands cmd, const ch |
429 | 429 |
case COMMAND_INSTREAM: |
430 | 430 |
case COMMAND_INSTREAMSCAN: |
431 | 431 |
case COMMAND_VERSION: |
432 |
+ case COMMAND_PING: |
|
432 | 433 |
case COMMAND_STATS: |
434 |
+ case COMMAND_COMMANDS: |
|
433 | 435 |
/* These commands are accepted inside IDSESSION */ |
434 | 436 |
break; |
435 | 437 |
default: |
... | ... |
@@ -456,26 +504,23 @@ int execute_or_dispatch_command(client_conn_t *conn, enum commands cmd, const ch |
456 | 456 |
* connection */ |
457 | 457 |
return 1; |
458 | 458 |
case COMMAND_PING: |
459 |
- mdprintf(desc, "PONG%c", term); |
|
460 |
- return 1; |
|
459 |
+ if (conn->group) |
|
460 |
+ mdprintf(desc, "%u: PONG%c", conn->id, term); |
|
461 |
+ else |
|
462 |
+ mdprintf(desc, "PONG%c", term); |
|
463 |
+ return conn->group ? 0 : 1; |
|
461 | 464 |
case COMMAND_VERSION: |
462 | 465 |
{ |
463 |
- uint32_t ver; |
|
464 |
- cl_engine_get(engine, CL_ENGINE_DB_VERSION, &ver); |
|
465 | 466 |
if (conn->group) |
466 | 467 |
mdprintf(desc, "%u: ", conn->id); |
467 |
- if(ver) { |
|
468 |
- char timestr[32]; |
|
469 |
- const char *tstr; |
|
470 |
- time_t t; |
|
471 |
- cl_engine_get(engine, CL_ENGINE_DB_TIME, &t); |
|
472 |
- tstr = cli_ctime(&t, timestr, sizeof(timestr)); |
|
473 |
- /* cut trailing \n */ |
|
474 |
- timestr[strlen(tstr)-1] = '\0'; |
|
475 |
- mdprintf(desc, "ClamAV %s/%u/%s%c", get_version(), (unsigned int) ver, tstr, term); |
|
476 |
- } else { |
|
477 |
- mdprintf(desc, "ClamAV %s%c", get_version(), conn->term); |
|
478 |
- } |
|
468 |
+ print_ver(desc, conn->term, engine); |
|
469 |
+ return conn->group ? 0 : 1; |
|
470 |
+ } |
|
471 |
+ case COMMAND_COMMANDS: |
|
472 |
+ { |
|
473 |
+ if (conn->group) |
|
474 |
+ mdprintf(desc, "%u: ", conn->id); |
|
475 |
+ print_commands(desc, conn->term, engine); |
|
479 | 476 |
return conn->group ? 0 : 1; |
480 | 477 |
} |
481 | 478 |
case COMMAND_INSTREAM: |
... | ... |
@@ -39,6 +39,7 @@ |
39 | 39 |
#define CMD15 "STATS" |
40 | 40 |
#define CMD16 "IDSESSION" |
41 | 41 |
#define CMD17 "INSTREAM" |
42 |
+#define CMD18 "VERSIONCOMMANDS" |
|
42 | 43 |
|
43 | 44 |
#include "libclamav/clamav.h" |
44 | 45 |
#include "shared/optparser.h" |
... | ... |
@@ -62,6 +63,7 @@ enum commands { |
62 | 62 |
/* new proto commands */ |
63 | 63 |
COMMAND_IDSESSION, |
64 | 64 |
COMMAND_INSTREAM, |
65 |
+ COMMAND_COMMANDS, |
|
65 | 66 |
/* internal commands */ |
66 | 67 |
COMMAND_MULTISCANFILE, |
67 | 68 |
COMMAND_INSTREAMSCAN |
... | ... |
@@ -156,6 +156,7 @@ static void commands_teardown(void) |
156 | 156 |
|
157 | 157 |
#define VERSION_REPLY "ClamAV "REPO_VERSION""VERSION_SUFFIX |
158 | 158 |
|
159 |
+#define VCMDS_REPLY VERSION_REPLY"| COMMANDS: SCAN QUIT RELOAD PING CONTSCAN VERSIONCOMMANDS VERSION STREAM END SHUTDOWN MULTISCAN FILDES STATS IDSESSION INSTREAM" |
|
159 | 160 |
static struct basic_test { |
160 | 161 |
const char *command; |
161 | 162 |
const char *extra; |
... | ... |
@@ -166,6 +167,7 @@ static struct basic_test { |
166 | 166 |
{"PING", NULL, "PONG", 1, 0}, |
167 | 167 |
{"RELOAD", NULL, "RELOADING", 1, 0}, |
168 | 168 |
{"VERSION", NULL, VERSION_REPLY, 1, 0}, |
169 |
+ {"VERSIONCOMMANDS", NULL, VCMDS_REPLY, 0, 0}, |
|
169 | 170 |
{"SCAN "SCANFILE, NULL, FOUNDREPLY, 1, 0}, |
170 | 171 |
{"SCAN "CLEANFILE, NULL, CLEANREPLY, 1, 0}, |
171 | 172 |
{"CONTSCAN "SCANFILE, NULL, FOUNDREPLY, 1, 0}, |