510
char *get_ip(const char *ip)
512
char *dupip, *p1, *p2;
516
* Expected format of ip:
522
* Use of IPv6:Port is incorrect. An IPv6 address must be enclosed in brackets.
529
if (dupip[0] == '[') {
531
p1 = strchr(dupip, ']');
539
p1 = strdup(dupip+1);
546
while ((p1 = strchr(p1, ':'))) {
555
p1 = strchr(dupip, ':');
563
char *get_port(const char *ip)
566
unsigned int offset=0;
575
p = (char *)ip + strlen(dupip) + offset;
585
char *make_ip(const char *host, const char *port)
591
len = strlen(host) + strlen(port);
593
ipv6 = (strchr(host, ':') != NULL);
595
len += (ipv6 ? 4 : 3);
601
snprintf(ip, len, "%s%s%s:%s", ipv6 ? "[" : "", host, ipv6 ? "]" : "", port);
511
606
static int make_connection_real(const char *soname, conn_t *conn)
519
if(cli_is_abspath(soname) || (access(soname, F_OK) == 0)) {
520
struct sockaddr_un addr;
521
s = socket(AF_UNIX, SOCK_STREAM, 0);
526
memset(&addr, 0, sizeof(addr));
527
addr.sun_family = AF_UNIX;
528
strncpy(addr.sun_path, soname, sizeof(addr.sun_path));
529
addr.sun_path[sizeof(addr.sun_path) - 1] = 0x0;
530
print_con_info(conn, "Connecting to: %s\n", soname);
531
if (connect(s, (struct sockaddr *)&addr, sizeof(addr))) {
611
char *name, *pt = strdup(soname);
612
const char *host = pt;
613
struct addrinfo hints, *res=NULL, *p;
619
if(cli_is_abspath(soname) || (access(soname, F_OK) == 0)) {
620
struct sockaddr_un addr;
622
s = socket(AF_UNIX, SOCK_STREAM, 0);
628
memset(&addr, 0, sizeof(addr));
629
addr.sun_family = AF_UNIX;
630
strncpy(addr.sun_path, soname, sizeof(addr.sun_path));
631
addr.sun_path[sizeof(addr.sun_path) - 1] = 0x0;
633
print_con_info(conn, "Connecting to: %s\n", soname);
634
if (connect(s, (struct sockaddr *)&addr, sizeof(addr))) {
538
struct sockaddr_in server;
541
char *name, *pt = strdup(soname);
542
const char *host = pt;
543
memset(&server, 0x00, sizeof(struct sockaddr_in));
545
name = strchr(pt, ':');
552
print_con_info(conn, "Looking up: %s\n", host);
553
if((hp = gethostbyname(host)) == NULL) {
554
fprintf(stderr, "Cannot find host");
558
s = socket(AF_INET, SOCK_STREAM, 0);
563
server.sin_family = AF_INET;
564
server.sin_port = htons(port);
565
server.sin_addr.s_addr = ((struct in_addr*)(hp->h_addr))->s_addr;
566
print_con_info(conn, "Connecting to: %s:%u\n", inet_ntoa(server.sin_addr), port);
567
if (connect(s, (struct sockaddr *)&server, (socklen_t)sizeof(server))) {
644
memset(&hints, 0x00, sizeof(struct addrinfo));
645
hints.ai_family = AF_UNSPEC;
646
hints.ai_socktype = SOCK_STREAM;
647
hints.ai_flags = AI_PASSIVE;
649
host = get_ip(soname);
653
port = get_port(soname);
657
print_con_info(conn, "Looking up: %s:%s\n", host, port ? port : "3310");
658
if ((err = getaddrinfo(host, (port != NULL) ? port : "3310", &hints, &res))) {
659
print_con_info(conn, "Could not look up %s:%s, getaddrinfo returned: %s\n", host, port ? port : "3310", gai_strerror(err));
663
for (p = res; p != NULL; p = p->ai_next) {
664
if ((s = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) {
669
print_con_info(conn, "Connecting to: %s\n", soname);
670
if (connect(s, p->ai_addr, p->ai_addrlen)) {
573
if (conn->remote != soname) {
574
/* when we reconnect, they are the same */
575
if (conn->remote) free(conn->remote);
576
conn->remote = strdup(soname);
579
gettimeofday(&conn->tv_conn, NULL);
582
setsockopt(conn->sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
688
if (conn->remote != soname) {
689
/* when we reconnect, they are the same */
693
conn->remote = make_ip(host, (port != NULL) ? port : "3310");
698
gettimeofday(&conn->tv_conn, NULL);
701
setsockopt(conn->sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
586
705
static int make_connection(const char *soname, conn_t *conn)
1118
1240
/* -------------------------- Initialization ---------------- */
1119
1241
static void setup_connections(int argc, char *argv[])
1121
struct optstruct *opts;
1122
struct optstruct *clamd_opts;
1126
opts = optparse(NULL, argc, argv, 1, OPT_CLAMDTOP, 0, NULL);
1128
fprintf(stderr, "ERROR: Can't parse command line options\n");
1129
EXIT_PROGRAM(FAIL_CMDLINE);
1132
if(optget(opts, "help")->enabled) {
1139
if(optget(opts, "version")->enabled) {
1140
printf("Clam AntiVirus Monitoring Tool %s\n", get_version());
1146
if(optget(opts, "defaultcolors")->enabled)
1148
memset(&global, 0, sizeof(global));
1149
if (!opts->filename || !opts->filename[0]) {
1150
const struct optstruct *opt;
1151
const char *clamd_conf = optget(opts, "config-file")->strarg;
1153
if ((clamd_opts = optparse(clamd_conf, 0, NULL, 1, OPT_CLAMD, 0, NULL)) == NULL) {
1154
fprintf(stderr, "Can't parse clamd configuration file %s\n", clamd_conf);
1155
EXIT_PROGRAM(FAIL_CMDLINE);
1158
if((opt = optget(clamd_opts, "LocalSocket"))->enabled) {
1159
conn = strdup(opt->strarg);
1160
} else if ((opt = optget(clamd_opts, "TCPSocket"))->enabled) {
1162
const struct optstruct *opt_addr;
1163
const char *host = "localhost";
1164
if ((opt_addr = optget(clamd_opts, "TCPAddr"))->enabled) {
1165
host = opt_addr->strarg;
1167
snprintf(buf, sizeof(buf), "%s:%llu", host, opt->numarg);
1170
fprintf(stderr, "Can't find how to connect to clamd\n");
1171
EXIT_PROGRAM(FAIL_INITIAL_CONN);
1173
optfree(clamd_opts);
1174
global.num_clamd = 1;
1177
while (opts->filename[i]) { i++; }
1178
global.num_clamd = i;
1243
struct optstruct *opts;
1244
struct optstruct *clamd_opts;
1248
opts = optparse(NULL, argc, argv, 1, OPT_CLAMDTOP, 0, NULL);
1250
fprintf(stderr, "ERROR: Can't parse command line options\n");
1251
EXIT_PROGRAM(FAIL_CMDLINE);
1254
if(optget(opts, "help")->enabled) {
1261
if(optget(opts, "version")->enabled) {
1262
printf("Clam AntiVirus Monitoring Tool %s\n", get_version());
1268
if(optget(opts, "defaultcolors")->enabled)
1271
memset(&global, 0, sizeof(global));
1272
if (!opts->filename || !opts->filename[0]) {
1273
const struct optstruct *opt;
1274
const char *clamd_conf = optget(opts, "config-file")->strarg;
1276
if ((clamd_opts = optparse(clamd_conf, 0, NULL, 1, OPT_CLAMD, 0, NULL)) == NULL) {
1277
fprintf(stderr, "Can't parse clamd configuration file %s\n", clamd_conf);
1278
EXIT_PROGRAM(FAIL_CMDLINE);
1281
if((opt = optget(clamd_opts, "LocalSocket"))->enabled) {
1282
conn = strdup(opt->strarg);
1284
fprintf(stderr, "Can't strdup LocalSocket value\n");
1285
EXIT_PROGRAM(FAIL_INITIAL_CONN);
1287
} else if ((opt = optget(clamd_opts, "TCPSocket"))->enabled) {
1289
const struct optstruct *opt_addr;
1290
const char *host = "localhost";
1291
if ((opt_addr = optget(clamd_opts, "TCPAddr"))->enabled) {
1292
host = opt_addr->strarg;
1294
snprintf(buf, sizeof(buf), "%lld", opt->numarg);
1295
conn = make_ip(host, buf);
1297
fprintf(stderr, "Can't find how to connect to clamd\n");
1298
EXIT_PROGRAM(FAIL_INITIAL_CONN);
1301
optfree(clamd_opts);
1302
global.num_clamd = 1;
1305
while (opts->filename[i]) { i++; }
1306
global.num_clamd = i;
1183
if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) {
1184
fprintf(stderr, "Error at WSAStartup(): %d\n", WSAGetLastError());
1185
EXIT_PROGRAM(FAIL_INITIAL_CONN);
1311
if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) {
1312
fprintf(stderr, "Error at WSAStartup(): %d\n", WSAGetLastError());
1313
EXIT_PROGRAM(FAIL_INITIAL_CONN);
1190
puts(" _____/ /___ _____ ___ ____/ / /_____ ____");
1191
puts(" / ___/ / __ `/ __ `__ \\/ __ / __/ __ \\/ __ \\");
1192
puts("/ /__/ / /_/ / / / / / / /_/ / /_/ /_/ / /_/ /");
1193
puts("\\___/_/\\__,_/_/ /_/ /_/\\__,_/\\__/\\____/ .___/");
1195
global.all_stats = calloc(global.num_clamd, sizeof(*global.all_stats));
1196
OOM_CHECK(global.all_stats);
1197
global.conn = calloc(global.num_clamd, sizeof(*global.conn));
1198
OOM_CHECK(global.conn);
1199
for (i=0;i < global.num_clamd;i++) {
1200
const char *soname = conn ? conn : opts->filename[i];
1201
global.conn[i].line = i+1;
1202
if (make_connection(soname, &global.conn[i]) < 0) {
1203
EXIT_PROGRAM(FAIL_INITIAL_CONN);
1318
puts(" _____/ /___ _____ ___ ____/ / /_____ ____");
1319
puts(" / ___/ / __ `/ __ `__ \\/ __ / __/ __ \\/ __ \\");
1320
puts("/ /__/ / /_/ / / / / / / /_/ / /_/ /_/ / /_/ /");
1321
puts("\\___/_/\\__,_/_/ /_/ /_/\\__,_/\\__/\\____/ .___/");
1324
global.all_stats = calloc(global.num_clamd, sizeof(*global.all_stats));
1325
OOM_CHECK(global.all_stats);
1326
global.conn = calloc(global.num_clamd, sizeof(*global.conn));
1327
OOM_CHECK(global.conn);
1329
for (i=0;i < global.num_clamd;i++) {
1330
const char *soname = conn ? conn : opts->filename[i];
1331
global.conn[i].line = i+1;
1332
if (make_connection(soname, &global.conn[i]) < 0) {
1333
EXIT_PROGRAM(FAIL_INITIAL_CONN);
1209
signal(SIGPIPE, SIG_IGN);
1210
signal(SIGINT, sigint);
1340
signal(SIGPIPE, SIG_IGN);
1341
signal(SIGINT, sigint);