Hello, list.

One of the features I was missing in nmh was support for mail filtering
in 'inc'.

I've attached patch against git, which implements this functionality for
POP protocol.

>From a user perspective there is new flag '-slocal', which he can pass
to 'inc', then inc will save each message in temp file, and call 'slocal
-file <file> -verbose'. Man page was updated accordingly.

Can you review the patch and give your opinions and comments on it?

diff --git a/config/config.c b/config/config.c
index 3971d52..594270b 100644
--- a/config/config.c
+++ b/config/config.c
@@ -298,6 +298,12 @@ char *showmimeproc = nmhbindir (/mhshow);
 
 char *showproc = nmhlibdir (/mhl);
 
+/*
+ * Default command to filter mails
+ */
+
+char *slocalproc = nmhlibdir (/slocal);
+
 /* 
  * This program is called by vmh as the back-end to the window management
  * protocol
diff --git a/h/mh.h b/h/mh.h
index 1ecb488..ea7046b 100644
--- a/h/mh.h
+++ b/h/mh.h
@@ -458,6 +458,7 @@ extern char *rmmproc;
 extern char *sendproc;
 extern char *showmimeproc;
 extern char *showproc;
+extern char *slocalproc;
 extern char *usequence;
 extern char *version_num;
 extern char *version_str;
diff --git a/man/inc.man b/man/inc.man
index 8d0a462..493c389 100644
--- a/man/inc.man
+++ b/man/inc.man
@@ -34,6 +34,7 @@ inc \- incorporate new mail
 .RB [ \-nopack ]
 .RB [ \-proxy
 .IR command ]
+.RB [ \-slocal ]
 .RB [ \-sasl " | " \-nosasl ]
 .RB [ \-saslmech
 .IR mechanism ]
@@ -228,6 +229,19 @@ server. The string
 .IR %h
 in the command will be substituted by the hostname to connect to.
 .PP
+If passed the
+.B \-slocal
+switch,
+.B inc
+will save message to temp file and call
+slocal(1)
+command on it to automatically put it to proper folder, according to your rules.
+This switch is not supported with
+.B \-audit
+or
+.B \-pack
+directives.
+.PP
 If
 .B inc
 uses POP, then the
diff --git a/uip/inc.c b/uip/inc.c
index b76f1cd..7c824f1 100644
--- a/uip/inc.c
+++ b/uip/inc.c
@@ -68,6 +68,7 @@
     X("nosasl", SASLminc(-6), NOSASLSW) \
     X("saslmech", SASLminc(-8), SASLMECHSW) \
     X("proxy command", 0, PROXYSW) \
+    X("slocal", 0, SLOCSW) \
 
 #define X(sw, minchars, id) id,
 DEFINE_SWITCH_ENUM(INC);
@@ -174,6 +175,7 @@ main (int argc, char **argv)
     int noisy = 1, width = 0;
     int hghnum = 0, msgnum = 0;
     int sasl = 0;
+    int slocal = 0;
     int incerr = 0; /* <0 if inc hits an error which means it should not truncate mailspool */
     char *cp, *maildir = NULL, *folder = NULL;
     char *format = NULL, *form = NULL;
@@ -345,6 +347,10 @@ main (int argc, char **argv)
 		if (!(proxy = *argp++) || *proxy == '-')
 		    adios (NULL, "missing argument to %s", argp[-2]);
 		continue;
+
+	    case SLOCSW:
+		slocal = 1;
+		continue;
 	    }
 	}
 	if (*cp == '+' || *cp == '@') {
@@ -377,6 +383,16 @@ main (int argc, char **argv)
 	inc_type = INC_FILE;
 
     /*
+     * Do not allow to start with functionality we won't be able to support
+     */
+    if (slocal && audfile)
+	adios (NULL, "you can't use -slocal and audit at the same time");
+    if (slocal && packfile)
+	adios (NULL, "you can't use -slocal and -packfile at the same time");
+    if (slocal && inc_type != INC_POP)
+	adios (NULL, "you can use -slocal only with POP servers");
+
+    /*
      * Are we getting the mail from
      * a POP server?
      */
@@ -556,7 +572,10 @@ go_to_it:
     nfs = new_fs (form, format, FORMAT);
 
     if (noisy) {
-	printf ("Incorporating new mail into %s...\n\n", folder);
+	if (slocal)
+	    printf ("Incorporating new mail with slocal(1) filtering...\n");
+	else
+	    printf ("Incorporating new mail into %s...\n\n", folder);
 	fflush (stdout);
     }
 
@@ -604,7 +623,12 @@ go_to_it:
 		    adios (packfile, "write error on");
 		fseek (pf, start, SEEK_SET);
 	    } else {
-		cp = getcpy (m_name (msgnum));
+		if (slocal) {
+		    if ((cp = m_mktemps(invo_name, "filt", NULL, NULL)) == NULL)
+		    	adios (NULL, "unable to create temp file");
+		} else
+		    cp = getcpy (m_name (msgnum));
+
 		if ((pf = fopen (cp, "w+")) == NULL)
 		    adios (cp, "unable to write");
 		chmod (cp, m_gmprot ());
@@ -617,6 +641,28 @@ go_to_it:
 		    adios (cp, "write error on");
 		fseek (pf, 0L, SEEK_SET);
 	    }
+	    if (slocal) {
+		int pid;
+		int argnum;
+		char *sloc, **arglist;
+
+		switch (pid = fork()) {
+		case NOTOK:
+		    adios ("fork", "unable to");
+		case OK:
+		    arglist = argsplit (slocalproc, &sloc, &argnum);
+		    arglist[argnum++] = "-file";
+		    arglist[argnum++] = cp;
+		    arglist[argnum++] = "-verbose";
+		    arglist[argnum++] = NULL;
+		    execvp(sloc, arglist);
+		    exit(1);
+		default:
+		    fclose(pf);
+		    free(cp);
+		    continue;
+		}
+	    }
 	    switch (incerr = scan (pf, msgnum, 0, nfs, width,
 			      packfile ? 0 : msgnum == mp->hghmsg + 1 && chgflag,
 			      1, NULL, stop - start, noisy)) {
@@ -674,6 +720,8 @@ go_to_it:
 	    mbx_close (packfile, pd);
 	    pd = NOTOK;
 	}
+	if (slocal)
+	    done (0);
     }
 
     /*
_______________________________________________
Nmh-workers mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/nmh-workers

Reply via email to