Browse code

Added --internal

git-svn: trunk@1153

Nigel Horne authored on 2004/12/02 07:31:18
Showing 5 changed files
... ...
@@ -1,3 +1,8 @@
1
+Wed Dec  1 22:29:33 GMT 2004 (njh)
2
+----------------------------------
3
+  * clamav-milter:	Added --internal flag (some functionality to do)
4
+			SESSIONS: Don't hang when StreamMaxLength is hit
5
+
1 6
 Wed Dec  1 21:05:07 CET 2004 (tk)
2 7
 ---------------------------------
3 8
   * libclamav/scanners.c: improved recursion limits (thanks to Maxim Dounin)
... ...
@@ -566,6 +566,11 @@ Changes
566 566
 		Added validation for the reply from clamd
567 567
 		Include the sendmail ID in the quarantine file name, for easier
568 568
 			cross matching with the sendmail log file
569
+0.80u	1/12/04 SESSION: Don't hang when streammaxlength is reached - reset the
570
+			link
571
+		Not all previous X-Virus-Status headers were removed
572
+		Added the --internal flag
573
+			TODO: freshclam notification and version headers
569 574
 
570 575
 INTERNATIONALISATION
571 576
 
... ...
@@ -26,6 +26,9 @@
26 26
  *
27 27
  * Change History:
28 28
  * $Log: clamav-milter.c,v $
29
+ * Revision 1.155  2004/12/01 22:27:38  nigelhorne
30
+ * Added --internal
31
+ *
29 32
  * Revision 1.154  2004/11/20 23:02:23  nigelhorne
30 33
  * Validate error message from clamd
31 34
  *
... ...
@@ -473,9 +476,9 @@
473 473
  * Revision 1.6  2003/09/28 16:37:23  nigelhorne
474 474
  * Added -f flag use MaxThreads if --max-children not set
475 475
  */
476
-static	char	const	rcsid[] = "$Id: clamav-milter.c,v 1.154 2004/11/20 23:02:23 nigelhorne Exp $";
476
+static	char	const	rcsid[] = "$Id: clamav-milter.c,v 1.155 2004/12/01 22:27:38 nigelhorne Exp $";
477 477
 
478
-#define	CM_VERSION	"0.80t"
478
+#define	CM_VERSION	"0.80u"
479 479
 
480 480
 /*#define	CONFDIR	"/usr/local/etc"*/
481 481
 
... ...
@@ -644,6 +647,7 @@ struct	privdata {
644 644
 	u_char	*body;		/* body of the message if Sflag is set */
645 645
 	size_t	bodyLen;	/* number of bytes in body */
646 646
 	header_list_t headers;	/* Message headers */
647
+	int	statusCount;	/* number of X-Virus-Status headers */
647 648
 	long	numBytes;	/* Number of bytes sent so far */
648 649
 	char	*received;	/* keep track of received from */
649 650
 	const	char	*rejectCode;	/* 550 or 554? */
... ...
@@ -703,6 +707,11 @@ static	char	clamav_version[VERSION_LENGTH + 1];
703 703
 static	int	fflag = 0;	/* force a scan, whatever */
704 704
 static	int	oflag = 0;	/* scan messages from our machine? */
705 705
 static	int	lflag = 0;	/* scan messages from our site? */
706
+static	int	internal = 0;	/* scan messages ourself or use clamd? */
707
+static	struct	cl_node	*root = NULL;
708
+static	struct	cl_limits	limits;
709
+static	struct	cl_stat	dbstat;
710
+
706 711
 static	int	bflag = 0;	/*
707 712
 				 * send a failure (bounce) message to the
708 713
 				 * sender. This probably isn't a good idea
... ...
@@ -864,6 +873,7 @@ help(void)
864 864
 	puts(_("\t--force-scan\t\t-f\tForce scan all messages (overrides (-o and -l)."));
865 865
 	puts(_("\t--help\t\t\t-h\tThis message."));
866 866
 	puts(_("\t--headers\t\t-H\tInclude original message headers in the report."));
867
+	puts(_("\t--internal\t\t-I\tUse the internal scanner."));
867 868
 	puts(_("\t--local\t\t\t-l\tScan messages sent from machines on our LAN."));
868 869
 	puts(_("\t--max-childen\t\t-m\tMaximum number of concurrent scans."));
869 870
 	puts(_("\t--outgoing\t\t-o\tScan outgoing messages from this machine."));
... ...
@@ -895,7 +905,6 @@ main(int argc, char **argv)
895 895
 	int i, Bflag = 0;
896 896
 	const char *cfgfile = CL_DEFAULT_CFG;
897 897
 	struct cfgstruct *cpt;
898
-	struct passwd *user;
899 898
 	const char *pidfile = NULL;
900 899
 	char version[VERSION_LENGTH + 1];
901 900
 #ifdef	SESSION
... ...
@@ -987,6 +996,9 @@ main(int argc, char **argv)
987 987
 				"pidfile", 1, NULL, 'i'
988 988
 			},
989 989
 			{
990
+				"internal-scanner", 0, NULL, 'I'
991
+			},
992
+			{
990 993
 				"local", 0, NULL, 'l'
991 994
 			},
992 995
 			{
... ...
@@ -1095,6 +1107,11 @@ main(int argc, char **argv)
1095 1095
 			case 'i':	/* pidfile */
1096 1096
 				pidfile = optarg;
1097 1097
 				break;
1098
+			case 'I':	/* use clamav-milter's internal scanner */
1099
+				/* FIXME: error if --servers is given */
1100
+				/* TODO: support freshclam's daemon notify */
1101
+				internal++;
1102
+				break;
1098 1103
 			case 'l':	/* scan mail from the lan */
1099 1104
 				lflag++;
1100 1105
 				break;
... ...
@@ -1125,6 +1142,10 @@ main(int argc, char **argv)
1125 1125
 				smfilter.xxfi_flags |= SMFIF_CHGHDRS|SMFIF_ADDRCPT|SMFIF_DELRCPT;
1126 1126
 				break;
1127 1127
 			case 's':	/* server running clamd */
1128
+				if(internal) {
1129
+					fputs("--internal is not compatible with --server\n", stderr);
1130
+					return EX_USAGE;
1131
+				}
1128 1132
 				serverHostNames = optarg;
1129 1133
 				break;
1130 1134
 			case 'F':	/* signature file */
... ...
@@ -1157,9 +1178,9 @@ main(int argc, char **argv)
1157 1157
 #endif
1158 1158
 			default:
1159 1159
 #ifdef	CL_DEBUG
1160
-				fprintf(stderr, "Usage: %s [-b] [-c FILE] [-F FILE] [--max-children=num] [-l] [-o] [-p address] [-P] [-q] [-Q USER] [-s SERVER] [-S] [-x#] [-U PATH] socket-addr\n", argv[0]);
1160
+				fprintf(stderr, "Usage: %s [-b] [-c FILE] [-F FILE] [--max-children=num] [-l] [-I] [-o] [-p address] [-P] [-q] [-Q USER] [-s SERVER] [-S] [-x#] [-U PATH] socket-addr\n", argv[0]);
1161 1161
 #else
1162
-				fprintf(stderr, "Usage: %s [-b] [-c FILE] [-F FILE] [--max-children=num] [-l] [-o] [-p address] [-P] [-q] [-Q USER] [-s SERVER] [-S] [-U PATH] socket-addr\n", argv[0]);
1162
+				fprintf(stderr, "Usage: %s [-b] [-c FILE] [-F FILE] [--max-children=num] [-l] [-I] [-o] [-p address] [-P] [-q] [-Q USER] [-s SERVER] [-S] [-U PATH] socket-addr\n", argv[0]);
1163 1163
 #endif
1164 1164
 				return EX_USAGE;
1165 1165
 		}
... ...
@@ -1218,7 +1239,10 @@ main(int argc, char **argv)
1218 1218
 			return EX_CONFIG;
1219 1219
 #endif
1220 1220
 		}
1221
+		
1221 1222
 		if((cpt = cfgopt(copt, "User")) != NULL) {
1223
+			const struct passwd *user;
1224
+
1222 1225
 			if((user = getpwnam(cpt->strarg)) == NULL) {
1223 1226
 				fprintf(stderr, _("%s: Can't get information about user %s\n"), argv[0], cpt->strarg);
1224 1227
 				return EX_CONFIG;
... ...
@@ -1312,6 +1336,7 @@ main(int argc, char **argv)
1312 1312
 			return EX_CONFIG;
1313 1313
 		}
1314 1314
 	}
