Browse code

new clamd command: nVERSIONCOMMANDS (bb #1437).

git-svn: trunk@4922

Török Edvin authored on 2009/03/11 02:51:06
Showing 4 changed files
... ...
@@ -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},