commit f44e90793792adb1053df7627fdc79d33af0027f
parent 14138b3923ba0d41913d7331e9adc51040df063e
Author: nibble <unknown>
Date:   Mon,  2 Nov 2009 13:18:45 +0100
* Added dmc-filter
  - add/remove/modify headers
  - filter headers/body
* Added dmc-filter into Makefile
Diffstat:
2 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
@@ -8,7 +8,7 @@ endif
 CFLAGS+=-DHAVE_SSL=${HAVE_SSL}
 CFLAGS+=-DVERSION=\"${VERSION}\"
 
-BINS=dmc-mbox dmc-smtp dmc-pop3 dmc-imap4 dmc-pack dmc-mbox
+BINS=dmc-mbox dmc-smtp dmc-pop3 dmc-imap4 dmc-pack dmc-filter dmc-mbox
 
 all: config.mk ${BINS}
 
@@ -26,6 +26,9 @@ dmc-mbox: mbox.o
 dmc-pack: pack.o
 	${CC} ${LDFLAGS} pack.o -o dmc-pack
 
+dmc-filter: filter.o
+	${CC} ${LDFLAGS} filter.o -o dmc-filter
+
 dmc-pop3: pop3.o
 	${CC} ${LDFLAGS} ${SSL_LIBS} pop3.o -o dmc-pop3
 
@@ -41,6 +44,7 @@ install:
 	cp -f dmc-pop3 ${PREFIX}/bin
 	cp -f dmc-imap4 ${PREFIX}/bin
 	cp -f dmc-pack ${PREFIX}/bin
+	cp -f dmc-filter ${PREFIX}/bin
 	cp -f dmc-mbox ${PREFIX}/bin
 	cp -f dmc-mdir ${PREFIX}/bin
 
diff --git a/filter.c b/filter.c
@@ -0,0 +1,43 @@
+/* dmc :: Copyleft -- nibble (at) develsec (dot) org */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main (int argc, char **argv)
+{
+	char b[1024], *ptr;
+	int edit = argc, print, i;
+
+	for (i = 0; i < argc; i++)
+		if (!strcmp (argv[i], "-h")) {
+			printf ("usage: [fields | :] %s [-he] [new fields]\n", argv[0]);
+			return 1;
+		} else if (!strcmp (argv[i], "-e"))
+			edit = i + 1;
+
+	memset (b, '\0', 1024);
+	/* Headers */
+	while (fgets (b, 1023, stdin) && b[0] != '\n')
+		for (i = 0, print = 1; i < edit && argv[i]; i++)
+			if (strstr (b, argv[i])) {
+				for (i = edit; i < argc && argv[i]; i++)
+					if ((ptr = strchr (argv[i], ':')) &&
+						!strncmp (b, argv[i], ptr - argv[i])) {
+						if (ptr[1] != '\0')
+							puts (argv[i]);
+						argv[i][0] = '\0';
+						print = 0;
+					}
+				if (print) fputs (b, stdout);
+			}
+	/* New Headers */
+	for (i = edit; i < argc; i++)
+		if ((ptr = strchr (argv[i], ':')) && ptr[1] != '\0') puts (argv[i]);
+	if (edit < argc)
+		puts ("");
+	/* Body */
+	while ((argc < 2 || edit < argc) && fgets (b, 1023, stdin))
+		fputs (b, stdout);
+	return 0;
+}