1315
+	
1315 1316
 	if((cpt = cfgopt(copt, "StreamMaxLength")) != NULL) {
1316 1317
 		if(cpt->numarg < 0) {
1317 1318
 			fprintf(stderr, _("%s: StreamMaxLength must not be negative in %s\n"),
... ...
@@ -1320,10 +1345,99 @@ main(int argc, char **argv)
1320 1320
 		}
1321 1321
 		streamMaxLength = (long)cpt->numarg;
1322 1322
 	}
1323
+
1324
+	if(cfgopt(copt, "LogSyslog")) {
1325
+		int fac = LOG_LOCAL6;
1326
+
1327
+		if(cfgopt(copt, "LogVerbose"))
1328
+			logVerbose = 1;
1329
+		use_syslog = 1;
1330
+
1331
+		if((cpt = cfgopt(copt, "LogFacility")) != NULL)
1332
+			if((fac = logg_facility(cpt->strarg)) == -1) {
1333
+				fprintf(stderr, "%s: LogFacility: %s: No such facility\n",
1334
+					argv[0], cpt->strarg);
1335
+				return EX_CONFIG;
1336
+			}
1337
+		openlog("clamav-milter", LOG_CONS|LOG_PID, fac);
1338
+	} else {
1339
+		if(qflag)
1340
+			fprintf(stderr, _("%s: (-q && !LogSyslog): warning - all interception message methods are off\n"),
1341
+				argv[0]);
1342
+		use_syslog = 0;
1343
+	}
1323 1344
 	/*
1324
-	 * Get the outgoing socket details - the way to talk to clamd
1345
+	 * Get the outgoing socket details - the way to talk to clamd, unless
1346
+	 * we're doing the scanning internally
1325 1347
 	 */
1326
-	if((cpt = cfgopt(copt, "LocalSocket")) != NULL) {
1348
+	if(internal) {
1349
+		int signatures = 0;
1350
+		int ret;
1351
+		extern const char *cl_retdbdir(void);	/* FIXME */
1352
+		const char *dbdir = cl_retdbdir();
1353
+
1354
+		/*
1355
+		 * TODO: Set a better version string if DataDirectory hasn't
1356
+		 * been set
1357
+		 * TODO: Set limits
1358
+		 */
1359
+		if((cpt = cfgopt(copt, "DatabaseDirectory")) || (cpt = cfgopt(copt, "DataDirectory")))
1360
+			if(strcmp(dbdir, cpt->strarg) != 0) {
1361
+				char *daily = cli_malloc(strlen(cpt->strarg) + strlen(dbdir) + 15);
1362
+				struct cl_cvd *d1;
1363
+				time_t t = (time_t)0;
1364
+				int v = 0;
1365
+
1366
+				sprintf(daily, "%s/daily.cvd", cpt->strarg);
1367
+				if((d1 = cl_cvdhead(daily))) {
1368
+					struct cl_cvd *d2;
1369
+
1370
+					t = d1->stime;
1371
+					v = d1->version;
1372
+
1373
+					sprintf(daily, "%s/daily.cvd", dbdir);
1374
+					if((d2 = cl_cvdhead(daily))) {
1375
+						if(d1->version > d2->version)
1376
+							dbdir = cpt->strarg;
1377
+						else
1378
+							dbdir = dbdir;
1379
+						t = d2->stime;
1380
+						v = d2->version;
1381
+						cl_cvdfree(d2);
1382
+					} else
1383
+						dbdir = cpt->strarg;
1384
+					cl_cvdfree(d1);
1385
+				}
1386
+				free(daily);
1387
+
1388
+				if(t)
1389
+					snprintf(version, sizeof(version) - 1,
1390
+						"ClamAV %s/%d/%s", VERSION, v,
1391
+						ctime(&t));
1392
+
1393
+			}
1394
+
1395
+		ret = cl_loaddbdir(dbdir, &root, &signatures);
1396
+		if(ret != 0) {
1397
+			fprintf(stderr, "%s\n", cl_strerror(ret));
1398
+			return EX_CONFIG;
1399
+		}
1400
+		if(!root) {
1401
+			fputs("Can't initialize the virus database.\n", stderr);
1402
+			return EX_CONFIG;
1403
+		}
1404
+
1405
+		ret = cl_build(root);
1406
+		if(ret != 0) {
1407
+			fprintf(stderr, "Database initialization error: %s\n", cl_strerror(ret));
1408
+			return EX_CONFIG;
1409
+		}
1410
+		if(use_syslog)
1411
+			syslog(LOG_INFO, _("ClamAV: Protecting against %d viruses"), signatures);
1412
+
1413
+		cl_statinidir(dbdir, &dbstat);
1414
+
1415
+	} else if((cpt = cfgopt(copt, "LocalSocket")) != NULL) {
1327 1416
 #ifdef	SESSION
1328 1417
 		struct sockaddr_un server;
1329 1418
 #endif
... ...
@@ -1509,19 +1623,26 @@ main(int argc, char **argv)
1509 1509
 		return EX_CONFIG;
1510 1510
 	}
1511 1511
 
1512
+	if(internal) {
1513
+		clamav_versions = (char **)cli_malloc(sizeof(char *));
1514
+		if(clamav_versions == NULL)
1515
+			return EX_TEMPFAIL;
1516
+		clamav_version = strdup(version);
1512 1517
 #ifdef	SESSION
1513
-	clamav_versions = (char **)cli_malloc(numServers * sizeof(char *));
1514
-	if(clamav_versions == NULL)
1515
-		return EX_TEMPFAIL;
1516
-
1517
-	for(i = 0; i < numServers; i++) {
1518
-		clamav_versions[i] = strdup(version);
1519
-		if(clamav_versions[i] == NULL)
1518
+	} else {
1519
+		clamav_versions = (char **)cli_malloc(numServers * sizeof(char *));
1520
+		if(clamav_versions == NULL)
1520 1521
 			return EX_TEMPFAIL;
1521
-	}
1522
+
1523
+		for(i = 0; i < numServers; i++) {
1524
+			clamav_versions[i] = strdup(version);
1525
+			if(clamav_versions[i] == NULL)
1526
+				return EX_TEMPFAIL;
1527
+		}
1522 1528
 #endif
1529
+	}
1523 1530
 
1524
-	if((quarantine_dir == NULL) && localSocket) {
1531
+	if(((quarantine_dir == NULL) && localSocket) || internal) {
1525 1532
 		/* set the temporary dir */
1526 1533
 		if((cpt = cfgopt(copt, "TemporaryDirectory"))) {
1527 1534
 			tmpdir = cpt->strarg;
... ...
@@ -1547,7 +1668,7 @@ main(int argc, char **argv)
1547 1547
 	if(!cfgopt(copt, "Foreground")) {
1548 1548
 #ifdef	CL_DEBUG
1549 1549
 		printf(_("When debugging it is recommended that you use Foreground mode in %s\n"), cfgfile);
1550
-		puts(_("So that you can see all of the messages"));
1550
+		puts(_("\tso that you can see all of the messages"));
1551 1551
 #endif
1552 1552
 
1553 1553
 		switch(fork()) {
... ...
@@ -1594,35 +1715,6 @@ main(int argc, char **argv)
1594 1594
 	if((cpt = cfgopt(copt, "PidFile")) != NULL)
1595 1595
 		pidFile = cpt->strarg;
1596 1596
 
1597
-	if(cfgopt(copt, "LogSyslog")) {
1598
-		int fac = LOG_LOCAL6;
1599
-
1600
-		if(cfgopt(copt, "LogVerbose"))
1601
-			logVerbose = 1;
1602
-		use_syslog = 1;
1603
-
1604
-		if((cpt = cfgopt(copt, "LogFacility")) != NULL)
1605
-			if((fac = logg_facility(cpt->strarg)) == -1) {
1606
-				fprintf(stderr, "%s: LogFacility: %s: No such facility\n",
1607
-					argv[0], cpt->strarg);
1608
-				return EX_CONFIG;
1609
-			}
1610
-
1611
-		openlog("clamav-milter", LOG_CONS|LOG_PID, fac);
1612
-		if(logVerbose)
1613
-			syslog(LOG_INFO, _("Starting: %s"), clamav_version);
1614
-		else
1615
-			syslog(LOG_INFO, "%s", clamav_version);
1616
-#ifdef	CL_DEBUG
1617
-		if(debug_level > 0)
1618
-			syslog(LOG_DEBUG, _("Debugging is on"));
1619
-#endif
1620
-	} else {
1621
-		if(qflag)
1622
-			fprintf(stderr, _("%s: (-q && !LogSyslog): warning - all interception message methods are off\n"),
1623
-				argv[0]);
1624
-		use_syslog = 0;
1625
-	}
1626 1597
 	broadcast(_("Starting clamav-milter"));
1627 1598
 
1628 1599
 	if(pidfile) {
... ...
@@ -1674,8 +1766,18 @@ main(int argc, char **argv)
1674 1674
 
1675 1675
 	signal(SIGPIPE, SIG_IGN);
1676 1676
 
1677
-	if(logVerbose)
1678
-		syslog(LOG_INFO, _("Started: %s"), clamav_version);
1677
+	if(use_syslog) {
1678
+		if(logVerbose)
1679
+			syslog(LOG_INFO, _("Starting: %s"), clamav_version);
1680
+		else
1681
+			syslog(LOG_INFO, "%s", clamav_version);
1682
+#ifdef	CL_DEBUG
1683
+		if(debug_level > 0)
1684
+			syslog(LOG_DEBUG, _("Debugging is on"));
1685
+#endif
1686
+	}
1687
+
1688
+	cli_dbgmsg("Started: %s\n", clamav_version);
1679 1689
 
1680 1690
 	return smfi_main();
1681 1691
 }
... ...
@@ -2354,7 +2456,13 @@ clamfi_header(SMFICTX *ctx, char *headerf, char *headerv)
2354 2354
 
2355 2355
 	if(strcasecmp(headerf, "X-Virus-Status") == 0)
2356 2356
 		if(!nflag) {	/* remove any existing claims */
2357
-			smfi_chgheader(ctx, "X-Virus-Status", 1, NULL);
2357
+			if(smfi_chgheader(ctx, "X-Virus-Status", ++privdata->statusCount, NULL) == MI_FAILURE)
2358
+				/*
2359
+				 * FIXME: It would be useful to know *why* it
2360
+				 * had failed to be deleted
2361
+				 */
2362
+				if(use_syslog)
2363
+					syslog(LOG_ERR, _("Failed to delete X-Virus-Status header %d"), privdata->statusCount);
2358 2364
 			return SMFIS_CONTINUE;
2359 2365
 		}
2360 2366
 
... ...
@@ -2525,15 +2633,39 @@ clamfi_eom(SMFICTX *ctx)
2525 2525
 	assert(privdata->dataSocket >= 0);
2526 2526
 #endif
2527 2527
 
2528
-	close(privdata->dataSocket);
2529
-	privdata->dataSocket = -1;
2528
+	if(!internal) {
2529
+		close(privdata->dataSocket);
2530
+		privdata->dataSocket = -1;
2531
+	}
2532
+
2533
+	if(internal) {
2534
+		const char *virname;
2535
+		unsigned long int scanned = 0L;
2536
+
2537
+		/*
2538
+		 * TODO: read the options from clamd.conf
2539
+		 * TODO: consider using cl_scandesc and not using a temporary
2540
+		 *	file from the mail being read in
2541
+		 */
2542
+		rc = cl_scanfile(privdata->filename, &virname, &scanned, root,
2543
+			&limits, CL_SCAN_STDOPT);
2544
+
2545
+		if(rc == CL_CLEAN)
2546
+			strcpy(mess, "OK");
2547
+		else if(rc == CL_VIRUS)
2548
+			sprintf(mess, "%s: %s FOUND", privdata->filename, virname);
2549
+		else
2550
+			sprintf(mess, "%s: %s ERROR", privdata->filename, cl_strerror(rc));
2530 2551
 
2531
-	if(privdata->filename) {
2552
+#ifdef	SESSION
2553
+		session = NULL;
2554
+#endif
2555
+	} else if(privdata->filename) {
2532 2556
 		char cmdbuf[1024];
2533 2557
 		/*
2534 2558
 		 * Create socket to talk to clamd.
2535 2559
 		 */
2536
-#ifdef	SESSION
2560
+#ifndef	SESSION
2537 2561
 		struct sockaddr_un server;
2538 2562
 #endif
2539 2563
 		int nbytes;
... ...
@@ -2583,45 +2715,52 @@ clamfi_eom(SMFICTX *ctx)
2583 2583
 		session = &sessions[privdata->serverNumber];
2584 2584
 #endif
2585 2585
 
2586
+	if(!internal) {
2586 2587
 #ifdef	SESSION
2587
-	if(clamd_recv(session->sock, mess, sizeof(mess)) > 0) {
2588
+#ifdef	CL_DEBUG
2589
+		if(debug_level >= 4)
2590
+			cli_dbgmsg(_("Wating to read status from fd %d\n"),
2591
+				session->sock);
2592
+#endif
2593
+		if(clamd_recv(session->sock, mess, sizeof(mess)) > 0) {
2588 2594
 #else
2589
-	if(clamd_recv(privdata->cmdSocket, mess, sizeof(mess)) > 0) {
2595
+		if(clamd_recv(privdata->cmdSocket, mess, sizeof(mess)) > 0) {
2590 2596
 #endif
2591
-		if((ptr = strchr(mess, '\n')) != NULL)
2592
-			*ptr = '\0';
2597
+			if((ptr = strchr(mess, '\n')) != NULL)
2598
+				*ptr = '\0';
2593 2599
 
2594
-		if(logVerbose)
2595
-			syslog(LOG_DEBUG, _("clamfi_eom: read %s"), mess);
2596
-		cli_dbgmsg(_("clamfi_eom: read %s\n"), mess);
2597
-	} else {
2598
-		/*
2599
-		 * TODO: if more than one host has been specified, try
2600
-		 * another one - setting cl_error to SMFIS_TEMPFAIL helps
2601
-		 * by forcing a retry
2602
-		 */
2603
-		clamfi_cleanup(ctx);
2604
-		syslog(LOG_NOTICE, _("clamfi_eom: read nothing from clamd"));
2600
+			if(logVerbose)
2601
+				syslog(LOG_DEBUG, _("clamfi_eom: read %s"), mess);
2602
+			cli_dbgmsg(_("clamfi_eom: read %s\n"), mess);
2603
+		} else {
2604
+			/*
2605
+			 * TODO: if more than one host has been specified, try
2606
+			 * another one - setting cl_error to SMFIS_TEMPFAIL helps
2607
+			 * by forcing a retry
2608
+			 */
2609
+			clamfi_cleanup(ctx);
2610
+			syslog(LOG_NOTICE, _("clamfi_eom: read nothing from clamd"));
2605 2611
 #ifdef	CL_DEBUG
2606
-		cli_dbgmsg(_("clamfi_eom: read nothing from clamd\n"));
2612
+			cli_dbgmsg(_("clamfi_eom: read nothing from clamd\n"));
2607 2613
 #endif
2608 2614
 #ifdef	SESSION
2609
-		pthread_mutex_lock(&sstatus_mutex);
2610
-		session->status = CMDSOCKET_DOWN;
2611
-		pthread_mutex_unlock(&sstatus_mutex);
2615
+			pthread_mutex_lock(&sstatus_mutex);
2616
+			session->status = CMDSOCKET_DOWN;
2617
+			pthread_mutex_unlock(&sstatus_mutex);
2612 2618
 #endif
2613
-		return cl_error;
2614
-	}
2619
+			return cl_error;
2620
+		}
2615 2621
 
2616 2622
 #ifdef	SESSION
2617
-	pthread_mutex_lock(&sstatus_mutex);
2618
-	if(session->status == CMDSOCKET_INUSE)
2619
-		session->status = CMDSOCKET_FREE;
2620
-	pthread_mutex_unlock(&sstatus_mutex);
2623
+		pthread_mutex_lock(&sstatus_mutex);
2624
+		if(session->status == CMDSOCKET_INUSE)
2625
+			session->status = CMDSOCKET_FREE;
2626
+		pthread_mutex_unlock(&sstatus_mutex);
2621 2627
 #else
2622
-	close(privdata->cmdSocket);
2623
-	privdata->cmdSocket = -1;
2628
+		close(privdata->cmdSocket);
2629
+		privdata->cmdSocket = -1;
2624 2630
 #endif
2631
+	}
2625 2632
 
2626 2633
 	sendmailId = smfi_getsymval(ctx, "i");
2627 2634
 	if(sendmailId == NULL)
... ...
@@ -2633,7 +2772,7 @@ clamfi_eom(SMFICTX *ctx)
2633 2633
 		/*
2634 2634
 		 * Include the hostname where the scan took place
2635 2635
 		 */
2636
-		if(localSocket) {
2636
+		if(localSocket || internal) {
2637 2637
 #ifdef	MAXHOSTNAMELEN
2638 2638
 			char hostname[MAXHOSTNAMELEN + 1];
2639 2639
 #else
... ...
@@ -2997,7 +3136,7 @@ static sfsistat
2997 2997
 clamfi_abort(SMFICTX *ctx)
2998 2998
 {
2999 2999
 #ifdef	CL_DEBUG
3000
-	if(use_syslog)
3000
+	if(logVerbose)
3001 3001
 		syslog(LOG_DEBUG, "clamfi_abort");
3002 3002
 #endif
3003 3003
 
... ...
@@ -3108,45 +3247,53 @@ clamfi_free(struct privdata *privdata)
3108 3108
 		}
3109 3109
 
3110 3110
 #ifdef	SESSION
3111
-		session = &sessions[privdata->serverNumber];
3112
-		pthread_mutex_lock(&sstatus_mutex);
3113
-		if(session->status == CMDSOCKET_INUSE) {
3111
+		if(!internal) {
3112
+			session = &sessions[privdata->serverNumber];
3113
+			pthread_mutex_lock(&sstatus_mutex);
3114
+			if(session->status == CMDSOCKET_INUSE) {
3115
+				/*
3116
+				 * Probably we've got here because
3117
+				 * MaxStreamLength has been reached
3118
+				 */
3114 3119
 #if	0
3120
+				pthread_mutex_unlock(&sstatus_mutex);
3121
+				if(readTimeout) {
3122
+					char buf[64];
3123
+					const int fd = session->sock;
3124
+
3125
+					cli_dbgmsg("clamfi_free: flush server %d fd %d\n",
3126
+						privdata->serverNumber, fd);
3127
+
3128
+					/*
3129
+					 * FIXME: whenever this code gets
3130
+					 *	executed, all of the PINGs fail
3131
+					 *	in the next watchdog cycle
3132
+					 */
3133
+					while(clamd_recv(fd, buf, sizeof(buf)) > 0)
3134
+						;
3135
+				}
3136
+				pthread_mutex_lock(&sstatus_mutex);
3137
+#endif
3138
+				/* Force a reset */
3139
+				session->status = CMDSOCKET_DOWN;
3140
+			}
3115 3141
 			pthread_mutex_unlock(&sstatus_mutex);
3116
-			if(readTimeout) {
3142
+#else
3143
+			if(privdata->cmdSocket >= 0) {
3117 3144
 				char buf[64];
3118
-				const int fd = session->status;
3119
-
3120
-				cli_dbgmsg("clamfi_free: flush server %d fd %d\n",
3121
-					privdata->serverNumber, fd);
3122 3145
 
3123 3146
 				/*
3124
-				 * FIXME: whenever this code gets executed,
3125
-				 *	all of the PINGs fail in the next
3126
-				 *	watchdog cycle
3147
+				 * Flush the remote end so that clamd doesn't
3148
+				 * get a SIGPIPE
3127 3149
 				 */
3128
-				while(clamd_recv(fd, buf, sizeof(buf)) > 0)
3129
-					;
3150
+				if(readTimeout)
3151
+					while(clamd_recv(privdata->cmdSocket, buf, sizeof(buf)) > 0)
3152
+						;
3153
+				close(privdata->cmdSocket);
3154
+				privdata->cmdSocket = -1;
3130 3155
 			}
3131
-			pthread_mutex_lock(&sstatus_mutex);
3132 3156
 #endif
3133
-			session->status = CMDSOCKET_FREE;
3134 3157
 		}
3135
-		pthread_mutex_unlock(&sstatus_mutex);
3136
-#else
3137
-		if(privdata->cmdSocket >= 0) {
3138
-			char buf[64];
3139
-
3140
-			/*
3141
-			 * Flush the remote end so that clamd doesn't get a SIGPIPE
3142
-			 */
3143
-			if(readTimeout)
3144
-				while(clamd_recv(privdata->cmdSocket, buf, sizeof(buf)) > 0)
3145
-					;
3146
-			close(privdata->cmdSocket);
3147
-			privdata->cmdSocket = -1;
3148
-		}
3149
-#endif
3150 3158
 		if(privdata->headers)
3151 3159
 			header_list_free(privdata->headers);
3152 3160
 
... ...
@@ -3422,7 +3569,7 @@ header_list_add(header_list_t list, const char *headerf, const char *headerv)
3422 3422
 	}
3423 3423
 	new_node->header = header;
3424 3424
 	new_node->next = NULL;
3425
-	if(!list->first)
3425
+	if(list->first == NULL)
3426 3426
 		list->first = new_node;
3427 3427
 	if(list->last)
3428 3428
 		list->last->next = new_node;
... ...
@@ -3693,7 +3840,13 @@ connect2clamd(struct privdata *privdata)
3693 3693
 
3694 3694
 #ifdef	CL_DEBUG
3695 3695
 		if(debug_level >= 4)
3696
-			cli_dbgmsg(_("Connecting to local port %d\n"), p);
3696
+#ifdef	SESSION
3697
+			cli_dbgmsg(_("Connecting to local port %d - data %d cmd %d\n"),
3698
+				p, privdata->dataSocket, session->sock);
3699
+#else
3700
+			cli_dbgmsg(_("Connecting to local port %d - data %d cmd %d\n"),
3701
+				p, privdata->dataSocket, privdata->cmdSocket);
3702
+#endif
3697 3703
 #endif
3698 3704
 
3699 3705
 		if(connect(privdata->dataSocket, (struct sockaddr *)&reply, sizeof(struct sockaddr_in)) < 0) {
... ...
@@ -4126,7 +4279,7 @@ watchdog(void *a)
4126 4126
 {
4127 4127
 	static pthread_mutex_t watchdog_mutex = PTHREAD_MUTEX_INITIALIZER;
4128 4128
 
4129
-	assert(sessions != NULL);
4129
+	assert(internal || (sessions != NULL));
4130 4130
 
4131 4131
 	while(!quitting) {
4132 4132
 		int i;
... ...
@@ -4155,6 +4308,15 @@ watchdog(void *a)
4155 4155
 		cli_dbgmsg("watchdog wakes\n");
4156 4156
 		pthread_mutex_unlock(&watchdog_mutex);
4157 4157
 
4158
+		if(internal) {
4159
+			/*
4160
+			 * TODO: reload automatically
4161
+			 */
4162
+			if((n_children == 0) && (cl_statchkdir(&dbstat) == 1))
4163
+				if(use_syslog)
4164
+					syslog(LOG_WARNING, _("Freshclam has been run - please restart clamav-milter\n"));
4165
+			continue;
4166
+		}
4158 4167
 		i = 0;
4159 4168
 		session = sessions;
4160 4169
 		pthread_mutex_lock(&sstatus_mutex);
... ...
@@ -4326,46 +4488,46 @@ quit(void)
4326 4326
 {
4327 4327
 	extern short cli_leavetemps_flag;
4328 4328
 
4329
-#ifdef	SESSION
4330
-	int i;
4331
-	struct session *session;
4332
-
4333 4329
 	quitting++;
4334 4330
 
4335 4331
 	if(use_syslog)
4336 4332
 		syslog(LOG_INFO, _("Stopping %s"), clamav_version);
4337 4333
 
4338
-	i = 0;
4339
-	session = sessions;
4340
-	pthread_mutex_lock(&sstatus_mutex);
4341
-	for(; i < ((localSocket != NULL) ? 1 : max_children); i++) {
4342
-		/*
4343
-		 * Check all free sessions are still usable
4344
-		 * This could take some time with many free
4345
-		 * sessions to slow remote servers, so only do this
4346
-		 * when the system is quiet (not 100% accurate when
4347
-		 * determining this since n_children isn't locked but
4348
-		 * that doesn't really matter)
4349
-		 */
4350
-		cli_dbgmsg("quit: close server %d\n", i);
4351
-		if(session->status == CMDSOCKET_FREE) {
4352
-			const int sock = session->sock;
4353
-
4354
-			send(sock, "END\n", 4, 0);
4355
-			shutdown(sock, SHUT_WR);
4356
-			session->status = CMDSOCKET_DOWN;
4357
-			pthread_mutex_unlock(&sstatus_mutex);
4358
-			close(sock);
4359
-			pthread_mutex_lock(&sstatus_mutex);
4334
+	if(internal) {
4335
+		if(root) {
4336
+			cl_free(root);
4337
+			root = NULL;
4360 4338
 		}
4361
-	}
4362
-	pthread_mutex_unlock(&sstatus_mutex);
4363
-#else
4364
-	quitting++;
4339
+	} else {
4340
+#ifdef	SESSION
4341
+		int i = 0;
4342
+		struct session *session = sessions;
4365 4343
 
4366
-	if(use_syslog)
4367
-		syslog(LOG_INFO, _("Stopping %s"), clamav_version);
4344
+		pthread_mutex_lock(&sstatus_mutex);
4345
+		for(; i < ((localSocket != NULL) ? 1 : max_children); i++) {
4346
+			/*
4347
+			 * Check all free sessions are still usable
4348
+			 * This could take some time with many free
4349
+			 * sessions to slow remote servers, so only do this
4350
+			 * when the system is quiet (not 100% accurate when
4351
+			 * determining this since n_children isn't locked but
4352
+			 * that doesn't really matter)
4353
+			 */
4354
+			cli_dbgmsg("quit: close server %d\n", i);
4355
+			if(session->status == CMDSOCKET_FREE) {
4356
+				const int sock = session->sock;
4357
+
4358
+				send(sock, "END\n", 4, 0);
4359
+				shutdown(sock, SHUT_WR);
4360
+				session->status = CMDSOCKET_DOWN;
4361
+				pthread_mutex_unlock(&sstatus_mutex);
4362
+				close(sock);
4363
+				pthread_mutex_lock(&sstatus_mutex);
4364
+			}
4365
+		}
4366
+		pthread_mutex_unlock(&sstatus_mutex);
4368 4367
 #endif
4368
+	}
4369 4369
 
4370 4370
 	if(tmpdir && !cli_leavetemps_flag)
4371 4371
 		rmdir(tmpdir);
... ...
@@ -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-14 15:18+0000\n"
11
+"POT-Creation-Date: 2004-12-01 22:27+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,582 @@ msgstr ""
16 16
 "Content-Type: text/plain; charset=CHARSET\n"
17 17
 "Content-Transfer-Encoding: 8bit\n"
18 18
 
19
-#: clamav-milter.c:847
19
+#: clamav-milter.c:861
20 20
 msgid "\t--advisory\t\t-A\tFlag viruses rather than deleting them."
21 21
 msgstr ""
22 22
 
23
-#: clamav-milter.c:848
23
+#: clamav-milter.c:862
24 24
 msgid "\t--bounce\t\t-b\tSend a failure message to the sender."
25 25
 msgstr ""
26 26
 
27
-#: clamav-milter.c:849
27
+#: clamav-milter.c:863
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:850
33
+#: clamav-milter.c:864
34 34
 msgid "\t--config-file=FILE\t-c FILE\tRead configuration from FILE."
35 35
 msgstr ""
36 36
 
37
-#: clamav-milter.c:851
37
+#: clamav-milter.c:865
38 38
 msgid "\t--debug\t\t\t-D\tPrint debug messages."
39 39
 msgstr ""
40 40
 
41
-#: clamav-milter.c:852
41
+#: clamav-milter.c:866
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:853
46
+#: clamav-milter.c:867
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:854
52
+#: clamav-milter.c:868
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:855
56
+#: clamav-milter.c:869
57 57
 msgid "\t--from=EMAIL\t\t-a EMAIL\tError messages come from here."
58 58
 msgstr ""
59 59
 
60
-#: clamav-milter.c:856
60
+#: clamav-milter.c:870
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:857
64
+#: clamav-milter.c:871
65 65
 msgid "\t--help\t\t\t-h\tThis message."
66 66
 msgstr ""
67 67
 
68
-#: clamav-milter.c:858
68
+#: clamav-milter.c:872
69 69
 msgid "\t--headers\t\t-H\tInclude original message headers in the report."
70 70
 msgstr ""
71 71
 
72
-#: clamav-milter.c:859
72
+#: clamav-milter.c:873
73
+msgid "\t--internal\t\t-I\tUse the internal scanner."
74
+msgstr ""
75
+
76
+#: clamav-milter.c:874
73 77
 msgid "\t--local\t\t\t-l\tScan messages sent from machines on our LAN."
74 78
 msgstr ""
75 79
 
76
-#: clamav-milter.c:860
80
+#: clamav-milter.c:875
77 81
 msgid "\t--max-childen\t\t-m\tMaximum number of concurrent scans."
78 82
 msgstr ""
79 83
 
80
-#: clamav-milter.c:861
84
+#: clamav-milter.c:876
81 85
 msgid "\t--outgoing\t\t-o\tScan outgoing messages from this machine."
82 86
 msgstr ""
83 87
 
84
-#: clamav-milter.c:862
88
+#: clamav-milter.c:877
85 89
 msgid "\t--noreject\t\t-N\tDon't reject viruses, silently throw them away."
86 90
 msgstr ""
87 91
 
88
-#: clamav-milter.c:863
92
+#: clamav-milter.c:878
89 93
 msgid "\t--noxheader\t\t-n\tSuppress X-Virus-Scanned/X-Virus-Status headers."
90 94
 msgstr ""
91 95
 
92
-#: clamav-milter.c:864
96
+#: clamav-milter.c:879
93 97
 msgid "\t--pidfile=FILE\t\t-i FILE\tLocation of pidfile."
94 98
 msgstr ""
95 99
 
96
-#: clamav-milter.c:865
100
+#: clamav-milter.c:880
97 101
 msgid "\t--postmaster\t\t-p EMAIL\tPostmaster address [default=postmaster]."
98 102
 msgstr ""
99 103
 
100
-#: clamav-milter.c:866
104
+#: clamav-milter.c:881
101 105
 msgid "\t--postmaster-only\t-P\tSend warnings only to the postmaster."
102 106
 msgstr ""
103 107
 
104
-#: clamav-milter.c:867
108
+#: clamav-milter.c:882
105 109
 msgid "\t--quiet\t\t\t-q\tDon't send e-mail notifications of interceptions."
106 110
 msgstr ""
107 111
 
108
-#: clamav-milter.c:868
112
+#: clamav-milter.c:883
109 113
 msgid "\t--quarantine=USER\t-Q EMAIL\tQuanrantine e-mail account."
110 114
 msgstr ""
111 115
 
112
-#: clamav-milter.c:869
116
+#: clamav-milter.c:884
113 117
 msgid "\t--quarantine-dir=DIR\t-U DIR\tDirectory to store infected emails."
114 118
 msgstr ""
115 119
 
116
-#: clamav-milter.c:870
120
+#: clamav-milter.c:885
117 121
 msgid ""
118 122
 "\t--server=SERVER\t\t-s SERVER\tHostname/IP address of server(s) running "
119 123
 "clamd (when using TCPsocket)."
120 124
 msgstr ""
121 125
 
122
-#: clamav-milter.c:871
126
+#: clamav-milter.c:886
123 127
 msgid "\t--sign\t\t\t-S\tAdd a hard-coded signature to each scanned message."
124 128
 msgstr ""
125 129
 
126
-#: clamav-milter.c:872
130
+#: clamav-milter.c:887
127 131
 msgid "\t--signature-file=FILE\t-F FILE\tLocation of signature file."
128 132
 msgstr ""
129 133
 
130
-#: clamav-milter.c:873
134
+#: clamav-milter.c:888
131 135
 msgid "\t--template-file=FILE\t-t FILE\tLocation of e-mail template file."
132 136
 msgstr ""
133 137
 
134
-#: clamav-milter.c:874
138
+#: clamav-milter.c:889
135 139
 msgid "\t--timeout=SECS\t\t-T SECS\tTimeout waiting to childen to die."
136 140
 msgstr ""
137 141
 
138
-#: clamav-milter.c:875
142
+#: clamav-milter.c:890
139 143
 msgid "\t--version\t\t-V\tPrint the version number of this software."
140 144
 msgstr ""
141 145
 
142
-#: clamav-milter.c:877
146
+#: clamav-milter.c:892
143 147
 msgid "\t--debug-level=n\t\t-x n\tSets the debug level to 'n'."
144 148
 msgstr ""
145 149
 
146
-#: clamav-milter.c:879
150
+#: clamav-milter.c:894
147 151
 msgid ""
148 152
 "\n"
149 153
 "For more information type \"man clamav-milter\"."
150 154
 msgstr ""
151 155
 
152
-#: clamav-milter.c:880
156
+#: clamav-milter.c:895
153 157
 msgid "Report bugs to bugs@clamav.net."
154 158
 msgstr ""
155 159
 
156
-#: clamav-milter.c:1161
160
+#: clamav-milter.c:1187
157 161
 #, c-format
158 162
 msgid "%s: No socket-addr given\n"
159 163
 msgstr ""
160 164
 
161
-#: clamav-milter.c:1170
165
+#: clamav-milter.c:1196
162 166
 #, c-format
163 167
 msgid "%s: Can't parse the config file %s\n"
164 168
 msgstr ""
165 169
 
166
-#: clamav-milter.c:1209
170
+#: clamav-milter.c:1235
167 171
 #, c-format
168 172
 msgid ""
169 173
 "%s: The iface option to --broadcast is not supported on your operating "
170 174
 "system\n"
171 175
 msgstr ""
172 176
 
173
-#: clamav-milter.c:1215
177
+#: clamav-milter.c:1244
174 178
 #, c-format
175 179
 msgid "%s: Can't get information about user %s\n"
176 180
 msgstr ""
177 181
 
178
-#: clamav-milter.c:1226
182
+#: clamav-milter.c:1255
179 183
 #, c-format
180 184
 msgid "%s: AllowSupplementaryGroups: initgroups not supported.\n"
181 185
 msgstr ""
182 186
 
183
-#: clamav-milter.c:1243
187
+#: clamav-milter.c:1272
184 188
 #, c-format
185 189
 msgid "Running as user %s (UID %d, GID %d)\n"
186 190
 msgstr ""
187 191
 
188
-#: clamav-milter.c:1246
192
+#: clamav-milter.c:1275
189 193
 #, c-format
190 194
 msgid "%s: running as root is not recommended (check \"User\" in clamd.conf)\n"
191 195
 msgstr ""
192 196
 
193
-#: clamav-milter.c:1248
197
+#: clamav-milter.c:1277
194 198
 #, c-format
195 199
 msgid "%s: Only root can set an interface for --broadcast\n"
196 200
 msgstr ""
197 201
 
198
-#: clamav-milter.c:1253
202
+#: clamav-milter.c:1282
199 203
 #, c-format
200 204
 msgid "%s: Advisory mode doesn't work with quarantine mode\n"
201 205
 msgstr ""
202 206
 
203
-#: clamav-milter.c:1260
207
+#: clamav-milter.c:1289
204 208
 #, c-format
205 209
 msgid "%s: Advisory mode doesn't work with quarantine directories\n"
206 210
 msgstr ""
207 211
 
208
-#: clamav-milter.c:1276
212
+#: clamav-milter.c:1305
209 213
 #, c-format
210 214
 msgid "%s: insecure quarantine directory %s (mode 0%o)\n"
211 215
 msgstr ""
212 216
 
213
-#: clamav-milter.c:1302
217
+#: clamav-milter.c:1331
214 218
 #, c-format
215 219
 msgid "%s: ReadTimeout must not be negative in %s\n"
216 220
 msgstr ""
217 221
 
218
-#: clamav-milter.c:1309
222
+#: clamav-milter.c:1339
219 223
 #, c-format
220 224
 msgid "%s: StreamMaxLength must not be negative in %s\n"
221 225
 msgstr ""
222 226
 
223
-#: clamav-milter.c:1325
227
+#: clamav-milter.c:1362
228
+#, c-format
229
+msgid ""
230
+"%s: (-q && !LogSyslog): warning - all interception message methods are off\n"
231
+msgstr ""
232
+
233
+#: clamav-milter.c:1433
234
+#, c-format
235
+msgid "ClamAV: Protecting against %d viruses"
236
+msgstr ""
237
+
238
+#: clamav-milter.c:1444
224 239
 #, c-format
225 240
 msgid "%s: You can select one server type only (local/TCP) in %s\n"
226 241
 msgstr ""
227 242
 
228
-#: clamav-milter.c:1335
243
+#: clamav-milter.c:1454
229 244
 #, c-format
230 245
 msgid "The connection from sendmail to %s (%s) must not\n"
231 246
 msgstr ""
232 247
 
233
-#: clamav-milter.c:1337
248
+#: clamav-milter.c:1456
234 249
 #, c-format
235 250
 msgid "be the same as the connection to clamd (%s) in %s\n"
236 251
 msgstr ""
237 252
 
238
-#: clamav-milter.c:1347 clamav-milter.c:1370
253
+#: clamav-milter.c:1466 clamav-milter.c:1489
239 254
 #, c-format
240 255
 msgid "Can't talk to clamd server via %s\n"
241 256
 msgstr ""
242 257
 
243
-#: clamav-milter.c:1349 clamav-milter.c:1372
258
+#: clamav-milter.c:1468 clamav-milter.c:1491
244 259
 #, c-format
245 260
 msgid "Check your entry for LocalSocket in %s\n"
246 261
 msgstr ""
247 262
 
248
-#: clamav-milter.c:1383
263
+#: clamav-milter.c:1502
249 264
 msgid "Can't create a clamd session"
250 265
 msgstr ""
251 266
 
252
-#: clamav-milter.c:1400
267
+#: clamav-milter.c:1519
253 268
 #, c-format
254 269
 msgid ""
255 270
 "%s: --quarantine-dir not supported for remote scanning - use --quarantine\n"
256 271
 msgstr ""
257 272
 
258
-#: clamav-milter.c:1415
273
+#: clamav-milter.c:1534
259 274
 #, c-format
260 275
 msgid "%s: hostname %s is longer than %d characters\n"
261 276
 msgstr ""
262 277
 
263
-#: clamav-milter.c:1434
278
+#: clamav-milter.c:1553
264 279
 #, c-format
265 280
 msgid "%s: --max-children must be given in sessions mode\n"
266 281
 msgstr ""
267 282
 
268
-#: clamav-milter.c:1457
283
+#: clamav-milter.c:1576
269 284
 #, c-format
270 285
 msgid "%s: Unknown host %s\n"
271 286
 msgstr ""
272 287
 
273
-#: clamav-milter.c:1469
288
+#: clamav-milter.c:1588
274 289
 #, c-format
275 290
 msgid "Can't talk to clamd server %s on port %d\n"
276 291
 msgstr ""
277 292
 
278
-#: clamav-milter.c:1486
293
+#: clamav-milter.c:1605
279 294
 msgid "Can't find any active clamd servers\n"
280 295
 msgstr ""
281 296
 
282
-#: clamav-milter.c:1487 clamav-milter.c:1493
297
+#: clamav-milter.c:1606 clamav-milter.c:1612
283 298
 #, c-format
284 299
 msgid "Check your entry for TCPSocket in %s\n"
285 300
 msgstr ""
286 301
 
287
-#: clamav-milter.c:1492
302
+#: clamav-milter.c:1611
288 303
 msgid "Can't find any clamd servers\n"
289 304
 msgstr ""
290 305
 
291
-#: clamav-milter.c:1499
306
+#: clamav-milter.c:1618
292 307
 #, c-format
293 308
 msgid "%s: You must select server type (local/TCP) in %s\n"
294 309
 msgstr ""
295 310
 
296
-#: clamav-milter.c:1541
311
+#: clamav-milter.c:1667
297 312
 #, c-format
298 313
 msgid "When debugging it is recommended that you use Foreground mode in %s\n"
299 314
 msgstr ""
300 315
 
301
-#: clamav-milter.c:1542
302
-msgid "So that you can see all of the messages"
303
-msgstr ""
304
-
305
-#: clamav-milter.c:1605
306
-#, c-format
307
-msgid "Starting: %s"
316
+#: clamav-milter.c:1668
317
+msgid "\tso that you can see all of the messages"
308 318
 msgstr ""
309 319
 
310
-#: clamav-milter.c:1610
311
-msgid "Debugging is on"
312
-msgstr ""
313
-
314
-#: clamav-milter.c:1614
315
-#, c-format
316
-msgid ""
317
-"%s: (-q && !LogSyslog): warning - all interception message methods are off\n"
318
-msgstr ""
319
-
320
-#: clamav-milter.c:1618
320
+#: clamav-milter.c:1715
321 321
 msgid "Starting clamav-milter"
322 322
 msgstr ""
323 323
 
324
-#: clamav-milter.c:1627
324
+#: clamav-milter.c:1724
325 325
 #, c-format
326 326
 msgid "Can't save PID in file %s"
327 327
 msgstr ""
328 328
 
329
-#: clamav-milter.c:1629
329
+#: clamav-milter.c:1726
330 330
 #, c-format
331 331
 msgid "Can't save PID in file %s\n"
332 332
 msgstr ""
333 333
 
334
-#: clamav-milter.c:1657
334
+#: clamav-milter.c:1754
335 335
 #, c-format
336 336
 msgid "%s: smfi_setconn failed\n"
337 337
 msgstr ""
338 338
 
339
-#: clamav-milter.c:1670
339
+#: clamav-milter.c:1768
340 340
 #, c-format
341
-msgid "Started: %s"
341
+msgid "Starting: %s"
342
+msgstr ""
343
+
344
+#: clamav-milter.c:1773
345
+msgid "Debugging is on"
342 346
 msgstr ""
343 347
 
344
-#: clamav-milter.c:1720 clamav-milter.c:1964
348
+#: clamav-milter.c:1827 clamav-milter.c:2071
345 349
 #, c-format
346 350
 msgid "Check clamd server %s - it may be down\n"
347 351
 msgstr ""
348 352
 
349
-#: clamav-milter.c:1725 clamav-milter.c:1973
353
+#: clamav-milter.c:1832 clamav-milter.c:2080
350 354
 msgid "Check clamd server - it may be down\n"
351 355
 msgstr ""
352 356
 
353
-#: clamav-milter.c:1890
357
+#: clamav-milter.c:1997
354 358
 msgid "No free clamd sessions\n"
355 359
 msgstr ""
356 360
 
357
-#: clamav-milter.c:1967
361
+#: clamav-milter.c:2074
358 362
 #, c-format
359 363
 msgid "Check clamd server %s - it may be down"
360 364
 msgstr ""
361 365
 
362
-#: clamav-milter.c:2009
366
+#: clamav-milter.c:2116
363 367
 msgid "findServer: select failed"
364 368
 msgstr ""
365 369
 
366
-#: clamav-milter.c:2018
370
+#: clamav-milter.c:2125
367 371
 #, c-format
368 372
 msgid "findServer: using server %d\n"
369 373
 msgstr ""
370 374
 
371
-#: clamav-milter.c:2023
375
+#: clamav-milter.c:2130
372 376
 msgid "findServer: No response from any server\n"
373 377
 msgstr ""
374 378
 
375
-#: clamav-milter.c:2025
379
+#: clamav-milter.c:2132
376 380
 msgid "findServer: No response from any server"
377 381
 msgstr ""
378 382
 
379
-#: clamav-milter.c:2046
383
+#: clamav-milter.c:2153
380 384
 msgid "clamfi_connect: ctx is null"
381 385
 msgstr ""
382 386
 
383
-#: clamav-milter.c:2051
387
+#: clamav-milter.c:2158
384 388
 msgid "clamfi_connect: hostname is null"
385 389
 msgstr ""
386 390
 
387
-#: clamav-milter.c:2072
391
+#: clamav-milter.c:2179
388 392
 msgid "clamfi_connect: remoteIP is null"
389 393
 msgstr ""
390 394
 
391
-#: clamav-milter.c:2080
395
+#: clamav-milter.c:2187
392 396
 #, c-format
393 397
 msgid "clamfi_connect: connection from %s [%s]"
394 398
 msgstr ""
395 399
 
396
-#: clamav-milter.c:2081
400
+#: clamav-milter.c:2188
397 401
 #, c-format
398 402
 msgid "clamfi_connect: connection from %s [%s]\n"
399 403
 msgstr ""
400 404
 
401
-#: clamav-milter.c:2100
405
+#: clamav-milter.c:2207
402 406
 msgid "Can't get sendmail hostname"
403 407
 msgstr ""
404 408
 
405
-#: clamav-milter.c:2105
409
+#: clamav-milter.c:2212
406 410
 #, c-format
407 411
 msgid "Access Denied: Host Unknown (%s)"
408 412
 msgstr ""
409 413
 
410
-#: clamav-milter.c:2115
414
+#: clamav-milter.c:2222
411 415
 #, c-format
412 416
 msgid "Access Denied: Can't get IP address for (%s)"
413 417
 msgstr ""
414 418
 
415
-#: clamav-milter.c:2132
419
+#: clamav-milter.c:2239
416 420
 #, c-format
417 421
 msgid "Access Denied for %s[%s]"
418 422
 msgstr ""
419 423
 
420
-#: clamav-milter.c:2150
424
+#: clamav-milter.c:2257
421 425
 msgid "clamfi_connect: not scanning outgoing messages"
422 426
 msgstr ""
423 427
 
424
-#: clamav-milter.c:2151
428
+#: clamav-milter.c:2258
425 429
 msgid "clamfi_connect: not scanning outgoing messages\n"
426 430
 msgstr ""
427 431
 
428
-#: clamav-milter.c:2159
432
+#: clamav-milter.c:2266
429 433
 msgid "clamfi_connect: not scanning local messages"
430 434
 msgstr ""
431 435
 
432
-#: clamav-milter.c:2160
436
+#: clamav-milter.c:2267
433 437
 msgid "clamfi_connect: not scanning local messages\n"
434 438
 msgstr ""
435 439
 
436
-#: clamav-milter.c:2194
440
+#: clamav-milter.c:2301
437 441
 #, c-format
438 442
 msgid "hit max-children limit (%u >= %u)\n"
439 443
 msgstr ""
440 444
 
441
-#: clamav-milter.c:2195
445
+#: clamav-milter.c:2302
442 446
 #, c-format
443 447
 msgid "hit max-children limit (%u >= %u): waiting for some to exit\n"
444 448
 msgstr ""
445 449
 
446
-#: clamav-milter.c:2201
450
+#: clamav-milter.c:2308
447 451
 #, c-format
448 452
 msgid "hit max-children limit (%u >= %u)"
449 453
 msgstr ""
450 454
 
451
-#: clamav-milter.c:2202
455
+#: clamav-milter.c:2309
452 456
 #, c-format
453 457
 msgid "hit max-children limit (%u >= %u): waiting for some to exit"
454 458
 msgstr ""
455 459
 
456
-#: clamav-milter.c:2207
460
+#: clamav-milter.c:2314
457 461
 msgid "AV system temporarily overloaded - please try later"
458 462
 msgstr ""
459 463
 
460
-#: clamav-milter.c:2237
464
+#: clamav-milter.c:2344
461 465
 #, c-format
462 466
 msgid ">n_children = %d\n"
463 467
 msgstr ""
464 468
 
465
-#: clamav-milter.c:2243
469
+#: clamav-milter.c:2350
466 470
 msgid "Timeout waiting for a child to die"
467 471
 msgstr ""
468 472
 
469
-#: clamav-milter.c:2245
473
+#: clamav-milter.c:2352
470 474
 msgid "Timeout waiting for a child to die\n"
471 475
 msgstr ""
472 476
 
473
-#: clamav-milter.c:2377
477
+#: clamav-milter.c:2462
478
+#, c-format
479
+msgid "Failed to delete X-Virus-Status header %d"
480
+msgstr ""
481
+
482
+#: clamav-milter.c:2490
474 483
 msgid "clamfi_eoh"
475 484
 msgstr ""
476 485
 
477
-#: clamav-milter.c:2380
486
+#: clamav-milter.c:2493
478 487
 msgid "clamfi_eoh\n"
479 488
 msgstr ""
480 489
 
481
-#: clamav-milter.c:2437
490
+#: clamav-milter.c:2550
482 491
 msgid "clamfi_eoh: ignoring whitelisted message"
483 492
 msgstr ""
484 493
 
485
-#: clamav-milter.c:2439
486
-msgid "clamfi_eoh: not scanning outgoing messages\n"
494
+#: clamav-milter.c:2552
495
+msgid "clamfi_eoh: ignoring whitelisted message\n"
487 496
 msgstr ""
488 497
 
489
-#: clamav-milter.c:2453
498
+#: clamav-milter.c:2566
490 499
 #, c-format
491 500
 msgid "clamfi_envbody: %u bytes"
492 501
 msgstr ""
493 502
 
494
-#: clamav-milter.c:2455
503
+#: clamav-milter.c:2568
495 504
 #, c-format
496 505
 msgid "clamfi_envbody: %u bytes\n"
497 506
 msgstr ""
498 507
 
499
-#: clamav-milter.c:2465 clamav-milter.c:2693
508
+#: clamav-milter.c:2578 clamav-milter.c:2837
500 509
 #, c-format
501 510
 msgid "%s: Message more than StreamMaxLength (%ld) bytes - not scanned"
502 511
 msgstr ""
503 512
 
504
-#: clamav-milter.c:2469 clamav-milter.c:2696
513
+#: clamav-milter.c:2582 clamav-milter.c:2840
505 514
 msgid "Not Scanned - StreamMaxLength exceeded"
506 515
 msgstr ""
507 516
 
508
-#: clamav-milter.c:2544 clamav-milter.c:2566 clamav-milter.c:3619
509
-#: clamav-milter.c:3626
517
+#: clamav-milter.c:2681 clamav-milter.c:2703 clamav-milter.c:3765
518
+#: clamav-milter.c:3772
510 519
 msgid "send failed to clamd"
511 520
 msgstr ""
512 521
 
513
-#: clamav-milter.c:2587
522
+#: clamav-milter.c:2719
523
+#, c-format
524
+msgid "Wating to read status from fd %d\n"
525
+msgstr ""
526
+
527
+#: clamav-milter.c:2730
514 528
 #, c-format
515 529
 msgid "clamfi_eom: read %s"
516 530
 msgstr ""
517 531
 
518
-#: clamav-milter.c:2588
532
+#: clamav-milter.c:2731
519 533
 #, c-format
520 534
 msgid "clamfi_eom: read %s\n"
521 535
 msgstr ""
522 536
 
523
-#: clamav-milter.c:2596
537
+#: clamav-milter.c:2739
524 538
 msgid "clamfi_eom: read nothing from clamd"
525 539
 msgstr ""
526 540
 
527
-#: clamav-milter.c:2598
541
+#: clamav-milter.c:2741
528 542
 msgid "clamfi_eom: read nothing from clamd\n"
529 543
 msgstr ""
530 544
 
531
-#: clamav-milter.c:2642 clamav-milter.c:2682
545
+#: clamav-milter.c:2786 clamav-milter.c:2826
532 546
 msgid "Error determining host"
533 547
 msgstr ""
534 548
 
535
-#: clamav-milter.c:2701
549
+#: clamav-milter.c:2845
536 550
 msgid "Not Scanned"
537 551
 msgstr ""
538 552
 
539
-#: clamav-milter.c:2709
540
-msgid "Clean"
541
-msgstr ""
542
-
543
-#: clamav-milter.c:2713
544
-#, c-format
545
-msgid "%s: clean message from %s"
546
-msgstr ""
547
-
548
-#: clamav-milter.c:2715
549
-msgid "an unknown sender"
550
-msgstr ""
551
-
552
-#: clamav-milter.c:2749
553
+#: clamav-milter.c:2867
553 554
 msgid "Infected"
554 555
 msgstr ""
555 556
 
556
-#: clamav-milter.c:2767
557
+#: clamav-milter.c:2885
557 558
 #, c-format
558 559
 msgid "Intercepted virus from %s to"
559 560
 msgstr ""
560 561
 
561
-#: clamav-milter.c:2861
562
+#: clamav-milter.c:2979
562 563
 msgid ""
563 564
 "Subject: Virus intercepted\n"
564 565
 "\n"
565 566
 msgstr ""
566 567
 
567
-#: clamav-milter.c:2883
568
+#: clamav-milter.c:3001
568 569
 msgid "A message you sent to\n"
569 570
 msgstr ""
570 571
 
571
-#: clamav-milter.c:2890
572
+#: clamav-milter.c:3008
572 573
 #, c-format
573 574
 msgid "The message %1$s sent from %2$s to\n"
574 575
 msgstr ""
575 576
 
576
-#: clamav-milter.c:2893
577
+#: clamav-milter.c:3011
577 578
 #, c-format
578 579
 msgid "A message sent from %s to\n"
579 580
 msgstr ""
580 581
 
581
-#: clamav-milter.c:2898
582
+#: clamav-milter.c:3016
582 583
 #, c-format
583 584
 msgid "contained %s and has not been delivered.\n"
584 585
 msgstr ""
585 586
 
586
-#: clamav-milter.c:2902
587
+#: clamav-milter.c:3020
587 588
 #, c-format
588 589
 msgid ""
589 590
 "\n"
590 591
 "The message in question has been quarantined as %s\n"
591 592
 msgstr ""
592 593
 
593
-#: clamav-milter.c:2905
594
+#: clamav-milter.c:3023
594 595
 #, c-format
595 596
 msgid ""
596 597
 "\n"
... ...
@@ -598,13 +599,13 @@ msgid ""
598 598
 "\n"
599 599
 msgstr ""
600 600
 
601
-#: clamav-milter.c:2908
601
+#: clamav-milter.c:3026
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:2921
607
+#: clamav-milter.c:3039
608 608
 #, c-format
609 609
 msgid ""
610 610
 "\n"
... ...
@@ -612,180 +613,206 @@ msgid ""
612 612
 "%s\t\n"
613 613
 msgstr ""
614 614
 
615
-#: clamav-milter.c:2932
615
+#: clamav-milter.c:3050
616 616
 #, c-format
617 617
 msgid "Quarantined infected mail as %s"
618 618
 msgstr ""
619 619
 
620
-#: clamav-milter.c:2956
620
+#: clamav-milter.c:3074
621 621
 #, c-format
622 622
 msgid "Can't set quarantine user %s"
623 623
 msgstr ""
624 624
 
625
-#: clamav-milter.c:2958
625
+#: clamav-milter.c:3076
626 626
 #, c-format
627 627
 msgid "Can't set quarantine user %s\n"
628 628
 msgstr ""
629 629
 
630
-#: clamav-milter.c:2971
630
+#: clamav-milter.c:3089
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:3055
635
+#: clamav-milter.c:3094
636
+msgid "Unknown"
637
+msgstr ""
638
+
639
+#: clamav-milter.c:3096
640
+#, c-format
641
+msgid "%s: incorrect message \"%s\" from clamd"
642
+msgstr ""
643
+
644
+#: clamav-milter.c:3102
645
+msgid "Clean"
646
+msgstr ""
647
+
648
+#: clamav-milter.c:3106
649
+#, c-format
650
+msgid "%s: clean message from %s"
651
+msgstr ""
652
+
653
+#: clamav-milter.c:3108
654
+msgid "an unknown sender"
655
+msgstr ""
656
+
657
+#: clamav-milter.c:3207
636 658
 #, c-format
637 659
 msgid "Can't remove clean file %s"
638 660
 msgstr ""
639 661
 
640
-#: clamav-milter.c:3227 clamav-milter.c:3230
662
+#: clamav-milter.c:3387 clamav-milter.c:3390
641 663
 #, c-format
642 664
 msgid "write failure (%u bytes) to %s: %s"
643 665
 msgstr ""
644 666
 
645
-#: clamav-milter.c:3244 clamav-milter.c:3247
667
+#: clamav-milter.c:3404 clamav-milter.c:3407
646 668
 #, c-format
647 669
 msgid "write failure (%u bytes) to clamd: %s"
648 670
 msgstr ""
649 671
 
650
-#: clamav-milter.c:3313
672
+#: clamav-milter.c:3473
651 673
 #, c-format
652 674
 msgid "No data received from clamd in %d seconds\n"
653 675
 msgstr ""
654 676
 
655
-#: clamav-milter.c:3335
677
+#: clamav-milter.c:3495
656 678
 #, c-format
657 679
 msgid "Can't stat %s"
658 680
 msgstr ""
659 681
 
660
-#: clamav-milter.c:3346 clamav-milter.c:3782
682
+#: clamav-milter.c:3506 clamav-milter.c:3933
661 683
 #, c-format
662 684
 msgid "Can't open %s"
663 685
 msgstr ""
664 686
 
665
-#: clamav-milter.c:3485
687
+#: clamav-milter.c:3641
666 688
 #, c-format
667 689
 msgid "mkdir %s failed"
668 690
 msgstr ""
669 691
 
670
-#: clamav-milter.c:3498
692
+#: clamav-milter.c:3654
671 693
 #, c-format
672 694
 msgid "mktemp %s failed"
673 695
 msgstr ""
674 696
 
675
-#: clamav-milter.c:3508
697
+#: clamav-milter.c:3664
676 698
 #, c-format
677 699
 msgid "Temporary quarantine file %s creation failed"
678 700
 msgstr ""
679 701
 
680
-#: clamav-milter.c:3638
702
+#: clamav-milter.c:3784
681 703
 msgid "failed to create TCPSocket to talk to clamd"
682 704
 msgstr ""
683 705
 
684
-#: clamav-milter.c:3649 clamav-milter.c:3660
706
+#: clamav-milter.c:3795 clamav-milter.c:3806
685 707
 msgid "recv failed from clamd getting PORT"
686 708
 msgstr ""
687 709
 
688
-#: clamav-milter.c:3671
710
+#: clamav-milter.c:3817
689 711
 #, c-format
690 712
 msgid "Expected port information from clamd, got '%s'"
691 713
 msgstr ""
692 714
 
693
-#: clamav-milter.c:3674
715
+#: clamav-milter.c:3820
694 716
 #, c-format
695 717
 msgid "Expected port information from clamd, got '%s'\n"
696 718
 msgstr ""
697 719
 
698
-#: clamav-milter.c:3694
720
+#: clamav-milter.c:3841 clamav-milter.c:3844
699 721
 #, c-format
700
-msgid "Connecting to local port %d\n"
722
+msgid "Connecting to local port %d - data %d cmd %d\n"
701 723
 msgstr ""
702 724
 
703
-#: clamav-milter.c:3705 clamav-milter.c:3708
725
+#: clamav-milter.c:3857 clamav-milter.c:3860
704 726
 #, c-format
705 727
 msgid "Failed to connect to port %d given by clamd: %s"
706 728
 msgstr ""
707 729
 
708
-#: clamav-milter.c:3794
730
+#: clamav-milter.c:3945
709 731
 #, c-format
710 732
 msgid "Clamd (pid %d) seems to have died"
711 733
 msgstr ""
712 734
 
713
-#: clamav-milter.c:3820
735
+#: clamav-milter.c:3971
714 736
 #, c-format
715 737
 msgid "Can't open e-mail template file %s"
716 738
 msgstr ""
717 739
 
718
-#: clamav-milter.c:3829
740
+#: clamav-milter.c:3980
719 741
 #, c-format
720 742
 msgid "Can't stat e-mail template file %s"
721 743
 msgstr ""
722 744
 
723
-#: clamav-milter.c:3838
745
+#: clamav-milter.c:3989
724 746
 msgid "Out of memory"
725 747
 msgstr ""
726 748
 
727
-#: clamav-milter.c:3865
749
+#: clamav-milter.c:4016
728 750
 #, c-format
729 751
 msgid "%s: Unknown clamAV variable \"%c\"\n"
730 752
 msgstr ""
731 753
 
732
-#: clamav-milter.c:3876
754
+#: clamav-milter.c:4027
733 755
 #, c-format
734 756
 msgid "%s: Unterminated sendmail variable \"%s\"\n"
735 757
 msgstr ""
736 758
 
737
-#: clamav-milter.c:3887
759
+#: clamav-milter.c:4038
738 760
 #, c-format
739 761
 msgid "%s: Unknown sendmail variable \"%s\"\n"
740 762
 msgstr ""
741 763
 
742
-#: clamav-milter.c:3953
764
+#: clamav-milter.c:4104
743 765
 #, c-format
744 766
 msgid "Can't rename %1$s to %2$s"
745 767
 msgstr ""
746 768
 
747
-#: clamav-milter.c:3977
769
+#: clamav-milter.c:4128
748 770
 #, c-format
749 771
 msgid "[Virus] %s"
750 772
 msgstr ""
751 773
 
752
-#: clamav-milter.c:4070
774
+#: clamav-milter.c:4221
753 775
 msgid ""
754 776
 "No response from any clamd server - your AV system is not scanning emails\n"
755 777
 msgstr ""
756 778
 
757
-#: clamav-milter.c:4073
779
+#: clamav-milter.c:4224
758 780
 msgid ""
759 781
 "No response from any clamd server - your AV system is not scanning emails"
760 782
 msgstr ""
761 783
 
762
-#: clamav-milter.c:4091
784
+#: clamav-milter.c:4242
763 785
 msgid "Subject: ClamAV Down\n"
764 786
 msgstr ""
765 787
 
766
-#: clamav-milter.c:4094
788
+#: clamav-milter.c:4245
767 789
 msgid ""
768 790
 "This is an automatic message\n"
769 791
 "\n"
770 792
 msgstr ""
771 793
 
772
-#: clamav-milter.c:4097
794
+#: clamav-milter.c:4248
773 795
 msgid "The clamd program cannot be contacted.\n"
774 796
 msgstr ""
775 797
 
776
-#: clamav-milter.c:4099
798
+#: clamav-milter.c:4250
777 799
 msgid "No clamd server can be contacted.\n"
778 800
 msgstr ""
779 801
 
780
-#: clamav-milter.c:4101
802
+#: clamav-milter.c:4252
781 803
 msgid "Emails may not be being scanned, please check your servers.\n"
782 804
 msgstr ""
783 805
 
784
-#: clamav-milter.c:4332 clamav-milter.c:4363
806
+#: clamav-milter.c:4314
807
+msgid "Freshclam has been run - please restart clamav-milter\n"
808
+msgstr ""
809
+
810
+#: clamav-milter.c:4491
785 811
 #, c-format
786 812
 msgid "Stopping %s"
787 813
 msgstr ""
788 814
 
789
-#: clamav-milter.c:4369
815
+#: clamav-milter.c:4532
790 816
 msgid "Stopping clamav-milter"
791 817
 msgstr ""
... ...
@@ -89,6 +89,13 @@ generally causes the message to remain in the queue.
89 89
 Always scan, whereever the message came from (see also --local and --outgoing).
90 90
 You probably don't want this.
91 91
 .TP
92
+\fB-I, \-\-internal\fR
93
+Usually clamav\-milter uses an external program such as clamd(8) running
94
+either on the local server or other server(s) to perform
95
+the scanning.
96
+The \-\-internal flag tells clamav\-milter to scan the emails itself without
97
+the use of an external program.
98
+.TP
92 99
 \fB-l, \-\-local\fR
93 100
 Also scan messages sent from LAN. You probably want this especially if
94 101
 your LAN is populated by machines running Windows or DOS.