Browse code

Use SCAN in more places rather than STREAM

git-svn-id: file:///var/lib/svn/clamav-devel/trunk/clamav-devel@1096 77e5149b-7576-45b1-b177-96237e5ba77b

Nigel Horne authored on 2004/11/15 00:23:47
Showing 4 changed files
... ...
@@ -1,3 +1,7 @@
1
+Sun Nov 14 15:23:02 GMT 2004 (njh)
2
+----------------------------------
3
+  * clamav-milter:	Use SCAN in more places in preference to STREAM
4
+
1 5
 Sat Nov 13 17:14:17 CET 2004 (tk)
2 6
 ---------------------------------
3 7
   * freshclam: better handling of connection errors (thanks to Simon Munton
... ...
@@ -558,6 +558,8 @@ Changes
558 558
 0.80r	10/11/04 Define SHUT_* and INET_ADDRSTRLEN if not already defined
559 559
 		SCAN in situ rather than passing the file through a socket if
560 560
 			localSocket and not quarantine_dir
561
+0.80s	13/11/04 Use SCAN when UNIX socket (localSocket) is used or when the
562
+			load balancing algorithm favours localhost
561 563
 
562 564
 INTERNATIONALISATION
563 565
 
... ...
@@ -26,6 +26,9 @@
26 26
  *
27 27
  * Change History:
28 28
  * $Log: clamav-milter.c,v $
29
+ * Revision 1.153  2004/11/14 15:18:49  nigelhorne
30
+ * Use SCAN in more places rather than STREAM
31
+ *
29 32
  * Revision 1.152  2004/11/12 16:48:57  nigelhorne
30 33
  * Use SCAN when in localSocket mode
31 34
  *
... ...
@@ -467,9 +470,9 @@
467 467
  * Revision 1.6  2003/09/28 16:37:23  nigelhorne
468 468
  * Added -f flag use MaxThreads if --max-children not set
469 469
  */
470
-static	char	const	rcsid[] = "$Id: clamav-milter.c,v 1.152 2004/11/12 16:48:57 nigelhorne Exp $";
470
+static	char	const	rcsid[] = "$Id: clamav-milter.c,v 1.153 2004/11/14 15:18:49 nigelhorne Exp $";
471 471
 
472
-#define	CM_VERSION	"0.80r"
472
+#define	CM_VERSION	"0.80s"
473 473
 
474 474
 /*#define	CONFDIR	"/usr/local/etc"*/
475 475
 
... ...
@@ -580,7 +583,7 @@ typedef	unsigned int	in_addr_t;
580 580
  * TODO: Encrypt mails sent to clamd to stop sniffers
581 581
  * TODO: Test with IPv6
582 582
  * TODO: Files can be scanned with "SCAN" not "STREAM" if clamd is on the same
583
- *	machine when talking via INEt domain socket.
583
+ *	machine when talking via INET domain socket.
584 584
  * TODO: Load balancing, allow local machine to talk via UNIX domain socket.
585 585
  */
586 586
 
... ...
@@ -650,7 +653,7 @@ struct	privdata {
650 650
 };
651 651
 
652 652
 #ifdef	SESSION
653
-static	int		createSession(int session);
653
+static	int		createSession(int s);
654 654
 #else
655 655
 static	int		pingServer(int serverNumber);
656 656
 #endif
... ...
@@ -799,15 +802,14 @@ static	char	*port = NULL;	/* sendmail->milter comms */
799 799
 
800 800
 static	const	char	*serverHostNames = "127.0.0.1";
801 801
 static	long	*serverIPs;	/* IPv4 only */
802
-static	int	numServers;	/* number of elements in serverIPs/cmdSockets */
802
+static	int	numServers;	/* number of elements in sessions array */
803 803
 
804 804
 #ifdef	SESSION
805
-static	int	*cmdSockets;
806
-static	int	*cmdSocketsStatus;
805
+static	struct	session {
806
+	int	sock;	/* fd */
807
+	enum	{ CMDSOCKET_FREE, CMDSOCKET_INUSE, CMDSOCKET_DOWN }	status;
808
+} *sessions;
807 809
 static	pthread_mutex_t sstatus_mutex = PTHREAD_MUTEX_INITIALIZER;
808
-#define	CMDSOCKET_FREE	0
809
-#define	CMDSOCKET_INUSE	1
810
-#define	CMDSOCKET_DOWN	2
811 810
 
812 811
 static	pthread_cond_t	watchdog_cond = PTHREAD_COND_INITIALIZER;
813 812
 
... ...
@@ -1365,8 +1367,8 @@ main(int argc, char **argv)
1365 1365
 		server.sun_family = AF_UNIX;
1366 1366
 		strncpy(server.sun_path, localSocket, sizeof(server.sun_path));
1367 1367
 
1368
-		cmdSockets = (int *)cli_malloc(sizeof(int));
1369
-		if((cmdSockets[0] = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
1368
+		sessions = (struct session *)cli_malloc(sizeof(struct session));
1369
+		if((sessions[0].sock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
1370 1370
 			perror(localSocket);
1371 1371
 			fprintf(stderr, _("Can't talk to clamd server via %s\n"),
1372 1372
 				localSocket);
... ...
@@ -1374,18 +1376,17 @@ main(int argc, char **argv)
1374 1374
 				cfgfile);
1375 1375
 			return EX_CONFIG;
1376 1376
 		}
1377
-		if(connect(cmdSockets[0], (struct sockaddr *)&server, sizeof(struct sockaddr_un)) < 0) {
1377
+		if(connect(sessions[0].sock, (struct sockaddr *)&server, sizeof(struct sockaddr_un)) < 0) {
1378 1378
 			perror(localSocket);
1379 1379
 			return EX_UNAVAILABLE;
1380 1380
 		}
1381
-		if(send(cmdSockets[0], "SESSION\n", 7, 0) < 7) {
1381
+		if(send(sessions[0].sock, "SESSION\n", 7, 0) < 7) {
1382 1382
 			perror("send");
1383 1383
 			if(use_syslog)
1384 1384
 				syslog(LOG_ERR, _("Can't create a clamd session"));
1385 1385
 			return EX_UNAVAILABLE;
1386 1386
 		}
1387
-		cmdSocketsStatus = (int *)cli_malloc(sizeof(int));
1388
-		cmdSocketsStatus[0] = CMDSOCKET_FREE;
1387
+		sessions[0].status = CMDSOCKET_FREE;
1389 1388
 #endif
1390 1389
 		/*
1391 1390
 		 * FIXME: Allow connection to remote servers by TCP/IP whilst
... ...
@@ -1480,8 +1481,7 @@ main(int argc, char **argv)
1480 1480
 #ifdef	SESSION
1481 1481
 		activeServers = numServers;
1482 1482
 
1483
-		cmdSockets = (int *)cli_malloc(max_children * sizeof(int));
1484
-		cmdSocketsStatus = (int *)cli_calloc(max_children, sizeof(int));
1483
+		sessions = (struct session *)cli_calloc(max_children, sizeof(struct session));
1485 1484
 		for(i = 0; i < max_children; i++)
1486 1485
 			if(createSession(i) < 0)
1487 1486
 				return EX_UNAVAILABLE;
... ...
@@ -1679,14 +1679,15 @@ main(int argc, char **argv)
1679 1679
 /*
1680 1680
  * Use the SESSION command of clamd.
1681 1681
  * Returns -1 for terminal failure, 0 for OK, 1 for nonterminal failure
1682
- * The caller must take care of locking the cmdSocketsStatus array
1682
+ * The caller must take care of locking the sessions array
1683 1683
  */
1684 1684
 static int
1685
-createSession(int session)
1685
+createSession(int s)
1686 1686
 {
1687 1687
 	int ret = 0;
1688 1688
 	struct sockaddr_in server;
1689
-	const int serverNumber = session % numServers;
1689
+	const int serverNumber = s % numServers;
1690
+	struct session *session = &sessions[s];
1690 1691
 
1691 1692
 	memset((char *)&server, 0, sizeof(struct sockaddr_in));
1692 1693
 	server.sin_family = AF_INET;
... ...
@@ -1694,13 +1695,13 @@ createSession(int session)
1694 1694
 
1695 1695
 	server.sin_addr.s_addr = serverIPs[serverNumber];
1696 1696
 
1697
-	if((cmdSockets[session] = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
1697
+	if((session->sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
1698 1698
 		perror("socket");
1699 1699
 		ret = -1;
1700
-	} else if(connect(cmdSockets[session], (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0) {
1700
+	} else if(connect(session->sock, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0) {
1701 1701
 		perror("connect");
1702 1702
 		ret = 1;
1703
-	} else if(send(cmdSockets[session], "SESSION\n", 7, 0) < 7) {
1703
+	} else if(send(session->sock, "SESSION\n", 7, 0) < 7) {
1704 1704
 		perror("send");
1705 1705
 		ret = 1;
1706 1706
 	}
... ...
@@ -1714,9 +1715,9 @@ createSession(int session)
1714 1714
 		char *hostname = cli_strtok(serverHostNames, serverNumber, ":");
1715 1715
 #endif
1716 1716
 
1717
-		if(cmdSockets[session] >= 0) {
1718
-			close(cmdSockets[session]);
1719
-			cmdSockets[session] = -1;
1717
+		if(session->sock >= 0) {
1718
+			close(session->sock);
1719
+			session->sock = -1;
1720 1720
 		}
1721 1721
 
1722 1722
 		cli_warnmsg(_("Check clamd server %s - it may be down\n"), hostname);
... ...
@@ -1726,7 +1727,7 @@ createSession(int session)
1726 1726
 
1727 1727
 		broadcast(_("Check clamd server - it may be down\n"));
1728 1728
 
1729
-		cmdSocketsStatus[session] = CMDSOCKET_DOWN;
1729
+		session->status = CMDSOCKET_DOWN;
1730 1730
 	}
1731 1731
 
1732 1732
 	return ret;
... ...
@@ -1853,10 +1854,11 @@ static int
1853 1853
 findServer(void)
1854 1854
 {
1855 1855
 	int i;
1856
+	struct session *session;
1856 1857
 
1857 1858
 	/*
1858 1859
 	 * FIXME: Sessions code isn't flexible at handling servers
1859
-	 *	appearing and disappearing, e.g. cmdSockets[n_children] == -1
1860
+	 *	appearing and disappearing, e.g. sessions[n_children].sock == -1
1860 1861
 	 */
1861 1862
 	pthread_mutex_lock(&n_children_mutex);
1862 1863
 	assert(n_children > 0);
... ...
@@ -1864,10 +1866,11 @@ findServer(void)
1864 1864
 	i = n_children - 1;
1865 1865
 	pthread_mutex_unlock(&n_children_mutex);
1866 1866
 
1867
+	session = sessions;
1867 1868
 	pthread_mutex_lock(&sstatus_mutex);
1868
-	for(; i < max_children; i++)
1869
-		if(cmdSocketsStatus[i] == CMDSOCKET_FREE) {
1870
-			cmdSocketsStatus[i] = CMDSOCKET_INUSE;
1869
+	for(; i < max_children; i++, session++)
1870
+		if(session->status == CMDSOCKET_FREE) {
1871
+			session->status = CMDSOCKET_INUSE;
1871 1872
 			pthread_mutex_unlock(&sstatus_mutex);
1872 1873
 			return i;
1873 1874
 		}
... ...
@@ -1877,10 +1880,11 @@ findServer(void)
1877 1877
 		perror("pthread_cond_broadcast");
1878 1878
 
1879 1879
 	i = 0;
1880
+	session = sessions;
1880 1881
 	pthread_mutex_lock(&sstatus_mutex);
1881
-	for(; i < max_children; i++)
1882
-		if(cmdSocketsStatus[i] == CMDSOCKET_FREE) {
1883
-			cmdSocketsStatus[i] = CMDSOCKET_INUSE;
1882
+	for(; i < max_children; i++, session++)
1883
+		if(session->status == CMDSOCKET_FREE) {
1884
+			session->status = CMDSOCKET_INUSE;
1884 1885
 			pthread_mutex_unlock(&sstatus_mutex);
1885 1886
 			return i;
1886 1887
 		}
... ...
@@ -2498,11 +2502,16 @@ clamfi_eom(SMFICTX *ctx)
2498 2498
 	const char *sendmailId;
2499 2499
 	struct privdata *privdata = (struct privdata *)smfi_getpriv(ctx);
2500 2500
 	char mess[128];
2501
+#ifdef	SESSION
2502
+	struct session *session;
2503
+#endif
2501 2504
 
2502 2505
 	if(logVerbose)
2503 2506
 		syslog(LOG_DEBUG, "clamfi_eom");
2504
-#ifdef	CL_DEBUG
2507
+
2505 2508
 	cli_dbgmsg("clamfi_eom\n");
2509
+
2510
+#ifdef	CL_DEBUG
2506 2511
 	assert(privdata != NULL);
2507 2512
 #ifndef	SESSION
2508 2513
 	assert((privdata->cmdSocket >= 0) || (privdata->filename != NULL));
... ...
@@ -2514,27 +2523,24 @@ clamfi_eom(SMFICTX *ctx)
2514 2514
 	close(privdata->dataSocket);
2515 2515
 	privdata->dataSocket = -1;
2516 2516
 
2517
-	if(quarantine_dir || tmpdir) {
2517
+	if(privdata->filename) {
2518 2518
 		char cmdbuf[1024];
2519 2519
 		/*
2520 2520
 		 * Create socket to talk to clamd.
2521 2521
 		 */
2522
+#ifdef	SESSION
2522 2523
 		struct sockaddr_un server;
2524
+#endif
2523 2525
 		int nbytes;
2524 2526
 
2525
-		assert(localSocket != NULL);
2526
-
2527
-		memset((char *)&server, 0, sizeof(struct sockaddr_un));
2528
-		server.sun_family = AF_UNIX;
2529
-		strncpy(server.sun_path, localSocket, sizeof(server.sun_path));
2530
-
2531 2527
 		snprintf(cmdbuf, sizeof(cmdbuf) - 1, "SCAN %s", privdata->filename);
2532 2528
 		cli_dbgmsg("clamfi_eom: SCAN %s\n", privdata->filename);
2533 2529
 
2534 2530
 		nbytes = (int)strlen(cmdbuf);
2535 2531
 
2536 2532
 #ifdef	SESSION
2537
-		if(send(cmdSockets[0], cmdbuf, nbytes, 0) < nbytes) {
2533
+		session = sessions;
2534
+		if(send(session->sock, cmdbuf, nbytes, 0) < nbytes) {
2538 2535
 			perror("send");
2539 2536
 			clamfi_cleanup(ctx);
2540 2537
 			if(use_syslog)
... ...
@@ -2547,6 +2553,10 @@ clamfi_eom(SMFICTX *ctx)
2547 2547
 			clamfi_cleanup(ctx);
2548 2548
 			return cl_error;
2549 2549
 		}
2550
+		memset((char *)&server, 0, sizeof(struct sockaddr_un));
2551
+		server.sun_family = AF_UNIX;
2552
+		strncpy(server.sun_path, localSocket, sizeof(server.sun_path));
2553
+
2550 2554
 		if(connect(privdata->cmdSocket, (struct sockaddr *)&server, sizeof(struct sockaddr_un)) < 0) {
2551 2555
 			perror(localSocket);
2552 2556
 			clamfi_cleanup(ctx);
... ...
@@ -2563,9 +2573,13 @@ clamfi_eom(SMFICTX *ctx)
2563 2563
 		shutdown(privdata->cmdSocket, SHUT_WR);
2564 2564
 #endif
2565 2565
 	}
2566
+#ifdef	SESSION
2567
+	else
2568
+		session = &sessions[privdata->serverNumber];
2569
+#endif
2566 2570
 
2567 2571
 #ifdef	SESSION
2568
-	if(clamd_recv(cmdSockets[privdata->serverNumber], mess, sizeof(mess)) > 0) {
2572
+	if(clamd_recv(session->sock, mess, sizeof(mess)) > 0) {
2569 2573
 #else
2570 2574
 	if(clamd_recv(privdata->cmdSocket, mess, sizeof(mess)) > 0) {
2571 2575
 #endif
... ...
@@ -2588,7 +2602,7 @@ clamfi_eom(SMFICTX *ctx)
2588 2588
 #endif
2589 2589
 #ifdef	SESSION
2590 2590
 		pthread_mutex_lock(&sstatus_mutex);
2591
-		cmdSocketsStatus[privdata->serverNumber] = CMDSOCKET_DOWN;
2591
+		session->status = CMDSOCKET_DOWN;
2592 2592
 		pthread_mutex_unlock(&sstatus_mutex);
2593 2593
 #endif
2594 2594
 		return cl_error;
... ...
@@ -2596,8 +2610,8 @@ clamfi_eom(SMFICTX *ctx)
2596 2596
 
2597 2597
 #ifdef	SESSION
2598 2598
 	pthread_mutex_lock(&sstatus_mutex);
2599
-	if(cmdSocketsStatus[privdata->serverNumber] == CMDSOCKET_INUSE)
2600
-		cmdSocketsStatus[privdata->serverNumber] = CMDSOCKET_FREE;
2599
+	if(session->status == CMDSOCKET_INUSE)
2600
+		session->status = CMDSOCKET_FREE;
2601 2601
 	pthread_mutex_unlock(&sstatus_mutex);
2602 2602
 #else
2603 2603
 	close(privdata->cmdSocket);
... ...
@@ -2692,11 +2706,8 @@ clamfi_eom(SMFICTX *ctx)
2692 2692
 		cli_warnmsg("%s: %s\n", sendmailId, mess);
2693 2693
 		if(use_syslog)
2694 2694
 			syslog(LOG_ERR, "%s: %s\n", sendmailId, mess);
2695
-		clamfi_cleanup(ctx);
2696
-		return cl_error;
2697
-	}
2698
-
2699
-	if((ptr = strstr(mess, "FOUND")) == NULL) {
2695
+		rc = cl_error;
2696
+	} else if((ptr = strstr(mess, "FOUND")) == NULL) {
2700 2697
 		if(!nflag)
2701 2698
 			smfi_addheader(ctx, "X-Virus-Status", _("Clean"));
2702 2699
 
... ...
@@ -2919,9 +2930,7 @@ clamfi_eom(SMFICTX *ctx)
2919 2919
 			}
2920 2920
 		}
2921 2921
 
2922
-		if(privdata->filename) {
2923
-			assert(quarantine_dir || tmpdir);
2924
-
2922
+		if(quarantine_dir) {
2925 2923
 			if(use_syslog)
2926 2924
 				syslog(LOG_NOTICE, _("Quarantined infected mail as %s"), privdata->filename);
2927 2925
 			/*
... ...
@@ -3026,6 +3035,9 @@ clamfi_free(struct privdata *privdata)
3026 3026
 {
3027 3027
 	cli_dbgmsg("clamfi_free\n");
3028 3028
 	if(privdata) {
3029
+#ifdef	SESSION
3030
+		struct session *session;
3031
+#endif
3029 3032
 		if(privdata->body)
3030 3033
 			free(privdata->body);
3031 3034
 
... ...
@@ -3083,13 +3095,14 @@ clamfi_free(struct privdata *privdata)
3083 3083
 		}
3084 3084
 
3085 3085
 #ifdef	SESSION
3086
+		session = &sessions[privdata->serverNumber];
3086 3087
 		pthread_mutex_lock(&sstatus_mutex);
3087
-		if(cmdSocketsStatus[privdata->serverNumber] == CMDSOCKET_INUSE) {
3088
+		if(session->status == CMDSOCKET_INUSE) {
3088 3089
 #if	0
3089 3090
 			pthread_mutex_unlock(&sstatus_mutex);
3090 3091
 			if(readTimeout) {
3091 3092
 				char buf[64];
3092
-				const int fd = cmdSockets[privdata->serverNumber];
3093
+				const int fd = session->status;
3093 3094
 
3094 3095
 				cli_dbgmsg("clamfi_free: flush server %d fd %d\n",
3095 3096
 					privdata->serverNumber, fd);
... ...
@@ -3104,7 +3117,7 @@ clamfi_free(struct privdata *privdata)
3104 3104
 			}
3105 3105
 			pthread_mutex_lock(&sstatus_mutex);
3106 3106
 #endif
3107
-			cmdSocketsStatus[privdata->serverNumber] = CMDSOCKET_FREE;
3107
+			session->status = CMDSOCKET_FREE;
3108 3108
 		}
3109 3109
 		pthread_mutex_unlock(&sstatus_mutex);
3110 3110
 #else
... ...
@@ -3200,14 +3213,14 @@ clamfi_send(struct privdata *privdata, size_t len, const char *format, ...)
3200 3200
 #endif
3201 3201
 
3202 3202
 	while(len > 0) {
3203
-		const int nbytes = (quarantine_dir || tmpdir) ?
3203
+		const int nbytes = (privdata->filename) ?
3204 3204
 			write(privdata->dataSocket, ptr, len) :
3205 3205
 			send(privdata->dataSocket, ptr, len, 0);
3206 3206
 
3207 3207
 		assert(privdata->dataSocket >= 0);
3208 3208
 
3209 3209
 		if(nbytes == -1) {
3210
-			if(quarantine_dir || tmpdir) {
3210
+			if(privdata->filename) {
3211 3211
 				perror(privdata->filename);
3212 3212
 				if(use_syslog) {
3213 3213
 #ifdef HAVE_STRERROR_R
... ...
@@ -3504,6 +3517,7 @@ connect2clamd(struct privdata *privdata)
3504 3504
 		struct sockaddr_in reply;
3505 3505
 		unsigned short p;
3506 3506
 		char buf[64];
3507
+		struct session *session;
3507 3508
 
3508 3509
 #ifndef	SESSION
3509 3510
 		assert(privdata->cmdSocket == -1);
... ...
@@ -3565,15 +3579,45 @@ connect2clamd(struct privdata *privdata)
3565 3565
 		}
3566 3566
 
3567 3567
 #ifdef	SESSION
3568
+		if(serverIPs[freeServer] == inet_addr("127.0.0.1")) {
3569
+			const char *dir;
3570
+
3571
+			if((dir = getenv("TMPDIR")) == (char *)NULL)
3572
+				if((dir = getenv("TMP")) == (char *)NULL)
3573
+					if((dir = getenv("TEMP")) == (char *)NULL)
3574
+#ifdef	P_tmpdir
3575
+						dir = P_tmpdir;
3576
+#else
3577
+						dir = "/tmp";
3578
+#endif
3579
+
3580
+			privdata->filename = cli_gentemp(dir);
3581
+			if(privdata->filename) {
3582
+				cli_dbgmsg("connect2clamd(%d): creating %s\n", freeServer, privdata->filename);
3583
+#ifdef	O_TEXT
3584
+				privdata->dataSocket = open(privdata->filename, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_TEXT, 0600);
3585
+#else
3586
+				privdata->dataSocket = open(privdata->filename, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600);
3587
+#endif
3588
+				if(privdata->dataSocket < 0) {
3589
+					perror(privdata->filename);
3590
+					free(privdata->filename);
3591
+					privdata->filename = NULL;
3592
+				} else
3593
+					/* FIXME:!!!!!!!!!!!!!!!!!*/
3594
+					goto end;
3595
+			}
3596
+		}
3568 3597
 		cli_dbgmsg("connect2clamd(%d): STREAM\n", freeServer);
3569 3598
 
3570
-		if(send(cmdSockets[freeServer], "STREAM\n", 7, 0) < 7) {
3599
+		session = &sessions[freeServer];
3600
+		if(send(session->sock, "STREAM\n", 7, 0) < 7) {
3571 3601
 			perror("send");
3572 3602
 			pthread_mutex_lock(&sstatus_mutex);
3573
-			cmdSocketsStatus[privdata->serverNumber] = CMDSOCKET_DOWN;
3603
+			session->status = CMDSOCKET_DOWN;
3574 3604
 			pthread_mutex_unlock(&sstatus_mutex);
3575 3605
 			cli_warnmsg("Failed sending stream to server %d (fd %d) errno %d\n",
3576
-				freeServer, cmdSockets[freeServer], errno);
3606
+				freeServer, session->sock, errno);
3577 3607
 			if(use_syslog)
3578 3608
 				syslog(LOG_ERR, _("send failed to clamd"));
3579 3609
 			return 0;
... ...
@@ -3601,13 +3645,13 @@ connect2clamd(struct privdata *privdata)
3601 3601
 		shutdown(privdata->dataSocket, SHUT_RD);
3602 3602
 
3603 3603
 #ifdef	SESSION
3604
-		nbytes = clamd_recv(cmdSockets[privdata->serverNumber], buf, sizeof(buf));
3604
+		nbytes = clamd_recv(session->sock, buf, sizeof(buf));
3605 3605
 		if(nbytes < 0) {
3606 3606
 			perror("recv");
3607 3607
 			if(use_syslog)
3608 3608
 				syslog(LOG_ERR, _("recv failed from clamd getting PORT"));
3609 3609
 			pthread_mutex_lock(&sstatus_mutex);
3610
-			cmdSocketsStatus[privdata->serverNumber] = CMDSOCKET_DOWN;
3610
+			session->status = CMDSOCKET_DOWN;
3611 3611
 			pthread_mutex_unlock(&sstatus_mutex);
3612 3612
 			return 0;
3613 3613
 		}
... ...
@@ -3634,7 +3678,7 @@ connect2clamd(struct privdata *privdata)
3634 3634
 					buf);
3635 3635
 #ifdef	SESSION
3636 3636
 			pthread_mutex_lock(&sstatus_mutex);
3637
-			cmdSocketsStatus[privdata->serverNumber] = CMDSOCKET_DOWN;
3637
+			session->status = CMDSOCKET_DOWN;
3638 3638
 			pthread_mutex_unlock(&sstatus_mutex);
3639 3639
 #endif
3640 3640
 			return 0;
... ...
@@ -3669,13 +3713,15 @@ connect2clamd(struct privdata *privdata)
3669 3669
 			}
3670 3670
 #ifdef	SESSION
3671 3671
 			pthread_mutex_lock(&sstatus_mutex);
3672
-			cmdSocketsStatus[privdata->serverNumber] = CMDSOCKET_DOWN;
3672
+			session->status = CMDSOCKET_DOWN;
3673 3673
 			pthread_mutex_unlock(&sstatus_mutex);
3674 3674
 #endif
3675 3675
 			return 0;
3676 3676
 		}
3677 3677
 	}
3678 3678
 
3679
+end:
3680
+
3679 3681
 	/*
3680 3682
 	 * Combine the To and From into one clamfi_send to save bandwidth
3681 3683
 	 * when sending using TCP/IP to connect to a remote clamd, by band
... ...
@@ -4082,12 +4128,13 @@ watchdog(void *a)
4082 4082
 {
4083 4083
 	static pthread_mutex_t watchdog_mutex = PTHREAD_MUTEX_INITIALIZER;
4084 4084
 
4085
-	assert(cmdSockets != NULL);
4085
+	assert(sessions != NULL);
4086 4086
 
4087 4087
 	while(!quitting) {
4088 4088
 		int i;
4089 4089
 		struct timespec ts;
4090 4090
 		struct timeval tp;
4091
+		struct session *session;
4091 4092
 
4092 4093
 		gettimeofday(&tp, NULL);
4093 4094
 
... ...
@@ -4110,9 +4157,11 @@ watchdog(void *a)
4110 4110
 		cli_dbgmsg("watchdog wakes\n");
4111 4111
 		pthread_mutex_unlock(&watchdog_mutex);
4112 4112
 
4113
+		i = 0;
4114
+		session = sessions;
4113 4115
 		pthread_mutex_lock(&sstatus_mutex);
4114
-		for(i = 0; i < max_children; i++) {
4115
-			const int sock = cmdSockets[i];
4116
+		for(; i < max_children; i++, session++) {
4117
+			const int sock = session->sock;
4116 4118
 
4117 4119
 			/*
4118 4120
 			 * Check all free sessions are still usable
... ...
@@ -4123,13 +4172,13 @@ watchdog(void *a)
4123 4123
 			 * that doesn't really matter)
4124 4124
 			 */
4125 4125
 			cli_dbgmsg("watchdog: check server %d\n", i);
4126
-			if((n_children == 0) && (cmdSocketsStatus[i] == CMDSOCKET_FREE)) {
4126
+			if((n_children == 0) && (session->status == CMDSOCKET_FREE)) {
4127 4127
 				if(send(sock, "VERSION\n", 8, 0) == 8) {
4128 4128
 					char buf[81];
4129 4129
 					const int nbytes = clamd_recv(sock, buf, sizeof(buf) - 1);
4130 4130
 
4131 4131
 					if(nbytes <= 0)
4132
-						cmdSocketsStatus[i] = CMDSOCKET_DOWN;
4132
+						session->status = CMDSOCKET_DOWN;
4133 4133
 					else {
4134 4134
 						buf[nbytes] = '\0';
4135 4135
 						if(strncmp(buf, "ClamAV ", 7) == 0) {
... ...
@@ -4145,21 +4194,21 @@ watchdog(void *a)
4145 4145
 							}
4146 4146
 						} else {
4147 4147
 							cli_warnmsg("watchdog: expected \"ClamAV\", got \"%s\"\n", buf);
4148
-							cmdSocketsStatus[i] = CMDSOCKET_DOWN;
4148
+							session->status = CMDSOCKET_DOWN;
4149 4149
 						}
4150 4150
 					}
4151 4151
 				} else {
4152 4152
 					perror("send");
4153
-					cmdSocketsStatus[i] = CMDSOCKET_DOWN;
4153
+					session->status = CMDSOCKET_DOWN;
4154 4154
 				}
4155 4155
 
4156
-				if(cmdSocketsStatus[i] == CMDSOCKET_DOWN)
4156
+				if(session->status == CMDSOCKET_DOWN)
4157 4157
 					cli_warnmsg("Session %d has gone down\n", i);
4158 4158
 			}
4159 4159
 			/*
4160 4160
 			 * Reset all all dead sessions
4161 4161
 			 */
4162
-			if(cmdSocketsStatus[i] == CMDSOCKET_DOWN) {
4162
+			if(session->status == CMDSOCKET_DOWN) {
4163 4163
 				/*
4164 4164
 				 * The END command probably won't get through,
4165 4165
 				 * but let's give it a go anyway
... ...
@@ -4171,13 +4220,13 @@ watchdog(void *a)
4171 4171
 
4172 4172
 				cli_dbgmsg("Trying to restart session %d\n", i);
4173 4173
 				if(createSession(i) == 0) {
4174
-					cmdSocketsStatus[i] = CMDSOCKET_FREE;
4174
+					session->status = CMDSOCKET_FREE;
4175 4175
 					cli_warnmsg("Session %d restarted OK\n", i);
4176 4176
 				}
4177 4177
 			}
4178 4178
 		}
4179 4179
 		for(i = 0; i < max_children; i++)
4180
-			if(cmdSocketsStatus[i] != CMDSOCKET_DOWN)
4180
+			if(sessions[i].status != CMDSOCKET_DOWN)
4181 4181
 				break;
4182 4182
 
4183 4183
 		if(i == max_children)
... ...
@@ -4278,16 +4327,17 @@ quit(void)
4278 4278
 
4279 4279
 #ifdef	SESSION
4280 4280
 	int i;
4281
+	struct session *session;
4281 4282
 
4282 4283
 	quitting++;
4283 4284
 
4284 4285
 	if(use_syslog)
4285 4286
 		syslog(LOG_INFO, _("Stopping %s"), clamav_version);
4286 4287
 
4288
+	i = 0;
4289
+	session = sessions;
4287 4290
 	pthread_mutex_lock(&sstatus_mutex);
4288
-	for(i = 0; i < ((localSocket != NULL) ? 1 : max_children); i++) {
4289
-		const int sock = cmdSockets[i];
4290
-
4291
+	for(; i < ((localSocket != NULL) ? 1 : max_children); i++) {
4291 4292
 		/*
4292 4293
 		 * Check all free sessions are still usable
4293 4294
 		 * This could take some time with many free
... ...
@@ -4297,10 +4347,12 @@ quit(void)
4297 4297
 		 * that doesn't really matter)
4298 4298
 		 */
4299 4299
 		cli_dbgmsg("quit: close server %d\n", i);
4300
-		if(cmdSocketsStatus[i] == CMDSOCKET_FREE) {
4300
+		if(session->status == CMDSOCKET_FREE) {
4301
+			const int sock = session->sock;
4302
+
4301 4303
 			send(sock, "END\n", 4, 0);
4302 4304
 			shutdown(sock, SHUT_WR);
4303
-			cmdSocketsStatus[i] = CMDSOCKET_DOWN;
4305
+			session->status = CMDSOCKET_DOWN;
4304 4306
 			pthread_mutex_unlock(&sstatus_mutex);
4305 4307
 			close(sock);
4306 4308
 			pthread_mutex_lock(&sstatus_mutex);
... ...
@@ -8,7 +8,7 @@ msgid ""
8 8
 msgstr ""
9 9
 "Project-Id-Version: PACKAGE VERSION\n"
10 10
 "Report-Msgid-Bugs-To: bugs@clamav.net\n"
11
-"POT-Creation-Date: 2004-11-04 08:15+0000\n"
11
+"POT-Creation-Date: 2004-11-14 15:18+0000\n"
12 12
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 13
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 14
 "Language-Team: LANGUAGE <LL@li.org>\n"
... ...
@@ -16,581 +16,581 @@ msgstr ""
16 16
 "Content-Type: text/plain; charset=CHARSET\n"
17 17
 "Content-Transfer-Encoding: 8bit\n"
18 18
 
19
-#: clamav-milter.c:819
19
+#: clamav-milter.c:847
20 20
 msgid "\t--advisory\t\t-A\tFlag viruses rather than deleting them."
21 21
 msgstr ""
22 22
 
23
-#: clamav-milter.c:820
23
+#: clamav-milter.c:848
24 24
 msgid "\t--bounce\t\t-b\tSend a failure message to the sender."
25 25
 msgstr ""
26 26
 
27
-#: clamav-milter.c:821
27
+#: clamav-milter.c:849
28 28
 msgid ""
29 29
 "\t--broadcast\t\t-B [IFACE]\tBroadcast to a network manager when a virus is "
30 30
 "found."
31 31
 msgstr ""
32 32
 
33
-#: clamav-milter.c:822
33
+#: clamav-milter.c:850
34 34
 msgid "\t--config-file=FILE\t-c FILE\tRead configuration from FILE."
35 35
 msgstr ""
36 36
 
37
-#: clamav-milter.c:823
37
+#: clamav-milter.c:851
38 38
 msgid "\t--debug\t\t\t-D\tPrint debug messages."
39 39
 msgstr ""
40 40
 
41
-#: clamav-milter.c:824
41
+#: clamav-milter.c:852
42 42
 msgid ""
43 43
 "\t--dont-log-clean\t-C\tDon't add an entry to syslog that a mail is clean."
44 44
 msgstr ""
45 45
 
46
-#: clamav-milter.c:825
46
+#: clamav-milter.c:853
47 47
 msgid ""
48 48
 "\t--dont-scan-on-error\t-d\tPass e-mails through unscanned if a system error "
49 49
 "occurs."
50 50
 msgstr ""
51 51
 
52
-#: clamav-milter.c:826
52
+#: clamav-milter.c:854
53 53
 msgid "\t--dont-wait\t\t\tAsk remote end to resend if max-children exceeded."
54 54
 msgstr ""
55 55
 
56
-#: clamav-milter.c:827
56
+#: clamav-milter.c:855
57 57
 msgid "\t--from=EMAIL\t\t-a EMAIL\tError messages come from here."
58 58
 msgstr ""
59 59
 
60
-#: clamav-milter.c:828
60
+#: clamav-milter.c:856
61 61
 msgid "\t--force-scan\t\t-f\tForce scan all messages (overrides (-o and -l)."
62 62
 msgstr ""
63 63
 
64
-#: clamav-milter.c:829
64
+#: clamav-milter.c:857
65 65
 msgid "\t--help\t\t\t-h\tThis message."
66 66
 msgstr ""
67 67
 
68
-#: clamav-milter.c:830
68
+#: clamav-milter.c:858
69 69
 msgid "\t--headers\t\t-H\tInclude original message headers in the report."
70 70
 msgstr ""
71 71
 
72
-#: clamav-milter.c:831
72
+#: clamav-milter.c:859
73 73
 msgid "\t--local\t\t\t-l\tScan messages sent from machines on our LAN."
74 74
 msgstr ""
75 75
 
76
-#: clamav-milter.c:832
76
+#: clamav-milter.c:860
77 77
 msgid "\t--max-childen\t\t-m\tMaximum number of concurrent scans."
78 78
 msgstr ""
79 79
 
80
-#: clamav-milter.c:833
80
+#: clamav-milter.c:861
81 81
 msgid "\t--outgoing\t\t-o\tScan outgoing messages from this machine."
82 82
 msgstr ""
83 83
 
84
-#: clamav-milter.c:834
84
+#: clamav-milter.c:862
85 85
 msgid "\t--noreject\t\t-N\tDon't reject viruses, silently throw them away."
86 86
 msgstr ""
87 87
 
88
-#: clamav-milter.c:835
88
+#: clamav-milter.c:863
89 89
 msgid "\t--noxheader\t\t-n\tSuppress X-Virus-Scanned/X-Virus-Status headers."
90 90
 msgstr ""
91 91
 
92
-#: clamav-milter.c:836
92
+#: clamav-milter.c:864
93 93
 msgid "\t--pidfile=FILE\t\t-i FILE\tLocation of pidfile."
94 94
 msgstr ""
95 95
 
96
-#: clamav-milter.c:837
96
+#: clamav-milter.c:865
97 97
 msgid "\t--postmaster\t\t-p EMAIL\tPostmaster address [default=postmaster]."
98 98
 msgstr ""
99 99
 
100
-#: clamav-milter.c:838
100
+#: clamav-milter.c:866
101 101
 msgid "\t--postmaster-only\t-P\tSend warnings only to the postmaster."
102 102
 msgstr ""
103 103
 
104
-#: clamav-milter.c:839
104
+#: clamav-milter.c:867
105 105
 msgid "\t--quiet\t\t\t-q\tDon't send e-mail notifications of interceptions."
106 106
 msgstr ""
107 107
 
108
-#: clamav-milter.c:840
108
+#: clamav-milter.c:868
109 109
 msgid "\t--quarantine=USER\t-Q EMAIL\tQuanrantine e-mail account."
110 110
 msgstr ""
111 111
 
112
-#: clamav-milter.c:841
112
+#: clamav-milter.c:869
113 113
 msgid "\t--quarantine-dir=DIR\t-U DIR\tDirectory to store infected emails."
114 114
 msgstr ""
115 115
 
116
-#: clamav-milter.c:842
116
+#: clamav-milter.c:870
117 117
 msgid ""
118 118
 "\t--server=SERVER\t\t-s SERVER\tHostname/IP address of server(s) running "
119 119
 "clamd (when using TCPsocket)."
120 120
 msgstr ""
121 121
 
122
-#: clamav-milter.c:843
122
+#: clamav-milter.c:871
123 123
 msgid "\t--sign\t\t\t-S\tAdd a hard-coded signature to each scanned message."
124 124
 msgstr ""
125 125
 
126
-#: clamav-milter.c:844
126
+#: clamav-milter.c:872
127 127
 msgid "\t--signature-file=FILE\t-F FILE\tLocation of signature file."
128 128
 msgstr ""
129 129
 
130
-#: clamav-milter.c:845
130
+#: clamav-milter.c:873
131 131
 msgid "\t--template-file=FILE\t-t FILE\tLocation of e-mail template file."
132 132
 msgstr ""
133 133
 
134
-#: clamav-milter.c:846
134
+#: clamav-milter.c:874
135 135
 msgid "\t--timeout=SECS\t\t-T SECS\tTimeout waiting to childen to die."
136 136
 msgstr ""
137 137
 
138
-#: clamav-milter.c:847
138
+#: clamav-milter.c:875
139 139
 msgid "\t--version\t\t-V\tPrint the version number of this software."
140 140
 msgstr ""
141 141
 
142
-#: clamav-milter.c:849
142
+#: clamav-milter.c:877
143 143
 msgid "\t--debug-level=n\t\t-x n\tSets the debug level to 'n'."
144 144
 msgstr ""
145 145
 
146
-#: clamav-milter.c:851
146
+#: clamav-milter.c:879
147 147
 msgid ""
148 148
 "\n"
149 149
 "For more information type \"man clamav-milter\"."
150 150
 msgstr ""
151 151
 
152
-#: clamav-milter.c:852
152
+#: clamav-milter.c:880
153 153
 msgid "Report bugs to bugs@clamav.net."
154 154
 msgstr ""
155 155
 
156
-#: clamav-milter.c:1133
156
+#: clamav-milter.c:1161
157 157
 #, c-format
158 158
 msgid "%s: No socket-addr given\n"
159 159
 msgstr ""
160 160
 
161
-#: clamav-milter.c:1142
161
+#: clamav-milter.c:1170
162 162
 #, c-format
163 163
 msgid "%s: Can't parse the config file %s\n"
164 164
 msgstr ""
165 165
 
166
-#: clamav-milter.c:1181
166
+#: clamav-milter.c:1209
167 167
 #, c-format
168 168
 msgid ""
169 169
 "%s: The iface option to --broadcast is not supported on your operating "
170 170
 "system\n"
171 171
 msgstr ""
172 172
 
173
-#: clamav-milter.c:1187
173
+#: clamav-milter.c:1215
174 174
 #, c-format
175 175
 msgid "%s: Can't get information about user %s\n"
176 176
 msgstr ""
177 177
 
178
-#: clamav-milter.c:1198
178
+#: clamav-milter.c:1226
179 179
 #, c-format
180 180
 msgid "%s: AllowSupplementaryGroups: initgroups not supported.\n"
181 181
 msgstr ""
182 182
 
183
-#: clamav-milter.c:1215
183
+#: clamav-milter.c:1243
184 184
 #, c-format
185 185
 msgid "Running as user %s (UID %d, GID %d)\n"
186 186
 msgstr ""
187 187
 
188
-#: clamav-milter.c:1218
188
+#: clamav-milter.c:1246
189 189
 #, c-format
190 190
 msgid "%s: running as root is not recommended (check \"User\" in clamd.conf)\n"
191 191
 msgstr ""
192 192
 
193
-#: clamav-milter.c:1220
193
+#: clamav-milter.c:1248
194 194
 #, c-format
195 195
 msgid "%s: Only root can set an interface for --broadcast\n"
196 196
 msgstr ""
197 197
 
198
-#: clamav-milter.c:1225
198
+#: clamav-milter.c:1253
199 199
 #, c-format
200 200
 msgid "%s: Advisory mode doesn't work with quarantine mode\n"
201 201
 msgstr ""
202 202
 
203
-#: clamav-milter.c:1232
203
+#: clamav-milter.c:1260
204 204
 #, c-format
205 205
 msgid "%s: Advisory mode doesn't work with quarantine directories\n"
206 206
 msgstr ""
207 207
 
208
-#: clamav-milter.c:1248
208
+#: clamav-milter.c:1276
209 209
 #, c-format
210 210
 msgid "%s: insecure quarantine directory %s (mode 0%o)\n"
211 211
 msgstr ""
212 212
 
213
-#: clamav-milter.c:1274
213
+#: clamav-milter.c:1302
214 214
 #, c-format
215 215
 msgid "%s: ReadTimeout must not be negative in %s\n"
216 216
 msgstr ""
217 217
 
218
-#: clamav-milter.c:1281
218
+#: clamav-milter.c:1309
219 219
 #, c-format
220 220
 msgid "%s: StreamMaxLength must not be negative in %s\n"
221 221
 msgstr ""
222 222
 
223
-#: clamav-milter.c:1297
223
+#: clamav-milter.c:1325
224 224
 #, c-format
225 225
 msgid "%s: You can select one server type only (local/TCP) in %s\n"
226 226
 msgstr ""
227 227
 
228
-#: clamav-milter.c:1307
228
+#: clamav-milter.c:1335
229 229
 #, c-format
230 230
 msgid "The connection from sendmail to %s (%s) must not\n"
231 231
 msgstr ""
232 232
 
233
-#: clamav-milter.c:1309
233
+#: clamav-milter.c:1337
234 234
 #, c-format
235 235
 msgid "be the same as the connection to clamd (%s) in %s\n"
236 236
 msgstr ""
237 237
 
238
-#: clamav-milter.c:1319 clamav-milter.c:1342
238
+#: clamav-milter.c:1347 clamav-milter.c:1370
239 239
 #, c-format
240 240
 msgid "Can't talk to clamd server via %s\n"
241 241
 msgstr ""
242 242
 
243
-#: clamav-milter.c:1321 clamav-milter.c:1344
243
+#: clamav-milter.c:1349 clamav-milter.c:1372
244 244
 #, c-format
245 245
 msgid "Check your entry for LocalSocket in %s\n"
246 246
 msgstr ""
247 247
 
248
-#: clamav-milter.c:1355
248
+#: clamav-milter.c:1383
249 249
 msgid "Can't create a clamd session"
250 250
 msgstr ""
251 251
 
252
-#: clamav-milter.c:1371
252
+#: clamav-milter.c:1400
253 253
 #, c-format
254 254
 msgid ""
255 255
 "%s: --quarantine-dir not supported for remote scanning - use --quarantine\n"
256 256
 msgstr ""
257 257
 
258
-#: clamav-milter.c:1386
258
+#: clamav-milter.c:1415
259 259
 #, c-format
260 260
 msgid "%s: hostname %s is longer than %d characters\n"
261 261
 msgstr ""
262 262
 
263
-#: clamav-milter.c:1405
263
+#: clamav-milter.c:1434
264 264
 #, c-format
265
-msgid "%s: --max_children must be given in sessions mode\n"
265
+msgid "%s: --max-children must be given in sessions mode\n"
266 266
 msgstr ""
267 267
 
268
-#: clamav-milter.c:1428
268
+#: clamav-milter.c:1457
269 269
 #, c-format
270 270
 msgid "%s: Unknown host %s\n"
271 271
 msgstr ""
272 272
 
273
-#: clamav-milter.c:1440
273
+#: clamav-milter.c:1469
274 274
 #, c-format
275 275
 msgid "Can't talk to clamd server %s on port %d\n"
276 276
 msgstr ""
277 277
 
278
-#: clamav-milter.c:1458
278
+#: clamav-milter.c:1486
279 279
 msgid "Can't find any active clamd servers\n"
280 280
 msgstr ""
281 281
 
282
-#: clamav-milter.c:1459 clamav-milter.c:1465
282
+#: clamav-milter.c:1487 clamav-milter.c:1493
283 283
 #, c-format
284 284
 msgid "Check your entry for TCPSocket in %s\n"
285 285
 msgstr ""
286 286
 
287
-#: clamav-milter.c:1464
287
+#: clamav-milter.c:1492
288 288
 msgid "Can't find any clamd servers\n"
289 289
 msgstr ""
290 290
 
291
-#: clamav-milter.c:1471
291
+#: clamav-milter.c:1499
292 292
 #, c-format
293 293
 msgid "%s: You must select server type (local/TCP) in %s\n"
294 294
 msgstr ""
295 295
 
296
-#: clamav-milter.c:1490
296
+#: clamav-milter.c:1541
297 297
 #, c-format
298 298
 msgid "When debugging it is recommended that you use Foreground mode in %s\n"
299 299
 msgstr ""
300 300
 
301
-#: clamav-milter.c:1491
301
+#: clamav-milter.c:1542
302 302
 msgid "So that you can see all of the messages"
303 303
 msgstr ""
304 304
 
305
-#: clamav-milter.c:1552
305
+#: clamav-milter.c:1605
306 306
 #, c-format
307 307
 msgid "Starting: %s"
308 308
 msgstr ""
309 309
 
310
-#: clamav-milter.c:1557
310
+#: clamav-milter.c:1610
311 311
 msgid "Debugging is on"
312 312
 msgstr ""
313 313
 
314
-#: clamav-milter.c:1561
314
+#: clamav-milter.c:1614
315 315
 #, c-format
316 316
 msgid ""
317 317
 "%s: (-q && !LogSyslog): warning - all interception message methods are off\n"
318 318
 msgstr ""
319 319
 
320
-#: clamav-milter.c:1565
320
+#: clamav-milter.c:1618
321 321
 msgid "Starting clamav-milter"
322 322
 msgstr ""
323 323
 
324
-#: clamav-milter.c:1574
324
+#: clamav-milter.c:1627
325 325
 #, c-format
326 326
 msgid "Can't save PID in file %s"
327 327
 msgstr ""
328 328
 
329
-#: clamav-milter.c:1576
329
+#: clamav-milter.c:1629
330 330
 #, c-format
331 331
 msgid "Can't save PID in file %s\n"
332 332
 msgstr ""
333 333
 
334
-#: clamav-milter.c:1604
334
+#: clamav-milter.c:1657
335 335
 #, c-format
336 336
 msgid "%s: smfi_setconn failed\n"
337 337
 msgstr ""
338 338
 
339
-#: clamav-milter.c:1617
339
+#: clamav-milter.c:1670
340 340
 #, c-format
341 341
 msgid "Started: %s"
342 342
 msgstr ""
343 343
 
344
-#: clamav-milter.c:1666 clamav-milter.c:1907
344
+#: clamav-milter.c:1720 clamav-milter.c:1964
345 345
 #, c-format
346 346
 msgid "Check clamd server %s - it may be down\n"
347 347
 msgstr ""
348 348
 
349
-#: clamav-milter.c:1671 clamav-milter.c:1916
349
+#: clamav-milter.c:1725 clamav-milter.c:1973
350 350
 msgid "Check clamd server - it may be down\n"
351 351
 msgstr ""
352 352
 
353
-#: clamav-milter.c:1833
353
+#: clamav-milter.c:1890
354 354
 msgid "No free clamd sessions\n"
355 355
 msgstr ""
356 356
 
357
-#: clamav-milter.c:1910
357
+#: clamav-milter.c:1967
358 358
 #, c-format
359 359
 msgid "Check clamd server %s - it may be down"
360 360
 msgstr ""
361 361
 
362
-#: clamav-milter.c:1952
362
+#: clamav-milter.c:2009
363 363
 msgid "findServer: select failed"
364 364
 msgstr ""
365 365
 
366
-#: clamav-milter.c:1961
366
+#: clamav-milter.c:2018
367 367
 #, c-format
368 368
 msgid "findServer: using server %d\n"
369 369
 msgstr ""
370 370
 
371
-#: clamav-milter.c:1966
371
+#: clamav-milter.c:2023
372 372
 msgid "findServer: No response from any server\n"
373 373
 msgstr ""
374 374
 
375
-#: clamav-milter.c:1968
375
+#: clamav-milter.c:2025
376 376
 msgid "findServer: No response from any server"
377 377
 msgstr ""
378 378
 
379
-#: clamav-milter.c:1989
379
+#: clamav-milter.c:2046
380 380
 msgid "clamfi_connect: ctx is null"
381 381
 msgstr ""
382 382
 
383
-#: clamav-milter.c:1994
383
+#: clamav-milter.c:2051
384 384
 msgid "clamfi_connect: hostname is null"
385 385
 msgstr ""
386 386
 
387
-#: clamav-milter.c:2015
387
+#: clamav-milter.c:2072
388 388
 msgid "clamfi_connect: remoteIP is null"
389 389
 msgstr ""
390 390
 
391
-#: clamav-milter.c:2023
391
+#: clamav-milter.c:2080
392 392
 #, c-format
393 393
 msgid "clamfi_connect: connection from %s [%s]"
394 394
 msgstr ""
395 395
 
396
-#: clamav-milter.c:2024
396
+#: clamav-milter.c:2081
397 397
 #, c-format
398 398
 msgid "clamfi_connect: connection from %s [%s]\n"
399 399
 msgstr ""
400 400
 
401
-#: clamav-milter.c:2043
401
+#: clamav-milter.c:2100
402 402
 msgid "Can't get sendmail hostname"
403 403
 msgstr ""
404 404
 
405
-#: clamav-milter.c:2048
405
+#: clamav-milter.c:2105
406 406
 #, c-format
407 407
 msgid "Access Denied: Host Unknown (%s)"
408 408
 msgstr ""
409 409
 
410
-#: clamav-milter.c:2058
410
+#: clamav-milter.c:2115
411 411
 #, c-format
412 412
 msgid "Access Denied: Can't get IP address for (%s)"
413 413
 msgstr ""
414 414
 
415
-#: clamav-milter.c:2075
415
+#: clamav-milter.c:2132
416 416
 #, c-format
417 417
 msgid "Access Denied for %s[%s]"
418 418
 msgstr ""
419 419
 
420
-#: clamav-milter.c:2093
420
+#: clamav-milter.c:2150
421 421
 msgid "clamfi_connect: not scanning outgoing messages"
422 422
 msgstr ""
423 423
 
424
-#: clamav-milter.c:2094
424
+#: clamav-milter.c:2151
425 425
 msgid "clamfi_connect: not scanning outgoing messages\n"
426 426
 msgstr ""
427 427
 
428
-#: clamav-milter.c:2102
428
+#: clamav-milter.c:2159
429 429
 msgid "clamfi_connect: not scanning local messages"
430 430
 msgstr ""
431 431
 
432
-#: clamav-milter.c:2103
432
+#: clamav-milter.c:2160
433 433
 msgid "clamfi_connect: not scanning local messages\n"
434 434
 msgstr ""
435 435
 
436
-#: clamav-milter.c:2137
436
+#: clamav-milter.c:2194
437 437
 #, c-format
438 438
 msgid "hit max-children limit (%u >= %u)\n"
439 439
 msgstr ""
440 440
 
441
-#: clamav-milter.c:2138
441
+#: clamav-milter.c:2195
442 442
 #, c-format
443 443
 msgid "hit max-children limit (%u >= %u): waiting for some to exit\n"
444 444
 msgstr ""
445 445
 
446
-#: clamav-milter.c:2144
446
+#: clamav-milter.c:2201
447 447
 #, c-format
448 448
 msgid "hit max-children limit (%u >= %u)"
449 449
 msgstr ""
450 450
 
451
-#: clamav-milter.c:2145
451
+#: clamav-milter.c:2202
452 452
 #, c-format
453 453
 msgid "hit max-children limit (%u >= %u): waiting for some to exit"
454 454
 msgstr ""
455 455
 
456
-#: clamav-milter.c:2150
456
+#: clamav-milter.c:2207
457 457
 msgid "AV system temporarily overloaded - please try later"
458 458
 msgstr ""
459 459
 
460
-#: clamav-milter.c:2180
460
+#: clamav-milter.c:2237
461 461
 #, c-format
462 462
 msgid ">n_children = %d\n"
463 463
 msgstr ""
464 464
 
465
-#: clamav-milter.c:2186
465
+#: clamav-milter.c:2243
466 466
 msgid "Timeout waiting for a child to die"
467 467
 msgstr ""
468 468
 
469
-#: clamav-milter.c:2188
469
+#: clamav-milter.c:2245
470 470
 msgid "Timeout waiting for a child to die\n"
471 471
 msgstr ""
472 472
 
473
-#: clamav-milter.c:2320
473
+#: clamav-milter.c:2377
474 474
 msgid "clamfi_eoh"
475 475
 msgstr ""
476 476
 
477
-#: clamav-milter.c:2323
477
+#: clamav-milter.c:2380
478 478
 msgid "clamfi_eoh\n"
479 479
 msgstr ""
480 480
 
481
-#: clamav-milter.c:2380
481
+#: clamav-milter.c:2437
482 482
 msgid "clamfi_eoh: ignoring whitelisted message"
483 483
 msgstr ""
484 484
 
485
-#: clamav-milter.c:2382
485
+#: clamav-milter.c:2439
486 486
 msgid "clamfi_eoh: not scanning outgoing messages\n"
487 487
 msgstr ""
488 488
 
489
-#: clamav-milter.c:2396
489
+#: clamav-milter.c:2453
490 490
 #, c-format
491 491
 msgid "clamfi_envbody: %u bytes"
492 492
 msgstr ""
493 493
 
494
-#: clamav-milter.c:2398
494
+#: clamav-milter.c:2455
495 495
 #, c-format
496 496
 msgid "clamfi_envbody: %u bytes\n"
497 497
 msgstr ""
498 498
 
499
-#: clamav-milter.c:2408 clamav-milter.c:2625
499
+#: clamav-milter.c:2465 clamav-milter.c:2693
500 500
 #, c-format
501 501
 msgid "%s: Message more than StreamMaxLength (%ld) bytes - not scanned"
502 502
 msgstr ""
503 503
 
504
-#: clamav-milter.c:2412 clamav-milter.c:2628
504
+#: clamav-milter.c:2469 clamav-milter.c:2696
505 505
 msgid "Not Scanned - StreamMaxLength exceeded"
506 506
 msgstr ""
507 507
 
508
-#: clamav-milter.c:2484 clamav-milter.c:2502 clamav-milter.c:3518
509
-#: clamav-milter.c:3525
508
+#: clamav-milter.c:2544 clamav-milter.c:2566 clamav-milter.c:3619
509
+#: clamav-milter.c:3626
510 510
 msgid "send failed to clamd"
511 511
 msgstr ""
512 512
 
513
-#: clamav-milter.c:2519
513
+#: clamav-milter.c:2587
514 514
 #, c-format
515 515
 msgid "clamfi_eom: read %s"
516 516
 msgstr ""
517 517
 
518
-#: clamav-milter.c:2520
518
+#: clamav-milter.c:2588
519 519
 #, c-format
520 520
 msgid "clamfi_eom: read %s\n"
521 521
 msgstr ""
522 522
 
523
-#: clamav-milter.c:2528
523
+#: clamav-milter.c:2596
524 524
 msgid "clamfi_eom: read nothing from clamd"
525 525
 msgstr ""
526 526
 
527
-#: clamav-milter.c:2530
527
+#: clamav-milter.c:2598
528 528
 msgid "clamfi_eom: read nothing from clamd\n"
529 529
 msgstr ""
530 530
 
531
-#: clamav-milter.c:2574 clamav-milter.c:2614
531
+#: clamav-milter.c:2642 clamav-milter.c:2682
532 532
 msgid "Error determining host"
533 533
 msgstr ""
534 534
 
535
-#: clamav-milter.c:2633
535
+#: clamav-milter.c:2701
536 536
 msgid "Not Scanned"
537 537
 msgstr ""
538 538
 
539
-#: clamav-milter.c:2644
539
+#: clamav-milter.c:2709
540 540
 msgid "Clean"
541 541
 msgstr ""
542 542
 
543
-#: clamav-milter.c:2648
543
+#: clamav-milter.c:2713
544 544
 #, c-format
545 545
 msgid "%s: clean message from %s"
546 546
 msgstr ""
547 547
 
548
-#: clamav-milter.c:2650
548
+#: clamav-milter.c:2715
549 549
 msgid "an unknown sender"
550 550
 msgstr ""
551 551
 
552
-#: clamav-milter.c:2684
552
+#: clamav-milter.c:2749
553 553
 msgid "Infected"
554 554
 msgstr ""
555 555
 
556
-#: clamav-milter.c:2702
556
+#: clamav-milter.c:2767
557 557
 #, c-format
558 558
 msgid "Intercepted virus from %s to"
559 559
 msgstr ""
560 560
 
561
-#: clamav-milter.c:2796
561
+#: clamav-milter.c:2861
562 562
 msgid ""
563 563
 "Subject: Virus intercepted\n"
564 564
 "\n"
565 565
 msgstr ""
566 566
 
567
-#: clamav-milter.c:2818
567
+#: clamav-milter.c:2883
568 568
 msgid "A message you sent to\n"
569 569
 msgstr ""
570 570
 
571
-#: clamav-milter.c:2825
571
+#: clamav-milter.c:2890
572 572
 #, c-format
573 573
 msgid "The message %1$s sent from %2$s to\n"
574 574
 msgstr ""
575 575
 
576
-#: clamav-milter.c:2828
576
+#: clamav-milter.c:2893
577 577
 #, c-format
578 578
 msgid "A message sent from %s to\n"
579 579
 msgstr ""
580 580
 
581
-#: clamav-milter.c:2833
581
+#: clamav-milter.c:2898
582 582
 #, c-format
583 583
 msgid "contained %s and has not been delivered.\n"
584 584
 msgstr ""
585 585
 
586
-#: clamav-milter.c:2837
586
+#: clamav-milter.c:2902
587 587
 #, c-format
588 588
 msgid ""
589 589
 "\n"
590 590
 "The message in question has been quarantined as %s\n"
591 591
 msgstr ""
592 592
 
593
-#: clamav-milter.c:2840
593
+#: clamav-milter.c:2905
594 594
 #, c-format
595 595
 msgid ""
596 596
 "\n"
... ...
@@ -598,13 +598,13 @@ msgid ""
598 598
 "\n"
599 599
 msgstr ""
600 600
 
601
-#: clamav-milter.c:2843
601
+#: clamav-milter.c:2908
602 602
 msgid ""
603 603
 "For your information, the original message headers were:\n"
604 604
 "\n"
605 605
 msgstr ""
606 606
 
607
-#: clamav-milter.c:2856
607
+#: clamav-milter.c:2921
608 608
 #, c-format
609 609
 msgid ""
610 610
 "\n"
... ...
@@ -612,180 +612,180 @@ msgid ""
612 612
 "%s\t\n"
613 613
 msgstr ""
614 614
 
615
-#: clamav-milter.c:2869
615
+#: clamav-milter.c:2932
616 616
 #, c-format
617 617
 msgid "Quarantined infected mail as %s"
618 618
 msgstr ""
619 619
 
620
-#: clamav-milter.c:2893
620
+#: clamav-milter.c:2956
621 621
 #, c-format
622 622
 msgid "Can't set quarantine user %s"
623 623
 msgstr ""
624 624
 
625
-#: clamav-milter.c:2895
625
+#: clamav-milter.c:2958
626 626
 #, c-format
627 627
 msgid "Can't set quarantine user %s\n"
628 628
 msgstr ""
629 629
 
630
-#: clamav-milter.c:2908
630
+#: clamav-milter.c:2971
631 631
 #, c-format
632 632
 msgid "virus %s detected by ClamAV - http://www.clamav.net"
633 633
 msgstr ""
634 634
 
635
-#: clamav-milter.c:2989
635
+#: clamav-milter.c:3055
636 636
 #, c-format
637 637
 msgid "Can't remove clean file %s"
638 638
 msgstr ""
639 639
 
640
-#: clamav-milter.c:3160 clamav-milter.c:3163
640
+#: clamav-milter.c:3227 clamav-milter.c:3230
641 641
 #, c-format
642 642
 msgid "write failure (%u bytes) to %s: %s"
643 643
 msgstr ""
644 644
 
645
-#: clamav-milter.c:3177 clamav-milter.c:3180
645
+#: clamav-milter.c:3244 clamav-milter.c:3247
646 646
 #, c-format
647 647
 msgid "write failure (%u bytes) to clamd: %s"
648 648
 msgstr ""
649 649
 
650
-#: clamav-milter.c:3246
650
+#: clamav-milter.c:3313
651 651
 #, c-format
652 652
 msgid "No data received from clamd in %d seconds\n"
653 653
 msgstr ""
654 654
 
655
-#: clamav-milter.c:3268
655
+#: clamav-milter.c:3335
656 656
 #, c-format
657 657
 msgid "Can't stat %s"
658 658
 msgstr ""
659 659
 
660
-#: clamav-milter.c:3279 clamav-milter.c:3679
660
+#: clamav-milter.c:3346 clamav-milter.c:3782
661 661
 #, c-format
662 662
 msgid "Can't open %s"
663 663
 msgstr ""
664 664
 
665
-#: clamav-milter.c:3417
665
+#: clamav-milter.c:3485
666 666
 #, c-format
667 667
 msgid "mkdir %s failed"
668 668
 msgstr ""
669 669
 
670
-#: clamav-milter.c:3430
670
+#: clamav-milter.c:3498
671 671
 #, c-format
672 672
 msgid "mktemp %s failed"
673 673
 msgstr ""
674 674
 
675
-#: clamav-milter.c:3440
675
+#: clamav-milter.c:3508
676 676
 #, c-format
677 677
 msgid "Temporary quarantine file %s creation failed"
678 678
 msgstr ""
679 679
 
680
-#: clamav-milter.c:3537
680
+#: clamav-milter.c:3638
681 681
 msgid "failed to create TCPSocket to talk to clamd"
682 682
 msgstr ""
683 683
 
684
-#: clamav-milter.c:3548 clamav-milter.c:3559
684
+#: clamav-milter.c:3649 clamav-milter.c:3660
685 685
 msgid "recv failed from clamd getting PORT"
686 686
 msgstr ""
687 687
 
688
-#: clamav-milter.c:3570
688
+#: clamav-milter.c:3671
689 689
 #, c-format
690 690
 msgid "Expected port information from clamd, got '%s'"
691 691
 msgstr ""
692 692
 
693
-#: clamav-milter.c:3573
693
+#: clamav-milter.c:3674
694 694
 #, c-format
695 695
 msgid "Expected port information from clamd, got '%s'\n"
696 696
 msgstr ""
697 697
 
698
-#: clamav-milter.c:3593
698
+#: clamav-milter.c:3694
699 699
 #, c-format
700 700
 msgid "Connecting to local port %d\n"
701 701
 msgstr ""
702 702
 
703
-#: clamav-milter.c:3604 clamav-milter.c:3607
703
+#: clamav-milter.c:3705 clamav-milter.c:3708
704 704
 #, c-format
705 705
 msgid "Failed to connect to port %d given by clamd: %s"
706 706
 msgstr ""
707 707
 
708
-#: clamav-milter.c:3691
708
+#: clamav-milter.c:3794
709 709
 #, c-format
710 710
 msgid "Clamd (pid %d) seems to have died"
711 711
 msgstr ""
712 712
 
713
-#: clamav-milter.c:3717
713
+#: clamav-milter.c:3820
714 714
 #, c-format
715 715
 msgid "Can't open e-mail template file %s"
716 716
 msgstr ""
717 717
 
718
-#: clamav-milter.c:3726
718
+#: clamav-milter.c:3829
719 719
 #, c-format
720 720
 msgid "Can't stat e-mail template file %s"
721 721
 msgstr ""
722 722
 
723
-#: clamav-milter.c:3735
723
+#: clamav-milter.c:3838
724 724
 msgid "Out of memory"
725 725
 msgstr ""
726 726
 
727
-#: clamav-milter.c:3762
727
+#: clamav-milter.c:3865
728 728
 #, c-format
729 729
 msgid "%s: Unknown clamAV variable \"%c\"\n"
730 730
 msgstr ""
731 731
 
732
-#: clamav-milter.c:3773
732
+#: clamav-milter.c:3876
733 733
 #, c-format
734 734
 msgid "%s: Unterminated sendmail variable \"%s\"\n"
735 735
 msgstr ""
736 736
 
737
-#: clamav-milter.c:3784
737
+#: clamav-milter.c:3887
738 738
 #, c-format
739 739
 msgid "%s: Unknown sendmail variable \"%s\"\n"
740 740
 msgstr ""
741 741
 
742
-#: clamav-milter.c:3850
742
+#: clamav-milter.c:3953
743 743
 #, c-format
744 744
 msgid "Can't rename %1$s to %2$s"
745 745
 msgstr ""
746 746
 
747
-#: clamav-milter.c:3874
747
+#: clamav-milter.c:3977
748 748
 #, c-format
749 749
 msgid "[Virus] %s"
750 750
 msgstr ""
751 751
 
752
-#: clamav-milter.c:3967
752
+#: clamav-milter.c:4070
753 753
 msgid ""
754 754
 "No response from any clamd server - your AV system is not scanning emails\n"
755 755
 msgstr ""
756 756
 
757
-#: clamav-milter.c:3970
757
+#: clamav-milter.c:4073
758 758
 msgid ""
759 759
 "No response from any clamd server - your AV system is not scanning emails"
760 760
 msgstr ""
761 761
 
762
-#: clamav-milter.c:3988
762
+#: clamav-milter.c:4091
763 763
 msgid "Subject: ClamAV Down\n"
764 764
 msgstr ""
765 765
 
766
-#: clamav-milter.c:3991
766
+#: clamav-milter.c:4094
767 767
 msgid ""
768 768
 "This is an automatic message\n"
769 769
 "\n"
770 770
 msgstr ""
771 771
 
772
-#: clamav-milter.c:3994
772
+#: clamav-milter.c:4097
773 773
 msgid "The clamd program cannot be contacted.\n"
774 774
 msgstr ""
775 775
 
776
-#: clamav-milter.c:3996
776
+#: clamav-milter.c:4099
777 777
 msgid "No clamd server can be contacted.\n"
778 778
 msgstr ""
779 779
 
780
-#: clamav-milter.c:3998
780
+#: clamav-milter.c:4101
781 781
 msgid "Emails may not be being scanned, please check your servers.\n"
782 782
 msgstr ""
783 783
 
784
-#: clamav-milter.c:4221 clamav-milter.c:4250
784
+#: clamav-milter.c:4332 clamav-milter.c:4363
785 785
 #, c-format
786 786
 msgid "Stopping %s"
787 787
 msgstr ""
788 788
 
789
-#: clamav-milter.c:4252
789
+#: clamav-milter.c:4369
790 790
 msgid "Stopping clamav-milter"
791 791
 msgstr ""