Added support for extracting the realname from an address
authorJoey Schulze <joey@infodrom.org>
Mon, 22 Nov 2004 16:20:56 +0000 (16:20 +0000)
committerJoey Schulze <joey@infodrom.org>
Mon, 22 Nov 2004 16:20:56 +0000 (16:20 +0000)
mbox.c

diff --git a/mbox.c b/mbox.c
index 71944ad..eb70df8 100644 (file)
--- a/mbox.c
+++ b/mbox.c
@@ -22,6 +22,8 @@
 #include <unistd.h>
 #include <string.h>
 #include <strings.h>
+#include <ctype.h>
+#include "output.h"
 
 /* #define FROM_DETECTION */
 
@@ -44,6 +46,87 @@ char *stringcopy(char *dest, const char *src, size_t n)
   return dest;
 }
 
+/*
+ * Strips balanced quotes in the middle of the realname
+ */
+char *strip_quotes(char *name)
+{
+  static char realname[HDR_LEN];
+  char *cpl, *cpr;
+  char *cp, *xp;
+
+  if ((cpl = index(name, '"')) != NULL && (cpr = index(cpl+1, '"')) != NULL) {
+    for (cp=name,xp=realname; *cp && xp < realname+sizeof(realname)-1; cp++) {
+      if (cp != cpl && cp != cpr)
+       *xp++ = *cp;
+    }
+    *xp = '\0';
+    return realname;
+  } else
+    return name;
+}
+
+/*
+ * Extract the realname from a mail address
+ *
+ * From: "Log Kristian Koehntopp" <joey@infodrom.org>
+ * From: "Jérôme" ATHIAS <jerome@athias.fr>
+ * From: frank@kuesterei.ch (=?iso-8859-1?q?Frank_K=FCster?=)
+ * From: root@luonnotar.infodrom.org (Cron Daemon)
+ * From: <JoMaBusch@web.de>
+ * From: root@luonnotar.infodrom.org
+*/
+char *realname(char *from)
+{
+  static char name[HDR_LEN];
+  char *cpl, *cpr;
+
+  name[0] = '\0';
+
+  /* From: REALNAME <login@host.domain> */
+  if ((cpr = index(from, '<')) != NULL && index(from, '>') != NULL) {
+    if (cpr > from) cpr--;
+
+    /* Strip trailing spaces */
+    while (cpr > from && isspace(*cpr)) cpr--;
+
+    /* Strip leading spaces */
+    cpl=from;while (*cpl && isspace(*cpl)) cpl++;
+
+    /* Strip balanced surrounding quotes */
+    if (*cpl == '"' && *cpr == '"') { cpl++;cpr--; }
+
+    if (cpr > cpl) {
+      stringcopy(name, cpl,
+                sizeof(name) < cpr-cpl+2?sizeof(name):cpr-cpl+2);
+
+      if (index(name, '"') != NULL)
+       stringcopy(name, strip_quotes(name), sizeof(name));
+    } else {
+      /* Apparently no realname included */
+      cpl = index(from, '<');
+      cpr = index(from, '>');
+      stringcopy(name, cpl+1,
+                sizeof(name) < cpr-cpl?sizeof(name):cpr-cpl);
+    }
+
+  /* From: login@host.domain (REALNAME) */
+  } else if ((cpl = index(from, '(')) != NULL && (cpr = index(from, ')')) != NULL) {
+    stringcopy(name, cpl+1,
+              sizeof(name) < cpr-cpl?sizeof(name):cpr-cpl);
+
+  /* From: login@host.domain */
+  } else {
+    /* Strip leading spaces */
+    cpl=from;while (*cpl && isspace(*cpl)) cpl++;
+    for (cpr=cpl; *cpr && !isspace(*cpr); cpr++);
+    stringcopy(name, cpl,
+              sizeof(name) < cpr-cpl+1?sizeof(name):cpr-cpl+1);
+  }
+
+  return name;
+}
+
 int inspect_mbox(char *path, char *prefix, off_t size, int opt_flags)
 {
   FILE *f;
@@ -55,6 +138,7 @@ int inspect_mbox(char *path, char *prefix, off_t size, int opt_flags)
 
   char from_[HDR_LEN] = "";
   char from[HDR_LEN] = "";
+  char realfrom[HDR_LEN] = "";
 #ifdef FROM_DETECTION
   char to[HDR_LEN] = "";
 #endif
@@ -84,7 +168,14 @@ int inspect_mbox(char *path, char *prefix, off_t size, int opt_flags)
        inheader = 0;
        newmail = 1;
 
-       /* TODO: display header */
+       if (strlen(from))
+         stringcopy(realfrom, realname(from), sizeof(realfrom));
+#ifdef todo
+       else
+         stringcopy(realfrom, reduce_from_(from_), sizeof(realfrom));
+#endif
+
+       emit(prefix, realfrom, subject, priority, opt_flags);
 
 #ifdef FROM_DETECTION
        from_[0] = from[0] = to[0] = subject[0] = '\0';
@@ -112,7 +203,6 @@ int inspect_mbox(char *path, char *prefix, off_t size, int opt_flags)
       inheader = 1;
       stringcopy(from_, buf+5, sizeof(from_));
     }
-
   }
 
   return newmail;