+/*
+ * 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;
+}
+