diff -ur smtp-vilter/backend/vilter-clamd/vilter-clamd.c smtp-vilter-AF_UNIX/backend/vilter-clamd/vilter-clamd.c --- smtp-vilter/backend/vilter-clamd/vilter-clamd.c 2003-12-20 11:59:23.000000000 +0100 +++ smtp-vilter-AF_UNIX/backend/vilter-clamd/vilter-clamd.c 2004-02-12 00:10:59.000000000 +0100 @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -66,12 +67,12 @@ int clamd_port; char *clamd_host; +char *clamd_sock; int clamd_tries; int clamd_timeout; int scantype; int chroot_scanrealpath; - int vilter_init() { @@ -81,9 +82,11 @@ /* Default values */ - clamd_port = 3310; + clamd_port = -1; if ((clamd_host = strdup("localhost")) == NULL) errx(1, "clamd: out of memory"); + if ((clamd_sock = strdup("unix:/tmp/clamd")) == NULL) + errx(1, "clamd: out of memory"); clamd_tries = 1; clamd_timeout = 0; scantype = SCANTYPE_FILESYSTEM; @@ -101,9 +104,20 @@ if (verbose) warnx("clamd: setting clamd host to %s", clamd_host); } else if (!strcmp(field, "port")) { - clamd_port = atoi(value); + free(clamd_sock); + if ((clamd_sock = strdup(value)) == NULL) + errx(1, "clamd: out of memory"); if (verbose) - warnx("clamd: setting clamd port to %d", clamd_port); + warnx("clamd: setting clamd sock to %s", clamd_sock); + + if (strncasecmp(clamd_sock, "unix:", 5)) { + clamd_port = atoi(value); + if (verbose) + warnx("clamd: setting clamd port to %d", clamd_port); + free(clamd_sock); + clamd_sock = NULL; + } + } else if (!strcmp(field, "tries")) { clamd_tries = atoi(value); if (clamd_tries < 1) @@ -168,36 +182,56 @@ FILE *fp; unsigned short port; struct sockaddr_in server_sockaddr, data_sockaddr; + struct sockaddr_un server_sockaddr2; struct timeval tv; struct hostent *hostent; char buf[MAXBUF]; char *p, *q; - - if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { - syslog(LOG_ERR, "clamd: unable to obtain network"); - return SCAN_ERROR; - } + int unixsocket = 0; + + if (clamd_sock == NULL && clamd_port > 1) { + + if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { + syslog(LOG_ERR, "clamd: unable to obtain network"); + return SCAN_ERROR; + } - bzero((char *) &server_sockaddr, sizeof(server_sockaddr)); + memset((char *) &server_sockaddr, 0, sizeof(server_sockaddr)); - server_sockaddr.sin_family = AF_INET; - server_sockaddr.sin_port = htons(clamd_port); + server_sockaddr.sin_family = AF_INET; + server_sockaddr.sin_port = htons(clamd_port); - if (inet_aton(clamd_host, &server_sockaddr.sin_addr) == 0) { - hostent = gethostbyname(clamd_host); - if (!hostent) { - syslog(LOG_ERR, "clamd: unknown host: %s", clamd_host); - close(fd); + if (inet_aton(clamd_host, &server_sockaddr.sin_addr) == 0) { + hostent = gethostbyname(clamd_host); + if (!hostent) { + syslog(LOG_ERR, "clamd: unknown host: %s", clamd_host); + close(fd); + return SCAN_ERROR; + } + server_sockaddr.sin_family = hostent->h_addrtype; + memcpy(&server_sockaddr.sin_addr, hostent->h_addr, hostent->h_length); + } + } else if (clamd_sock != NULL && strlen(clamd_sock) > 5) { + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { + syslog(LOG_ERR, "clamd: unable to obtain socket"); return SCAN_ERROR; } - server_sockaddr.sin_family = hostent->h_addrtype; - memcpy(&server_sockaddr.sin_addr, hostent->h_addr, hostent->h_length); + + unixsocket = 1; + + server_sockaddr2.sun_family = AF_UNIX; + strncpy(server_sockaddr2.sun_path, clamd_sock+5, sizeof(server_sockaddr2.sun_path)); + + } else { + return SCAN_ERROR; } try = 0; - while (connect(fd, (struct sockaddr *) &server_sockaddr, sizeof(server_sockaddr)) == -1) { + while (connect(fd, + (unixsocket ? (struct sockaddr *) &server_sockaddr2 : (struct sockaddr *) &server_sockaddr), + (unixsocket ? sizeof(server_sockaddr2) : sizeof(server_sockaddr))) == -1) { ++try; if (try == clamd_tries) { @@ -255,7 +289,7 @@ return SCAN_ERROR; } - bzero((char *) &data_sockaddr, sizeof(data_sockaddr)); + memset((char *) &data_sockaddr, 0, sizeof(data_sockaddr)); data_sockaddr.sin_family = AF_INET; data_sockaddr.sin_port = htons(port);