53
62
#include "client.h"
55
extern struct sockaddr *mainsa;
57
64
extern unsigned long int maxstream;
59
66
extern struct optstruct *clamdopts;
68
extern struct sockaddr_un nixsock;
61
71
static const char *scancmd[] = { "CONTSCAN", "MULTISCAN", "INSTREAM", "FILDES", "ALLMATCHSCAN" };
63
73
/* Connects to clamd
64
74
* Returns a FD or -1 on error */
68
if((sockd = socket(mainsa->sa_family, SOCK_STREAM, 0)) < 0) {
69
logg("!Can't create the socket: %s\n", strerror(errno));
73
if(connect(sockd, (struct sockaddr *)mainsa, mainsasz) < 0) {
75
logg("!Can't connect to clamd: %s\n", strerror(errno));
77
const struct optstruct *opt;
78
struct addrinfo hints, *info, *p;
83
opt = optget(clamdopts, "LocalSocket");
85
if ((sockd = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) {
86
if (connect(sockd, (struct sockaddr *)&nixsock, sizeof(nixsock)) == 0)
94
snprintf(port, sizeof(port), "%lld", optget(clamdopts, "TCPSocket")->numarg);
96
opt = optget(clamdopts, "TCPAddr");
100
ipaddr = (!strcmp(opt->strarg, "any") ? NULL : opt->strarg);
102
memset(&hints, 0x00, sizeof(struct addrinfo));
103
hints.ai_family = AF_UNSPEC;
104
hints.ai_socktype = SOCK_STREAM;
105
hints.ai_flags = AI_PASSIVE;
107
if ((res = getaddrinfo(ipaddr, port, &hints, &info))) {
108
logg("!Could not lookup %s: %s\n", opt->strarg, gai_strerror(res));
113
for (p = info; p != NULL; p = p->ai_next) {
114
if((sockd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) {
115
logg("!Can't create the socket: %s\n", strerror(errno));
119
if(connect(sockd, p->ai_addr, p->ai_addrlen) < 0) {
120
logg("!Could not connect to clamd on %s: %s\n", opt->strarg, strerror(errno));
81
137
/* Issues an INSTREAM command to clamd and streams the given file