]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: Add message_detail_address_parse
authorAki Tuomi <aki.tuomi@dovecot.fi>
Mon, 3 Jul 2017 15:18:36 +0000 (18:18 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 4 Jul 2017 09:03:41 +0000 (12:03 +0300)
Parses e.g. username+foo@domain into
username@domain with detail foo, when
delimiter is set to +

src/lib-mail/message-address.c
src/lib-mail/message-address.h

index 817dd3a7267b1bc42495e035047a37ee1273e6f4..29cac2b6231e5ace59470157ac637bb26476cd43 100644 (file)
@@ -527,3 +527,33 @@ bool message_header_is_address(const char *hdr_name)
        }
        return FALSE;
 }
+
+void message_detail_address_parse(const char *delimiters, const char *address,
+                                 const char **username_r, char *delim_r,
+                                 const char **detail_r)
+{
+       const char *p, *domain;
+       size_t idx;
+
+       *username_r = address;
+       *detail_r = "";
+       *delim_r = '\0';
+
+       domain = strchr(address, '@');
+       /* first character that matches the recipient_delimiter */
+       idx = strcspn(address, delimiters);
+       p = address[idx] != '\0' ? address + idx : NULL;
+
+       if (p != NULL && (domain == NULL || p < domain)) {
+               *delim_r = *p;
+               /* user+detail@domain */
+               *username_r = t_strdup_until(*username_r, p);
+               if (domain == NULL)
+                       *detail_r = p+1;
+               else {
+                       *detail_r = t_strdup_until(p+1, domain);
+                       *username_r = t_strconcat(*username_r, domain, NULL);
+               }
+       }
+}
+
index d9798705412b4980b65c7d185e5c20628c385471..f8e74b45e1f6ef54bbc7557dc8d26c5d0c47ffcc 100644 (file)
@@ -33,4 +33,10 @@ void message_address_write(string_t *str, const struct message_address *addr);
 /* Returns TRUE if header is known to be an address */
 bool message_header_is_address(const char *hdr_name);
 
+/* Parse address+detail@domain into address@domain and detail
+   using given delimiters. Returns used delimiter. */
+void message_detail_address_parse(const char *delimiters, const char *address,
+                                 const char **username_r, char *delim_r,
+                                 const char **detail_r);
+
 #endif