commit b3b81916fc31048e89e418a5538d1f8812814479
parent fafa0402f5075a10dd4791c4f5b924f10c7db13d
Author: Christoph Lohmann <20h@r-36.net>
Date:   Sun, 14 Jun 2020 11:53:13 +0200
Better feature selection for libmilter.
Diffstat:
| bmf-milter.c | | | 124 | +++++++++++++++++++++++++++++++++++++------------------------------------------ | 
1 file changed, 58 insertions(+), 66 deletions(-)
diff --git a/bmf-milter.c b/bmf-milter.c
@@ -16,6 +16,7 @@
 #include <signal.h>
 
 #include "libmilter/mfapi.h"
+#include "libmilter/mfdef.h"
 
 #include "arg.h"
 
@@ -28,16 +29,40 @@ struct Priv
 
 #define MLFIPRIV ((struct Priv *) smfi_getpriv(ctx))
 
-extern sfsistat	mlfi_cleanup(SMFICTX *);
+sfsistat
+mlfi_cleanup(SMFICTX *ctx)
+{
+	struct Priv *priv = MLFIPRIV;
+	int retcode = -1;
+
+	fprintf(stderr, "mlfi_cleanup\n");
+
+	if (priv == NULL)
+		return SMFIS_CONTINUE;
+
+	close(priv->execpipe[1]);
+	waitpid(priv->execpid, &retcode, 0);
+
+	if (retcode == 0) {
+		if (smfi_addheader(ctx, "X-Spam-Flag", "YES") == MI_FAILURE)
+			return SMFIS_TEMPFAIL;
+		if (smfi_addheader(ctx, "X-BMF-Processed",
+					"YES") == MI_FAILURE) {
+			return SMFIS_TEMPFAIL;
+		}
+	}
+
+	return SMFIS_CONTINUE;
+}
 
 sfsistat
-mlfi_connect(SMFICTX *ctx, char *hostname, _SOCK_ADDR *hostaddr)
+mlfi_helo(SMFICTX *ctx, char *helohost)
 {
 	struct Priv *priv;
 	char *ident;
 	int pid;
 
-	printf("mlfi_connect(%s)\n", hostname);
+	fprintf(stderr, "mlfi_helo(%s)\n", helohost);
 
 	priv = malloc(sizeof *priv);
 	if (priv == NULL)
@@ -75,19 +100,11 @@ mlfi_connect(SMFICTX *ctx, char *hostname, _SOCK_ADDR *hostaddr)
 }
 
 sfsistat
