commit d79cf88df178f18663ef6e9102796a18a7a30c69
parent 95f0bdc0f1a4d74ef7fa12c3dc7e768d7cb3b7d0
Author: Christoph Lohmann <20h@r-36.net>
Date:   Sun, 14 Jun 2020 16:21:06 +0200
Add option to set bmf path and database.
Diffstat:
| bmf-milter.c | | | 47 | +++++++++++++++++++++++++++++++---------------- | 
1 file changed, 31 insertions(+), 16 deletions(-)
diff --git a/bmf-milter.c b/bmf-milter.c
@@ -29,6 +29,7 @@
  * message would be rejected.
  */
 int donothing = 0, dodebug = 0;
+char *bmfdb = NULL, *bmfpath = "/usr/bin/bmf";
 
 struct Priv {
 	/* read from execpipe[0], write to execpipe[1] */
@@ -93,8 +94,8 @@ sfsistat
 mlfi_helo(SMFICTX *ctx, char *helohost)
 {
 	struct Priv *priv;
-	char *ident;
-	int pid, nullfd;
+	char *ident, *bmfargs[6];
+	int pid, nullfd, argp;
 
 	if (dodebug)
 		fprintf(stderr, "mlfi_helo(%s)\n", helohost);
@@ -122,6 +123,11 @@ mlfi_helo(SMFICTX *ctx, char *helohost)
 		while(dup2(priv->execpipe[0], 0) < 0 && errno == EINTR);
 		close(priv->execpipe[1]);
 
+		argp = 0;
+		bmfargs[argp++] = "bmf";
+		/* Test for spam mode. */
+		bmfargs[argp++] = "-t";
+
 		if (!dodebug) {
 			nullfd = open("/dev/null", O_WRONLY);
 			if (nullfd < 0) {
@@ -133,18 +139,20 @@ mlfi_helo(SMFICTX *ctx, char *helohost)
 			while(dup2(priv->execpipe[0], 2) < 0
 					&& errno == EINTR);
 
-			if (execl("/usr/bin/bmf", "bmf", "-t",
-					(char *)NULL) < 0) {
-				perror("execl");
-				_exit(1);
-			}
-		} else {
-			/* Run with -v(erbose) for debug. */
-			if (execl("/usr/bin/bmf", "bmf", "-t",
-					"-v", (char *)NULL) < 0) {
-				perror("execl");
-				_exit(1);
-			}
+			/* Verbose for bmf. */
+			bmfargs[argp++] = "-v";
+		}
+
+		if (bmfdb != NULL) {
+			/* Set database directory, if set. */
+			bmfargs[argp++] = "-d";
+			bmfargs[argp++] = bmfdb;
+		}
+		bmfargs[argp++] = NULL;
+
+		if (execv(bmfpath, bmfargs) < 0) {
+			perror("execv");
+			_exit(1);
 		}
 		break;
 	case -1:
@@ -373,8 +381,9 @@ void
 usage(char *argv0)
 {
 	fprintf(stderr,
-		"Usage: %s [-hd] [-v dbglvl] [-p listen] [-t timeout] "
-		"[-u user] [-g group]\n",
+		"Usage: %s [-hd] [-b bmfdb] [-f bmfpath] [-g group] "
+		"[-p portdef] [-t timeout] [-u user] "
+		"[-v loglevel]\n",
 		argv0);
 }
 
@@ -387,9 +396,15 @@ main(int argc, char *argv[])
 	struct group *gr = NULL;
 
 	ARGBEGIN(argv0) {
+	case 'b':
+		bmfdb = EARGF(usage(argv0));
+		break;
 	case 'd':
 		dofork = 0;
 		break;
+	case 'f':
+		bmfpath = EARGF(usage(argv0));
+		break;
 	case 'g':
 		group = EARGF(usage(argv0));
 		break;