|
|
|
@ -50,7 +50,9 @@ |
|
|
|
|
|
|
|
|
|
|
|
#include "client.h" |
|
|
|
#include "client.h" |
|
|
|
|
|
|
|
|
|
|
|
#define SOCKET_INET AF_INET |
|
|
|
#ifndef INADDR_LOOPBACK |
|
|
|
|
|
|
|
#define INADDR_LOOPBACK 0x7f000001 |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
int notremoved = 0, notmoved = 0; |
|
|
|
int notremoved = 0, notmoved = 0; |
|
|
|
int printinfected = 0; |
|
|
|
int printinfected = 0; |
|
|
|
@ -196,10 +198,12 @@ static int dsresult(int sockd, int scantype, const char *filename) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int wsockd; |
|
|
|
int wsockd; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(filename) { |
|
|
|
if(!(fd = open(filename, O_RDONLY))) { |
|
|
|
if(!(fd = open(filename, O_RDONLY))) { |
|
|
|
logg("!Open failed on %s.\n", filename); |
|
|
|
logg("!Open failed on %s.\n", filename); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} else fd = 0; |
|
|
|
if(sendln(sockd, "zSTREAM", 8)) return -1; |
|
|
|
if(sendln(sockd, "zSTREAM", 8)) return -1; |
|
|
|
if(!(len = recvln(&rcv, &bol, &eol)) || len < 7 || memcmp(bol, "PORT ", 5) || !(len = atoi(bol + 5))) return -1; |
|
|
|
if(!(len = recvln(&rcv, &bol, &eol)) || len < 7 || memcmp(bol, "PORT ", 5) || !(len = atoi(bol + 5))) return -1; |
|
|
|
strmsock.sin_port = htons(len); |
|
|
|
strmsock.sin_port = htons(len); |
|
|
|
@ -246,9 +250,7 @@ static int dsresult(int sockd, int scantype, const char *filename) |
|
|
|
logg("!Open failed on %s.\n", filename); |
|
|
|
logg("!Open failed on %s.\n", filename); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} else fd = 0; |
|
|
|
fd = 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(sendln(sockd, "zFILDES", 8)) return -1; |
|
|
|
if(sendln(sockd, "zFILDES", 8)) return -1; |
|
|
|
|
|
|
|
|
|
|
|
iov[0].iov_base = dummy; |
|
|
|
iov[0].iov_base = dummy; |
|
|
|
@ -343,6 +345,8 @@ static int isremote(const struct optstruct *opts) { |
|
|
|
nixsock.sun_path[sizeof(nixsock.sun_path)-1]='\0'; |
|
|
|
nixsock.sun_path[sizeof(nixsock.sun_path)-1]='\0'; |
|
|
|
mainsa = (struct sockaddr *)&nixsock; |
|
|
|
mainsa = (struct sockaddr *)&nixsock; |
|
|
|
mainsasz = sizeof(nixsock); |
|
|
|
mainsasz = sizeof(nixsock); |
|
|
|
|
|
|
|
strmsock.sin_family = AF_INET; |
|
|
|
|
|
|
|
strmsock.sin_addr.s_addr = htonl(INADDR_LOOPBACK); |
|
|
|
optfree(clamdopts); |
|
|
|
optfree(clamdopts); |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -510,7 +514,7 @@ int client(const struct optstruct *opts, int *infected) |
|
|
|
{ |
|
|
|
{ |
|
|
|
const char *clamd_conf = optget(opts, "config-file")->strarg; |
|
|
|
const char *clamd_conf = optget(opts, "config-file")->strarg; |
|
|
|
struct optstruct *clamdopts; |
|
|
|
struct optstruct *clamdopts; |
|
|
|
int scantype, session = 0, errors = 0, scandash = 0; |
|
|
|
int remote, scantype, session = 0, errors = 0, scandash = 0; |
|
|
|
|
|
|
|
|
|
|
|
if((clamdopts = optparse(clamd_conf, 0, NULL, 1, OPT_CLAMD, 0, NULL)) == NULL) { |
|
|
|
if((clamdopts = optparse(clamd_conf, 0, NULL, 1, OPT_CLAMD, 0, NULL)) == NULL) { |
|
|
|
logg("!Can't parse clamd configuration file %s\n", clamd_conf); |
|
|
|
logg("!Can't parse clamd configuration file %s\n", clamd_conf); |
|
|
|
@ -518,15 +522,18 @@ int client(const struct optstruct *opts, int *infected) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
scandash = (opts->filename && opts->filename[0] && !strcmp(opts->filename[0], "-") && !opts->filename[1]); |
|
|
|
scandash = (opts->filename && opts->filename[0] && !strcmp(opts->filename[0], "-") && !opts->filename[1]); |
|
|
|
if(isremote(opts)) { |
|
|
|
remote = isremote(opts); |
|
|
|
scantype = STREAM; |
|
|
|
|
|
|
|
session = optget(opts, "multiscan")->enabled; |
|
|
|
|
|
|
|
#ifdef HAVE_FD_PASSING |
|
|
|
#ifdef HAVE_FD_PASSING |
|
|
|
} else if(optget(clamdopts, "LocalSocket")->enabled && (optget(opts, "fdpass")->enabled || scandash)) { |
|
|
|
if(!remote && optget(clamdopts, "LocalSocket")->enabled && (optget(opts, "fdpass")->enabled || scandash)) { |
|
|
|
scantype = FILDES; |
|
|
|
scantype = FILDES; |
|
|
|
session = optget(opts, "multiscan")->enabled; |
|
|
|
session = optget(opts, "multiscan")->enabled; |
|
|
|
scandash <<= 1; |
|
|
|
scandash <<= 1; |
|
|
|
|
|
|
|
} else
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
if(remote || scandash) { |
|
|
|
|
|
|
|
scantype = STREAM; |
|
|
|
|
|
|
|
session = optget(opts, "multiscan")->enabled; |
|
|
|
|
|
|
|
scandash <<=1; |
|
|
|
} else if(optget(opts, "multiscan")->enabled) scantype = MULTI; |
|
|
|
} else if(optget(opts, "multiscan")->enabled) scantype = MULTI; |
|
|
|
else scantype = CONT; |
|
|
|
else scantype = CONT; |
|
|
|
|
|
|
|
|
|
|
|
@ -539,9 +546,9 @@ int client(const struct optstruct *opts, int *infected) |
|
|
|
|
|
|
|
|
|
|
|
*infected = 0; |
|
|
|
*infected = 0; |
|
|
|
|
|
|
|
|
|
|
|
if(scandash == 2) { |
|
|
|
if(scandash) { |
|
|
|
int sockd, ret; |
|
|
|
int sockd, ret; |
|
|
|
if((sockd = dconnect()) >= 0 && (ret = dsresult(sockd, FILDES, NULL)) >= 0) |
|
|
|
if((sockd = dconnect()) >= 0 && (ret = dsresult(sockd, scantype, NULL)) >= 0) |
|
|
|
*infected += ret; |
|
|
|
*infected += ret; |
|
|
|
else |
|
|
|
else |
|
|
|
errors++; |
|
|
|
errors++; |
|
|
|
@ -550,7 +557,7 @@ int client(const struct optstruct *opts, int *infected) |
|
|
|
unsigned int i; |
|
|
|
unsigned int i; |
|
|
|
for (i = 0; opts->filename[i]; i++) { |
|
|
|
for (i = 0; opts->filename[i]; i++) { |
|
|
|
if(!strcmp(opts->filename[i], "-")) { |
|
|
|
if(!strcmp(opts->filename[i], "-")) { |
|
|
|
logg("!Standard input scan requires FD passing support and \"-\" must be the only file argument\n"); |
|
|
|
logg("!Scanning from standard input requires \"-\" to be the only file argument\n"); |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
client_scan(opts->filename[i], scantype, infected, &errors); |
|
|
|
client_scan(opts->filename[i], scantype, infected, &errors); |
|
|
|
|