mirror of
https://github.com/Cisco-Talos/clamav.git
synced 2026-05-07 07:06:20 -04:00
570 lines
13 KiB
Plaintext
570 lines
13 KiB
Plaintext
*** /home/njh/src/clamav-devel/trunk/./clamdscan/client.c 2008-01-23 16:19:16.000000000 +0000
|
|
--- ./clamdscan/client.c 2008-02-25 15:57:20.000000000 +0000
|
|
***************
|
|
*** 15,36 ****
|
|
--- 15,44 ----
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
+ #ifdef _MSC_VER
|
|
+ #include <winsock.h>
|
|
+ #endif
|
|
+
|
|
|
|
#if HAVE_CONFIG_H
|
|
#include "clamav-config.h"
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
+ #ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
+ #endif
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
+ #ifndef C_WINDOWS
|
|
#include <sys/socket.h>
|
|
#include <sys/un.h>
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <netdb.h>
|
|
#include <utime.h>
|
|
+ #endif
|
|
#include <errno.h>
|
|
|
|
#ifdef HAVE_SYS_UIO_H
|
|
***************
|
|
*** 52,60 ****
|
|
--- 60,137 ----
|
|
# define SOCKET_INET AF_INET
|
|
#endif
|
|
|
|
+ #ifndef C_WINDOWS
|
|
+ #define closesocket(s) close(s)
|
|
+ #endif
|
|
+
|
|
+ /* #define ENABLE_FD_PASSING FIXME: Doesn't work yet */
|
|
+
|
|
void move_infected(const char *filename, const struct optstruct *opt);
|
|
int notremoved = 0, notmoved = 0;
|
|
|
|
+ #ifdef C_WINDOWS
|
|
+ static int get_a_line(int sockd, char *buf, size_t len);
|
|
+
|
|
+ static int
|
|
+ dsresult(int sockd, const struct optstruct *opt)
|
|
+ {
|
|
+ char buff[BUFSIZ], *pt;
|
|
+ int infected = 0, waserror = 0;
|
|
+
|
|
+ while(get_a_line(sockd, buff, sizeof(buff))) {
|
|
+ if(strstr(buff, "FOUND\n")) {
|
|
+ infected++;
|
|
+ logg("%s", buff);
|
|
+ if(opt_check(opt, "move") || opt_check(opt, "copy")) {
|
|
+ /* filename: Virus FOUND */
|
|
+ if((pt = strrchr(buff, ':'))) {
|
|
+ *pt = 0;
|
|
+ move_infected(buff, opt);
|
|
+ } else
|
|
+ mprintf("@Broken data format. File not %s.\n", opt_check(opt, "move") ? "moved" : "copied");
|
|
+ } else if(opt_check(opt, "remove")) {
|
|
+ if(!(pt = strrchr(buff, ':')))
|
|
+ mprintf("@Broken data format. File not removed.\n");
|
|
+ else {
|
|
+ *pt = 0;
|
|
+ if(unlink(buff)) {
|
|
+ mprintf("~%s: Can't remove.\n", buff);
|
|
+ logg("~%s: Can't remove.\n", buff);
|
|
+ notremoved++;
|
|
+ } else {
|
|
+ mprintf("~%s: Removed.\n", buff);
|
|
+ logg("~%s: Removed.\n", buff);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if(strstr(buff, "ERROR\n")) {
|
|
+ logg("%s", buff);
|
|
+ waserror = 1;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return infected ? infected : (waserror ? -1 : 0);
|
|
+ }
|
|
+
|
|
+ static int
|
|
+ get_a_line(int sockd, char *buf, size_t len)
|
|
+ {
|
|
+ char *ptr;
|
|
+
|
|
+ for(ptr = buf; ptr < &buf[len]; ptr++) {
|
|
+ /* FIXME: very inefficient to call recv so many times */
|
|
+ if(recv(sockd, ptr, sizeof(char), 0) <= 0)
|
|
+ return 0;
|
|
+ if(*ptr == '\n') {
|
|
+ *++ptr = '\0';
|
|
+ return 1;
|
|
+ }
|
|
+ }
|
|
+ return 1;
|
|
+ }
|
|
+ #else
|
|
static int dsresult(int sockd, const struct optstruct *opt)
|
|
{
|
|
int infected = 0, waserror = 0;
|
|
***************
|
|
*** 64,71 ****
|
|
|
|
#ifndef C_OS2
|
|
if((fd = fdopen(dup(sockd), "r")) == NULL) {
|
|
! #else /* FIXME: accoriding to YD OS/2 does not support dup() for sockets */
|
|
! if((fd = fdopen(sockd, "r")) == NULL) {
|
|
#endif
|
|
logg("^Can't open descriptor for reading.\n");
|
|
return -1;
|
|
--- 141,148 ----
|
|
|
|
#ifndef C_OS2
|
|
if((fd = fdopen(dup(sockd), "r")) == NULL) {
|
|
! #else /* FIXME: according to YD OS/2 does not support dup() for sockets */
|
|
! if((fd = fdopen(sockd, "rb")) == NULL) {
|
|
#endif
|
|
logg("^Can't open descriptor for reading.\n");
|
|
return -1;
|
|
***************
|
|
*** 90,101 ****
|
|
} else {
|
|
*pt = 0;
|
|
if(unlink(buff)) {
|
|
! mprintf("~%s: Can't remove.\n", buff);
|
|
! logg("~%s: Can't remove.\n", buff);
|
|
notremoved++;
|
|
} else {
|
|
! mprintf("~%s: Removed.\n", buff);
|
|
! logg("~%s: Removed.\n", buff);
|
|
}
|
|
}
|
|
}
|
|
--- 167,178 ----
|
|
} else {
|
|
*pt = 0;
|
|
if(unlink(buff)) {
|
|
! mprintf("%s: Can't remove.\n", buff);
|
|
! logg("%s: Can't remove.\n", buff);
|
|
notremoved++;
|
|
} else {
|
|
! mprintf("%s: Removed.\n", buff);
|
|
! logg("%s: Removed.\n", buff);
|
|
}
|
|
}
|
|
}
|
|
***************
|
|
*** 113,118 ****
|
|
--- 190,196 ----
|
|
|
|
return infected ? infected : (waserror ? -1 : 0);
|
|
}
|
|
+ #endif /*C_WINDOWS*/
|
|
|
|
static int dsfile(int sockd, const char *scantype, const char *filename, const struct optstruct *opt)
|
|
{
|
|
***************
|
|
*** 123,129 ****
|
|
scancmd = malloc(strlen(filename) + 20);
|
|
sprintf(scancmd, "%s %s", scantype, filename);
|
|
|
|
! if(write(sockd, scancmd, strlen(scancmd)) <= 0) {
|
|
logg("^Can't write to the socket.\n");
|
|
free(scancmd);
|
|
return -1;
|
|
--- 201,207 ----
|
|
scancmd = malloc(strlen(filename) + 20);
|
|
sprintf(scancmd, "%s %s", scantype, filename);
|
|
|
|
! if(send(sockd, scancmd, strlen(scancmd), 0) <= 0) {
|
|
logg("^Can't write to the socket.\n");
|
|
free(scancmd);
|
|
return -1;
|
|
***************
|
|
*** 148,161 ****
|
|
char buff[4096], *pt;
|
|
|
|
|
|
! if(write(sockd, "STREAM", 6) <= 0) {
|
|
logg("^Can't write to the socket.\n");
|
|
return 2;
|
|
}
|
|
|
|
while(loopw) {
|
|
memset(buff, 0, sizeof(buff));
|
|
! if(read(sockd, buff, sizeof(buff)) > 0) {
|
|
if((pt = strstr(buff, "PORT"))) {
|
|
pt += 5;
|
|
sscanf(pt, "%d", &port);
|
|
--- 226,239 ----
|
|
char buff[4096], *pt;
|
|
|
|
|
|
! if(send(sockd, "STREAM", 6, 0) <= 0) {
|
|
logg("^Can't write to the socket.\n");
|
|
return 2;
|
|
}
|
|
|
|
while(loopw) {
|
|
memset(buff, 0, sizeof(buff));
|
|
! if(recv(sockd, buff, sizeof(buff), 0) > 0) {
|
|
if((pt = strstr(buff, "PORT"))) {
|
|
pt += 5;
|
|
sscanf(pt, "%d", &port);
|
|
***************
|
|
*** 201,207 ****
|
|
}
|
|
|
|
if(connect(wsockd, (struct sockaddr *) &server, sizeof(struct sockaddr_in)) < 0) {
|
|
! close(wsockd);
|
|
perror("connect()");
|
|
logg("^Can't connect to clamd [port: %d].\n", port);
|
|
return -1;
|
|
--- 279,285 ----
|
|
}
|
|
|
|
if(connect(wsockd, (struct sockaddr *) &server, sizeof(struct sockaddr_in)) < 0) {
|
|
! closesocket(wsockd);
|
|
perror("connect()");
|
|
logg("^Can't connect to clamd [port: %d].\n", port);
|
|
return -1;
|
|
***************
|
|
*** 210,220 ****
|
|
while((bread = read(0, buff, sizeof(buff))) > 0) {
|
|
if(write(wsockd, buff, bread) <= 0) {
|
|
logg("^Can't write to the socket.\n");
|
|
! close(wsockd);
|
|
return -1;
|
|
}
|
|
}
|
|
! close(wsockd);
|
|
|
|
memset(buff, 0, sizeof(buff));
|
|
while((bread = read(sockd, buff, sizeof(buff))) > 0) {
|
|
--- 288,298 ----
|
|
while((bread = read(0, buff, sizeof(buff))) > 0) {
|
|
if(write(wsockd, buff, bread) <= 0) {
|
|
logg("^Can't write to the socket.\n");
|
|
! closesocket(wsockd);
|
|
return -1;
|
|
}
|
|
}
|
|
! closesocket(wsockd);
|
|
|
|
memset(buff, 0, sizeof(buff));
|
|
while((bread = read(sockd, buff, sizeof(buff))) > 0) {
|
|
***************
|
|
*** 259,265 ****
|
|
--- 337,345 ----
|
|
|
|
static int dconnect(const struct optstruct *opt)
|
|
{
|
|
+ #ifndef C_WINDOWS
|
|
struct sockaddr_un server;
|
|
+ #endif
|
|
struct sockaddr_in server2;
|
|
struct hostent *he;
|
|
struct cfgstruct *copt;
|
|
***************
|
|
*** 276,288 ****
|
|
--- 356,374 ----
|
|
return -1;
|
|
}
|
|
|
|
+ #ifndef C_WINDOWS
|
|
memset((char *) &server, 0, sizeof(server));
|
|
+ #endif
|
|
memset((char *) &server2, 0, sizeof(server2));
|
|
|
|
/* Set default address to connect to */
|
|
server2.sin_addr.s_addr = inet_addr("127.0.0.1");
|
|
|
|
if((cpt = cfgopt(copt, "LocalSocket"))->enabled) {
|
|
+ #ifdef C_WINDOWS
|
|
+ logg("^LocalSocket is not supported under Windows");
|
|
+ return -1;
|
|
+ #else
|
|
|
|
server.sun_family = AF_UNIX;
|
|
strncpy(server.sun_path, cpt->strarg, sizeof(server.sun_path));
|
|
***************
|
|
*** 301,308 ****
|
|
freecfg(copt);
|
|
return -1;
|
|
}
|
|
|
|
! } else if((cpt = cfgopt(copt, "TCPSocket"))->enabled) {
|
|
|
|
if((sockd = socket(SOCKET_INET, SOCK_STREAM, 0)) < 0) {
|
|
perror("socket()");
|
|
--- 387,404 ----
|
|
freecfg(copt);
|
|
return -1;
|
|
}
|
|
+ #endif
|
|
+
|
|
+ } else if((cpt = cfgopt(copt, "TCPSocket"))->enabled) {
|
|
+ #ifdef C_WINDOWS
|
|
+ WSADATA wsaData;
|
|
|
|
! if(WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) {
|
|
! logg("!Error at WSAStartup(): %d\n", WSAGetLastError());
|
|
! return -1;
|
|
! }
|
|
! #endif
|
|
!
|
|
|
|
if((sockd = socket(SOCKET_INET, SOCK_STREAM, 0)) < 0) {
|
|
perror("socket()");
|
|
***************
|
|
*** 316,322 ****
|
|
|
|
if((cpt = cfgopt(copt, "TCPAddr"))->enabled) {
|
|
if ((he = gethostbyname(cpt->strarg)) == 0) {
|
|
! close(sockd);
|
|
perror("gethostbyname()");
|
|
logg("^Can't lookup clamd hostname.\n");
|
|
freecfg(copt);
|
|
--- 412,418 ----
|
|
|
|
if((cpt = cfgopt(copt, "TCPAddr"))->enabled) {
|
|
if ((he = gethostbyname(cpt->strarg)) == 0) {
|
|
! closesocket(sockd);
|
|
perror("gethostbyname()");
|
|
logg("^Can't lookup clamd hostname.\n");
|
|
freecfg(copt);
|
|
***************
|
|
*** 326,332 ****
|
|
}
|
|
|
|
if(connect(sockd, (struct sockaddr *) &server2, sizeof(struct sockaddr_in)) < 0) {
|
|
! close(sockd);
|
|
perror("connect()");
|
|
logg("^Can't connect to clamd.\n");
|
|
freecfg(copt);
|
|
--- 422,428 ----
|
|
}
|
|
|
|
if(connect(sockd, (struct sockaddr *) &server2, sizeof(struct sockaddr_in)) < 0) {
|
|
! closesocket(sockd);
|
|
perror("connect()");
|
|
logg("^Can't connect to clamd.\n");
|
|
freecfg(copt);
|
|
***************
|
|
*** 396,402 ****
|
|
else
|
|
errors++;
|
|
|
|
! close(sockd);
|
|
|
|
} else if(!strcmp(opt->filename, "-")) { /* scan data from stdin */
|
|
if((sockd = dconnect(opt)) < 0)
|
|
--- 492,498 ----
|
|
else
|
|
errors++;
|
|
|
|
! closesocket(sockd);
|
|
|
|
} else if(!strcmp(opt->filename, "-")) { /* scan data from stdin */
|
|
if((sockd = dconnect(opt)) < 0)
|
|
***************
|
|
*** 407,413 ****
|
|
else
|
|
errors++;
|
|
|
|
! close(sockd);
|
|
|
|
} else {
|
|
int x;
|
|
--- 503,509 ----
|
|
else
|
|
errors++;
|
|
|
|
! closesocket(sockd);
|
|
|
|
} else {
|
|
int x;
|
|
***************
|
|
*** 441,447 ****
|
|
else
|
|
errors++;
|
|
|
|
! close(sockd);
|
|
break;
|
|
|
|
default:
|
|
--- 537,543 ----
|
|
else
|
|
errors++;
|
|
|
|
! closesocket(sockd);
|
|
break;
|
|
|
|
default:
|
|
***************
|
|
*** 464,470 ****
|
|
--- 560,568 ----
|
|
struct stat ofstat, mfstat;
|
|
int n, len, movefilename_size;
|
|
int moveflag = opt_check(opt, "move");
|
|
+ #ifndef C_WINDOWS
|
|
struct utimbuf ubuf;
|
|
+ #endif
|
|
|
|
|
|
if((moveflag && !(movedir = opt_arg(opt, "move"))) ||
|
|
***************
|
|
*** 551,559 ****
|
|
--- 649,660 ----
|
|
if(chown(movefilename, ofstat.st_uid, ofstat.st_gid) == -1)
|
|
logg("^chown() failed for %s: %s\n", movefilename, strerror(errno));
|
|
|
|
+
|
|
+ #ifndef C_WINDOWS
|
|
ubuf.actime = ofstat.st_atime;
|
|
ubuf.modtime = ofstat.st_mtime;
|
|
utime(movefilename, &ubuf);
|
|
+ #endif
|
|
|
|
if(moveflag && unlink(filename)) {
|
|
logg("^cannot unlink '%s': %s\n", filename, strerror(errno));
|
|
*** /home/njh/src/clamav-devel/trunk/./clamdscan/clamdscan.c 2008-01-21 20:56:26.000000000 +0000
|
|
--- ./clamdscan/clamdscan.c 2008-01-21 20:52:50.000000000 +0000
|
|
***************
|
|
*** 15,30 ****
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
|
|
#if HAVE_CONFIG_H
|
|
#include "clamav-config.h"
|
|
#endif
|
|
-
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <sys/time.h>
|
|
#include <time.h>
|
|
#include <signal.h>
|
|
|
|
--- 15,42 ----
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
+
|
|
+ #ifdef _MSC_VER
|
|
+ #include <windows.h>
|
|
+ #include <winsock.h>
|
|
+ #endif
|
|
|
|
#if HAVE_CONFIG_H
|
|
#include "clamav-config.h"
|
|
#endif
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
+ #ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
+ #endif
|
|
+ #ifdef C_WINDOWS
|
|
+ #ifdef CL_THREAD_SAFE
|
|
+ #include <pthread.h>
|
|
+ #endif
|
|
+ #else
|
|
#include <sys/time.h>
|
|
+ #endif
|
|
#include <time.h>
|
|
#include <signal.h>
|
|
|
|
***************
|
|
*** 61,67 ****
|
|
--- 73,81 ----
|
|
{
|
|
int ds, dms, ret, infected;
|
|
struct timeval t1, t2;
|
|
+ #ifndef C_WINDOWS
|
|
struct timezone tz;
|
|
+ #endif
|
|
time_t starttime;
|
|
struct optstruct *opt;
|
|
const char *clamdscan_accepted[] = { "help", "version", "verbose", "quiet",
|
|
***************
|
|
*** 70,75 ****
|
|
--- 84,96 ----
|
|
"disable-summary", "multiscan", NULL };
|
|
|
|
|
|
+ #ifdef C_WINDOWS
|
|
+ if(!pthread_win32_process_attach_np()) {
|
|
+ mprintf("!Can't start the win32 pthreads layer\n");
|
|
+ return 1;
|
|
+ }
|
|
+ #endif
|
|
+
|
|
opt = opt_parse(argc, argv, clamscan_shortopt, clamscan_longopt, clamdscan_accepted);
|
|
if(!opt) {
|
|
mprintf("!Can't parse the command line\n");
|
|
***************
|
|
*** 117,129 ****
|
|
time(&starttime);
|
|
/* ctime() does \n, but I need it once more */
|
|
|
|
! gettimeofday(&t1, &tz);
|
|
|
|
ret = client(opt, &infected);
|
|
|
|
/* TODO: Implement STATUS in clamd */
|
|
if(!opt_check(opt, "disable-summary") && !opt_check(opt, "no-summary")) {
|
|
gettimeofday(&t2, &tz);
|
|
ds = t2.tv_sec - t1.tv_sec;
|
|
dms = t2.tv_usec - t1.tv_usec;
|
|
ds -= (dms < 0) ? (1):(0);
|
|
--- 138,158 ----
|
|
time(&starttime);
|
|
/* ctime() does \n, but I need it once more */
|
|
|
|
! #ifdef C_WINDOWS
|
|
! gettimeofday(&t1, NULL);
|
|
! #else
|
|
! gettimeofday(&t1, &tz);
|
|
! #endif
|
|
|
|
ret = client(opt, &infected);
|
|
|
|
/* TODO: Implement STATUS in clamd */
|
|
if(!opt_check(opt, "disable-summary") && !opt_check(opt, "no-summary")) {
|
|
+ #ifdef C_WINDOWS
|
|
+ gettimeofday(&t2, NULL);
|
|
+ #else
|
|
gettimeofday(&t2, &tz);
|
|
+ #endif
|
|
ds = t2.tv_sec - t1.tv_sec;
|
|
dms = t2.tv_usec - t1.tv_usec;
|
|
ds -= (dms < 0) ? (1):(0);
|
|
***************
|
|
*** 140,145 ****
|
|
--- 169,183 ----
|
|
}
|
|
|
|
opt_free(opt);
|
|
+
|
|
+ #ifdef C_WINDOWS
|
|
+ WSACleanup();
|
|
+ if(!pthread_win32_process_detach_np()) {
|
|
+ mprintf("!Can't stop the win32 pthreads layer\n");
|
|
+ return 1;
|
|
+ }
|
|
+ #endif
|
|
+
|
|
exit(ret);
|
|
}
|
|
|