26 #include "libmilter/mfapi.h" 32 #define DEBUG_LEVEL 15 42 static int decode_answer(
char *,
size_t,
char *,
size_t,
char *);
43 static int decode_answer_clamav(
char *,
size_t,
char *,
size_t,
46 static bool args_ok =
FALSE;
47 static int inetport = -1;
48 static int socktype = -1;
49 static char *sockname = NULL;
50 static char *inethost = NULL;
70 if (strncasecmp(p, s, strlen(s)) == 0)
75 if ((sockname = strdup(p)) == NULL)
86 if (strncasecmp(p, s, strlen(s)) == 0)
91 if ((sockname = strdup(p)) == NULL)
102 if (strncasecmp(p, s, strlen(s)) == 0)
108 n = strspn(p,
"0123456789");
109 if ((n > 0) && (n <
sizeof (tmp)))
114 inetport = atoi(tmp);
120 inethost = strdup(p);
122 inethost = strdup(
"localhost");
123 if (inethost == NULL)
127 if ((inethost == NULL) || (inetport < 0))
148 static pthread_mutex_t
mutex = PTHREAD_MUTEX_INITIALIZER;
153 char *scan_arg = NULL;
156 args_ok = av_decode_args(scan_arg);
167 STRBOOL(args_ok,
"TRUE",
"FALSE"));
180 disconnect2server(sd)
200 if (socktype == AF_INET)
202 struct sockaddr_in his_sock;
205 if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
212 if ((hp = gethostbyname(inethost)) == NULL)
218 memcpy((
char *) &his_sock.sin_addr, hp->h_addr, hp->h_length);
219 his_sock.sin_family = AF_INET;
220 his_sock.sin_port = htons(inetport);
224 log_sock_addr(&his_sock);
228 if (
connect_timed(sd, (
struct sockaddr *) &his_sock,
sizeof (his_sock), 10) != 0)
232 sd = disconnect2server(sd);
237 if (socktype == AF_UNIX)
239 struct sockaddr_un his_sock;
241 if ((sockname != NULL) && (strlen(sockname) == 0))
247 if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
253 memset(&his_sock, 0,
sizeof (his_sock));
254 his_sock.sun_family = AF_UNIX;
256 strncpy(his_sock.sun_path, sockname, strlen(sockname) + 1);
259 if (connect(sd, (
struct sockaddr *) &his_sock,
sizeof (his_sock)) != 0)
262 sd = disconnect2server(sd);
280 read_scanner_answer(sd, buf, sz, to)
286 size_t nb, nbr, ntr = 0;
296 nb = recv(sd, ptr, nbr, 0);
336 if ((answer == NULL) || (question == NULL) || (strlen(question) == 0))
343 memset(buf, 0,
sizeof (buf));
346 if (!args_ok && !av_client_init())
349 sd = connect2server();
362 memset(buf, 0,
sizeof (buf));
366 (void) read_scanner_answer(sd, buf,
sizeof (buf), 5);
367 snprintf(buf,
sizeof (buf),
"SCANFILE %s\n", question);
370 snprintf(buf,
sizeof (buf),
"nSCAN %s\n", question);
373 snprintf(buf,
sizeof (buf),
"SCANFILE %s\n", question);
381 if ((nb = sendto(sd, buf, strlen(buf), 0, NULL, 0)) < 0)
397 time_t av_to = av_timeout * 1000;
404 memset(buf, 0,
sizeof (buf));
409 now = time(NULL) + av_timeout;
419 if ((nb = recv(sd, ptr, nbr, 0)) >= 0)
449 if (now < time(NULL))
453 ZE_LogMsgError(0,
"ERROR : Too many while errors waiting for antivirus answer...");
457 }
while (!done && (nbr > 0));
460 strlcpy(answer, buf, sz_answer);
465 res = decode_answer(answer, sz_answer, msg, sz_msg, buf);
468 res = decode_answer_clamav(answer, sz_answer, msg, sz_msg, buf);
471 res = decode_answer(answer, sz_answer, msg, sz_msg, buf);
480 sd = disconnect2server(sd);
492 decode_answer(answer, sz_answer, msg, sz_msg, buf)
502 if ((tokbuf = strdup(buf)) != NULL)
506 for (s = strtok_r(tokbuf,
"\r\n", &ptr);
507 s != NULL; s = strtok_r(NULL,
"\r\n", &ptr))
509 char *expr =
"^6[0-9]{2} .*";
517 memset(code, 0,
sizeof (code));
518 strncpy(code, s, strspn(s,
"0123456789"));
520 s += strspn(s,
"0123456789 ");
538 decode_answer_clamav(answer, sz_answer, msg, sz_msg, buf)
548 if ((p =
strrchr(answer,
' ')) == NULL)
551 memset(msg, 0, sz_msg);
553 if (strstr(p,
"FOUND") != NULL)
557 if (strstr(p,
"OK") != NULL)
564 p += strcspn(p,
" \t");
565 p += strspn(p,
" \t");
566 i = strcspn(p,
" \t");
#define MUTEX_UNLOCK(mutex)
#define MUTEX_LOCK(mutex)
#define ZE_LogMsgInfo(level,...)
int jfd_ready(int, bool, long)
#define CF_SCANNER_TIMEOUT
#define ZE_LogMsgError(level,...)
bool zeStrRegex(char *, char *, long *, long *, bool)
char * zeStrChomp(char *)
int connect_timed(int, struct sockaddr *, socklen_t, int)
#define ZE_LogMsgDebug(level,...)
#define ZE_MessageInfo(level,...)
int zeSafeStrnCpy(char *, size_t, char *, size_t)
#define ZE_LogSysError(...)
#define ZE_MessageError(level,...)
#define ZE_LogSysWarning(...)
char * cf_get_str(int id)
#define ZE_LogMsgWarning(level,...)
#define CF_SCANNER_PROTOCOL
int av_client(char *answer, size_t sz_answer, char *msg, size_t sz_msg, char *question)