commit - 5fdffb49b9198907d9f91b76cf7128286e175a0a
commit + 60e9f82dc81c599272bc0061157850239f54ae10
blob - 27cbf4b7f67fbbc86b56567208bb666bd625c54c
blob + 564c6af238a36e473a73f4985b850478a82eeb02
--- mheader.c
+++ mheader.c
#include "mheader.h"
+#include <stdio.h>
char *
osmtpd_mheader_skip_sp(char *ptr, int optional)
{
}
if (ptr[0] != ']')
return optional ? start : NULL;
+ ptr++;
return osmtpd_mheader_skip_cfws(ptr, 1);
}
return optional ? start : NULL;
return ptr;
}
+
+char *
+osmtpd_mheader_domain_uncomment(char *ptr)
+{
+ char *domain0, *domain, *tmp, *end;
+ if (osmtpd_mheader_skip_dot_atom(ptr, 0) != NULL) {
+ ptr = osmtpd_mheader_skip_cfws(ptr, 1);
+ return strndup(ptr,
+ osmtpd_mheader_skip_dot_atom_text(ptr, 0) - ptr);
+ }
+ if ((tmp = osmtpd_mheader_skip_domain_literal(ptr, 0)) != NULL) {
+ ptr = osmtpd_mheader_skip_cfws(ptr, 1) + 1;
+ domain0 = domain = strndup(ptr, (size_t)(tmp - ptr));
+ if (domain0 == NULL)
+ return NULL;
+ end = domain0 + (tmp - ptr) + 1;
+ domain++;
+ while (1) {
+ tmp = osmtpd_mheader_skip_fws(domain, 1);
+ if (tmp != domain) {
+ memmove(domain, tmp, end - tmp);
+ end -= (tmp - domain);
+ }
+ tmp = osmtpd_mheader_skip_dtext(domain, 0);
+ if (tmp == NULL)
+ break;
+ domain = tmp;
+ }
+ /* domain[0] == ']' */
+ domain[0] = '\0';
+ return domain0;
+ }
+ return strndup(ptr, osmtpd_mheader_skip_obs_domain(ptr, 1) - ptr);
+}
+
/* Return the domain component of the first mailbox */
char *
osmtpd_mheader_from_domain(char *ptr)
ptr = osmtpd_mheader_skip_local_part(ptr, 0);
/* @ */
ptr++;
- tmp = osmtpd_mheader_skip_domain(ptr, 0);
- return strndup(ptr, tmp - ptr);
+ return osmtpd_mheader_domain_uncomment(ptr);
}
if (osmtpd_mheader_skip_addr_spec(ptr, 0) != NULL) {
ptr = osmtpd_mheader_skip_local_part(ptr, 0);
/* @ */
ptr++;
- tmp = osmtpd_mheader_skip_domain(ptr, 0);
- return strndup(ptr, tmp - ptr);
+ return osmtpd_mheader_domain_uncomment(ptr);
}
errno = EINVAL;
return NULL;
blob - 133d5dd0283a4b3a869c7aee1c189e55a74f343c
blob + cb9d13f0089db44805e485e618ff4ad4b686e884
--- mheader.h
+++ mheader.h
char *osmtpd_mheader_skip_angle_addr(char *, int);
char *osmtpd_mheader_skip_name_addr(char *, int);
+char *osmtpd_mheader_domain_uncomment(char *);
char *osmtpd_mheader_from_domain(char *);