-mlfi_helo(SMFICTX *ctx, char *helohost)
-{
-	printf("mlfi_help\n");
-
-	return SMFIS_CONTINUE;
-}
-
-sfsistat
 mlfi_envfrom(SMFICTX *ctx, char *argv[])
 {
 	struct Priv *priv = MLFIPRIV;
 
-	printf("mlfi_envfrom(%s)\n", argv[0]);
+	fprintf(stderr, "mlfi_envfrom(%s)\n", argv[0]);
 
 	dprintf(priv->execpipe[1], "From: %s\n", argv[0]);
 
@@ -99,7 +116,7 @@ mlfi_envrcpt(SMFICTX *ctx, char *argv[])
 {
 	struct Priv *priv = MLFIPRIV;
 
-	printf("mfli_envrcpt(%s)\n", argv[0]);
+	fprintf(stderr, "mfli_envrcpt(%s)\n", argv[0]);
 
 	dprintf(priv->execpipe[1], "To: %s\n", argv[0]);
 
@@ -111,7 +128,7 @@ mlfi_header(SMFICTX *ctx, char *headerf, char *headerv)
 {
 	struct Priv *priv = MLFIPRIV;
 
-	printf("mlfi_header(%s = '%s')\n", headerf, headerv);
+	fprintf(stderr, "mlfi_header(%s = '%s')\n", headerf, headerv);
 
 	dprintf(priv->execpipe[1], "%s: %s\n", headerf, headerv);
 
@@ -123,9 +140,9 @@ mlfi_eoh(SMFICTX *ctx)
 {
 	struct Priv *priv = MLFIPRIV;
 
-	printf("mlfi_eoh\n");
+	fprintf(stderr, "mlfi_eoh\n");
 
-	dprintf(priv->execpipe[1], "\n");
+	dprintf(priv->execpipe[1], "\r\n");
 
 	return SMFIS_CONTINUE;
 }
@@ -136,7 +153,7 @@ mlfi_body(SMFICTX *ctx, unsigned char *bodyp, size_t bodylen)
         struct Priv *priv = MLFIPRIV;
 	int written;
 
-	printf("mlfi_body(%ld bytes)\n", bodylen);
+	fprintf(stderr, "mlfi_body(%ld bytes)\n", bodylen);
 
 	for (int written = 0, rw = 0; written <= bodylen; written += rw)
 		rw = write(priv->execpipe[1], bodyp+written, bodylen-written);
@@ -147,49 +164,23 @@ mlfi_body(SMFICTX *ctx, unsigned char *bodyp, size_t bodylen)
 sfsistat
 mlfi_eom(SMFICTX *ctx)
 {
-	printf("mlfi_eom\n");
+	fprintf(stderr, "mlfi_eom\n");
 	return mlfi_cleanup(ctx);
 }
 
 sfsistat
 mlfi_abort(SMFICTX *ctx)
 {
-	printf("mlfi_abort\n");
+	fprintf(stderr, "mlfi_abort\n");
 	return mlfi_cleanup(ctx);
 }
 
 sfsistat
-mlfi_cleanup(SMFICTX *ctx)
-{
-	struct Priv *priv = MLFIPRIV;
-	int retcode = -1;
-
-	printf("mlfi_cleanup\n");
-
-	if (priv == NULL)
-		return SMFIS_CONTINUE;
-
-	close(priv->execpipe[1]);
-	waitpid(priv->execpid, &retcode, 0);
-
-	if (retcode == 0) {
-		if (smfi_addheader(ctx, "X-Spam-Flag", "YES") == MI_FAILURE)
-			return SMFIS_TEMPFAIL;
-		if (smfi_addheader(ctx, "X-BMF-Processed",
-					"YES") == MI_FAILURE) {
-			return SMFIS_TEMPFAIL;
-		}
-	}
-
-	return SMFIS_CONTINUE;
-}
-
-sfsistat
 mlfi_close(SMFICTX *ctx)
 {
 	struct Priv *priv = MLFIPRIV;
 
-	printf("mlfi_close\n");
+	fprintf(stderr, "mlfi_close\n");
 
 	if (priv != NULL) {
 		if (priv->execpipe[1] != 0)
@@ -204,20 +195,6 @@ mlfi_close(SMFICTX *ctx)
 }
 
 sfsistat
-mlfi_unknown(SMFICTX *ctx, const char *cmd)
-{
-	printf("mlfi_unknown(%s)\n", cmd);
-	return SMFIS_CONTINUE;
-}
-
-sfsistat
-mlfi_data(SMFICTX * ctx)
-{
-	printf("mlfi_data\n");
-	return SMFIS_CONTINUE;
-}
-
-sfsistat
 mlfi_negotiate(SMFICTX *ctx,
 		unsigned long f0,
 		unsigned long f1,
@@ -228,8 +205,23 @@ mlfi_negotiate(SMFICTX *ctx,
 		unsigned long *pf2,
 		unsigned long *pf3)
 {
-	printf("mfli_negotiate\n");
-	return SMFIS_ALL_OPTS;
+	fprintf(stderr, "mlfi_negotiate\n");
+
+	/* milter actions */
+	*pf0 = 0;
+	if (f0 & SMFIF_ADDHDRS)
+		f0 |= SMFIF_ADDHDRS;
+
+	/* milter protocol steps */
+	*pf1 = f1 & (SMFIP_NOCONNECT|SMFIP_NOUNKNOWN|SMFIP_NODATA);
+	if (f1 & SMFIP_HDR_LEADSPC)
+		*pf1 |= SMFIP_HDR_LEADSPC;
+
+	/* future */
+	*pf2 = 0;
+	*pf3 = 0;
+
+	return SMFIS_CONTINUE;
 }
 
 struct smfiDesc smfilter =
@@ -237,7 +229,7 @@ struct smfiDesc smfilter =
 	"BMF",		/* filter name */
 	SMFI_VERSION,	/* version code -- do not change */
 	SMFIF_ADDHDRS,  /* flags */
-	mlfi_connect,	/* connection info filter */
+	NULL,		/* connection info filter */
 	mlfi_helo,	/* SMTP HELO command filter */
 	mlfi_envfrom,	/* envelope sender filter */
 	mlfi_envrcpt,	/* envelope recipient filter */
@@ -247,8 +239,8 @@ struct smfiDesc smfilter =
 	mlfi_eom,	/* end of message */
 	mlfi_abort,	/* message aborted */
 	mlfi_close,	/* connection cleanup */
-	mlfi_unknown,	/* unknown SMTP commands */
-	mlfi_data,	/* DATA command */
+	NULL,		/* unknown SMTP commands */
+	NULL,		/* DATA command */
 	mlfi_negotiate	/* Once, at the start of each SMTP connection */
 };
 
@@ -284,7 +276,7 @@ main(int argc, char *argv[])
 		return 1;
 	} ARGEND;
 
-	printf("port = %s; timetout = %d;\n", port, timeout);
+	fprintf(stderr, "port = %s; timeout = %d;\n", port, timeout);
 
 	if (smfi_setconn(port) == MI_FAILURE) {
 		perror("smfi_setconn");