2 * Copyright (c) 2020 Martijn van Duren <martijn@openbsd.org>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
27 /* RFC 5234 - Augmented BNF for Syntax Specifications: ABNF */
29 osmtpd_ltok_skip_alpha(const char *ptr, int optional)
31 if ((ptr[0] >= 0x41 && ptr[0] <= 0x5a) ||
32 (ptr[0] >= 0x61 && ptr[0] <= 0x7a))
34 return optional ? ptr : NULL;
38 osmtpd_ltok_skip_bit(const char *ptr, int optional)
40 if (ptr[0] == '0' || ptr[0] == '1')
42 return optional ? ptr : NULL;
46 osmtpd_ltok_skip_char(const char *ptr, int optional)
48 if (ptr[0] >= 0x01 && ptr[0] <= 0x7f)
50 return optional ? ptr : NULL;
54 osmtpd_ltok_skip_cr(const char *ptr, int optional)
58 return optional ? ptr : NULL;
62 osmtpd_ltok_skip_crlf(const char *ptr, int optional)
64 if (ptr[0] == 13 && ptr[1] == 10)
66 return optional ? ptr : NULL;
70 osmtpd_ltok_skip_ctl(const char *ptr, int optional)
72 if ((ptr[0] >= 0x00 && ptr[0] <= 0x1f) || ptr[0] == 0x7f)
74 return optional ? ptr : NULL;
78 osmtpd_ltok_skip_digit(const char *ptr, int optional)
80 if (ptr[0] >= 0x30 && ptr[0] <= 0x39)
82 return optional ? ptr : NULL;
86 osmtpd_ltok_skip_dquote(const char *ptr, int optional)
90 return optional ? ptr : NULL;
94 osmtpd_ltok_skip_hexdig(const char *ptr, int optional)
96 const char *start = ptr;
99 if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) != NULL)
102 if (l == 'a' || l == 'b' || l == 'c' || l == 'd' ||
103 l == 'e' || l == 'f')
105 return optional ? start : NULL;
109 osmtpd_ltok_skip_htab(const char *ptr, int optional)
113 return optional ? ptr : NULL;
117 osmtpd_ltok_skip_lf(const char *ptr, int optional)
121 return optional ? ptr : NULL;
125 osmtpd_ltok_skip_octet(const char *ptr, int optional)
131 osmtpd_ltok_skip_sp(const char *ptr, int optional)
135 return optional ? ptr : NULL;
139 osmtpd_ltok_skip_vchar(const char *ptr, int optional)
141 if (ptr[0] >= 0x21 && ptr[0] <= 0x7e)
143 return optional ? ptr : NULL;
147 osmtpd_ltok_skip_wsp(const char *ptr, int optional)
149 const char *start = ptr;
151 if ((ptr = osmtpd_ltok_skip_sp(start, 0)) != NULL ||
152 (ptr = osmtpd_ltok_skip_htab(start, 0)) != NULL)
154 return optional ? start : NULL;
157 /* RFC 5321 - Simple Mail Transfer Protocol */
159 osmtpd_ltok_skip_keyword(const char *ptr, int optional)
161 return osmtpd_ltok_skip_ldh_string(ptr, optional);
165 osmtpd_ltok_skip_sub_domain(const char *ptr, int optional)
167 const char *start = ptr;
169 if ((ptr = osmtpd_ltok_skip_let_dig(ptr, 0)) == NULL)
170 return optional ? start : NULL;
171 return osmtpd_ltok_skip_ldh_string(ptr, 1);
175 osmtpd_ltok_skip_let_dig(const char *ptr, int optional)
177 const char *start = ptr;
179 if ((ptr = osmtpd_ltok_skip_alpha(start, 0)) == NULL &&
180 (ptr = osmtpd_ltok_skip_digit(start, 0)) == NULL)
181 return optional ? start : NULL;
186 osmtpd_ltok_skip_ldh_string(const char *ptr, int optional)
188 const char *start = ptr, *prev;
193 if ((ptr = osmtpd_ltok_skip_alpha(prev, 0)) != NULL ||
194 (ptr = osmtpd_ltok_skip_digit(prev, 0)) != NULL) {
198 if (prev[0] == '-') {
209 return optional ? start : NULL;
213 /* RFC 5322 - Internet Message Format */
215 osmtpd_ltok_skip_quoted_pair(const char *ptr, int optional)
217 const char *start = ptr;
219 if (ptr[0] == '\\' && (
220 (ptr = osmtpd_ltok_skip_vchar(start + 1, 0)) != NULL ||
221 (ptr = osmtpd_ltok_skip_wsp(start + 1, 0)) != NULL))
223 return osmtpd_ltok_skip_obs_qp(start, optional);
227 osmtpd_ltok_skip_fws(const char *ptr, int optional)
229 const char *start = ptr, *prev = ptr;
231 while ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) != NULL)
233 if ((ptr = osmtpd_ltok_skip_crlf(prev, 1)) == prev)
235 if ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) == NULL)
236 return osmtpd_ltok_skip_obs_fws(start, optional);
238 while ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) != NULL)
244 osmtpd_ltok_skip_ctext(const char *ptr, int optional)
246 const char *start = ptr;
248 if ((ptr[0] >= 33 && ptr[0] <= 39) || (ptr[0] >= 42 && ptr[0] <= 91) ||
249 (ptr[0] >= 93 && ptr[0] <= 126))
251 if ((ptr = osmtpd_ltok_skip_obs_ctext(ptr, 0)) != NULL)
253 return optional ? start : NULL;
257 osmtpd_ltok_skip_ccontent(const char *ptr, int optional)
259 const char *start = ptr;
261 if ((ptr = osmtpd_ltok_skip_ctext(ptr, 0)) != NULL)
263 if ((ptr = osmtpd_ltok_skip_quoted_pair(start, 0)) != NULL)
265 if ((ptr = osmtpd_ltok_skip_comment(start, 0)) != NULL)
267 return optional ? start : NULL;
271 osmtpd_ltok_skip_comment(const char *ptr, int optional)
273 const char *start = ptr;
276 return optional ? start : NULL;
278 ptr = osmtpd_ltok_skip_fws(ptr, 1);
281 if ((ptr = osmtpd_ltok_skip_ccontent(ptr, 0)) == NULL)
282 return optional ? start : NULL;
287 osmtpd_ltok_skip_cfws(const char *ptr, int optional)
289 const char *start = ptr, *prev;
292 ptr = osmtpd_ltok_skip_fws(ptr, 1);
294 if ((ptr = osmtpd_ltok_skip_comment(ptr, 0)) == NULL) {
299 return ptr == start && !optional ? NULL : ptr;
303 osmtpd_ltok_skip_atext(const char *ptr, int optional)
305 const char *start = ptr;
307 if ((ptr = osmtpd_ltok_skip_alpha(start, 0)) != NULL ||
308 (ptr = osmtpd_ltok_skip_digit(start, 0)) != NULL)
311 if (ptr[0] == '!' || ptr[0] == '#' || ptr[0] == '$' || ptr[0] == '%' ||
312 ptr[0] == '&' || ptr[0] == '\'' || ptr[0] == '*' || ptr[0] == '+' ||
313 ptr[0] == '-' || ptr[0] == '/' || ptr[0] == '=' || ptr[0] == '?' ||
314 ptr[0] == '^' || ptr[0] == '_' || ptr[0] == '`' || ptr[0] == '{' ||
315 ptr[0] == '|' || ptr[0] == '}' || ptr[0] == '~')
317 return optional ? start : NULL;
321 osmtpd_ltok_skip_atom(const char *ptr, int optional)
323 const char *start = ptr, *prev;
325 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
326 if ((ptr = osmtpd_ltok_skip_atext(ptr, 0)) == NULL)
327 return optional ? start : NULL;
330 ptr = osmtpd_ltok_skip_atext(ptr, 1);
331 } while (prev != ptr);
332 return osmtpd_ltok_skip_cfws(ptr, 1);
336 osmtpd_ltok_skip_dot_atom_text(const char *ptr, int optional)
338 const char *start = ptr, *prev;
340 if ((ptr = osmtpd_ltok_skip_atext(ptr, 0)) == NULL)
341 return optional ? start : NULL;
344 ptr = osmtpd_ltok_skip_atext(ptr, 1);
345 } while (ptr != prev);
347 while (ptr[0] == '.') {
349 if ((ptr = osmtpd_ltok_skip_atext(ptr, 0)) == NULL)
353 ptr = osmtpd_ltok_skip_atext(ptr, 1);
354 } while (ptr != prev);
360 osmtpd_ltok_skip_dot_atom(const char *ptr, int optional)
362 const char *start = ptr;
364 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
365 if ((ptr = osmtpd_ltok_skip_dot_atom_text(ptr, 0)) == NULL)
366 return optional ? start : NULL;
367 return osmtpd_ltok_skip_cfws(ptr, 1);
371 osmtpd_ltok_skip_qtext(const char *ptr, int optional)
373 const char *start = ptr;
375 if (ptr[0] == 33 || (ptr[0] >= 35 && ptr[0] <= 91) ||
376 (ptr[0] >= 93 && ptr[0] <= 126))
378 if ((ptr = osmtpd_ltok_skip_obs_qtext(ptr, 0)) != NULL)
380 return optional ? start : NULL;
384 osmtpd_ltok_skip_qcontent(const char *ptr, int optional)
386 const char *start = ptr;
388 if ((ptr = osmtpd_ltok_skip_qtext(ptr, 0)) != NULL)
390 return osmtpd_ltok_skip_quoted_pair(start, optional);
394 osmtpd_ltok_skip_quoted_string(const char *ptr, int optional)
396 const char *start = ptr, *prev;
398 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
399 if ((ptr = osmtpd_ltok_skip_dquote(ptr, 0)) == NULL)
400 return optional ? start : NULL;
403 ptr = osmtpd_ltok_skip_fws(ptr, 1);
404 if ((ptr = osmtpd_ltok_skip_qcontent(ptr, 0)) == NULL)
408 if ((ptr = osmtpd_ltok_skip_dquote(prev, 0)) == NULL)
409 return optional ? start : NULL;
410 return osmtpd_ltok_skip_cfws(ptr, 1);
414 osmtpd_ltok_skip_word(const char *ptr, int optional)
416 const char *start = ptr;
418 if ((ptr = osmtpd_ltok_skip_atom(ptr, 0)) != NULL)
420 return osmtpd_ltok_skip_quoted_string(start, optional);
424 osmtpd_ltok_skip_phrase(const char *ptr, int optional)
426 /* obs-phrase is a superset of phrae */
427 return osmtpd_ltok_skip_obs_phrase(ptr, optional);
431 osmtpd_ltok_skip_name_addr(const char *ptr, int optional)
433 const char *start = ptr;
435 ptr = osmtpd_ltok_skip_display_name(ptr, 1);
436 if ((ptr = osmtpd_ltok_skip_angle_addr(ptr, 0)) == NULL)
437 return optional ? start : NULL;
442 osmtpd_ltok_skip_angle_addr(const char *ptr, int optional)
444 const char *start = ptr;
446 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
448 return osmtpd_ltok_skip_obs_angle_addr(start, optional);
449 if ((ptr = osmtpd_ltok_skip_addr_spec(ptr, 0)) == NULL)
450 return osmtpd_ltok_skip_obs_angle_addr(start, optional);
452 return osmtpd_ltok_skip_obs_angle_addr(start, optional);
453 return osmtpd_ltok_skip_cfws(ptr, 1);
457 osmtpd_ltok_skip_display_name(const char *ptr, int optional)
459 return osmtpd_ltok_skip_phrase(ptr, optional);
463 osmtpd_ltok_skip_addr_spec(const char *ptr, int optional)
465 const char *start = ptr;
467 if ((ptr = osmtpd_ltok_skip_local_part(ptr, 0)) == NULL)
468 return optional ? start : NULL;
470 return optional ? start : NULL;
471 if ((ptr = osmtpd_ltok_skip_domain(ptr, 0)) == NULL)
472 return optional ? start : NULL;
477 osmtpd_ltok_skip_local_part(const char *ptr, int optional)
479 const char *start = ptr;
481 if ((ptr = osmtpd_ltok_skip_dot_atom(ptr, 0)) != NULL)
484 if ((ptr = osmtpd_ltok_skip_quoted_string(ptr, 0)) != NULL)
486 return osmtpd_ltok_skip_obs_local_part(start, optional);
490 osmtpd_ltok_skip_domain(const char *ptr, int optional)
492 const char *start = ptr;
494 if ((ptr = osmtpd_ltok_skip_dot_atom(start, 0)) != NULL)
496 if ((ptr = osmtpd_ltok_skip_domain_literal(start, 0)) != NULL)
498 return osmtpd_ltok_skip_obs_domain(start, optional);
502 osmtpd_ltok_skip_domain_literal(const char *ptr, int optional)
504 const char *start = ptr, *prev;
506 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
508 return optional ? start : NULL;
510 ptr = osmtpd_ltok_skip_fws(ptr, 1);
512 if ((ptr = osmtpd_ltok_skip_dtext(ptr, 0)) == NULL) {
518 return optional ? start : NULL;
520 return osmtpd_ltok_skip_cfws(ptr, 1);
524 osmtpd_ltok_skip_dtext(const char *ptr, int optional)
526 if ((ptr[0] >= 33 && ptr[0] <= 90) || (ptr[0] >= 94 && ptr[0] <= 126))
528 return osmtpd_ltok_skip_obs_dtext(ptr, optional);
533 osmtpd_ltok_skip_field_name(const char *ptr, int optional)
535 const char *start = ptr;
537 if ((ptr = osmtpd_ltok_skip_ftext(ptr, 0)) == NULL)
538 return optional ? start : NULL;
541 if ((ptr = osmtpd_ltok_skip_ftext(ptr, 0)) == NULL)
547 osmtpd_ltok_skip_ftext(const char *ptr, int optional)
549 if ((ptr[0] >= 33 && ptr[0] <= 57) ||
550 (ptr[0] >= 59 && ptr[0] <= 126))
552 return optional ? ptr : NULL;
556 osmtpd_ltok_skip_obs_no_ws_ctl(const char *ptr, int optional)
558 if ((ptr[0] >= 1 && ptr[0] <= 8) || ptr[0] == 11 || ptr[0] == 12 ||
559 (ptr[0] >= 14 && ptr[0] <= 31) || ptr[0] == 127)
561 return optional ? ptr : NULL;
565 osmtpd_ltok_skip_obs_ctext(const char *ptr, int optional)
567 return osmtpd_ltok_skip_obs_no_ws_ctl(ptr, optional);
571 osmtpd_ltok_skip_obs_qtext(const char *ptr, int optional)
573 return osmtpd_ltok_skip_obs_no_ws_ctl(ptr, optional);
577 osmtpd_ltok_skip_obs_qp(const char *ptr, int optional)
579 const char *start = ptr;
581 if (ptr[0] == '\\' && (
582 (ptr = osmtpd_ltok_skip_obs_no_ws_ctl(start + 1, 0)) != NULL ||
583 (ptr = osmtpd_ltok_skip_lf(start + 1, 0)) != NULL ||
584 (ptr = osmtpd_ltok_skip_cr(start + 1, 0)) != NULL))
586 return optional ? start : NULL;
590 osmtpd_ltok_skip_obs_phrase(const char *ptr, int optional)
592 const char *start = ptr, *prev;
594 if ((ptr = osmtpd_ltok_skip_word(ptr, 0)) == NULL)
595 return optional ? start : NULL;
598 if ((ptr = osmtpd_ltok_skip_word(ptr, 0)) != NULL)
605 if ((ptr = osmtpd_ltok_skip_cfws(ptr, 0)) != NULL)
612 osmtpd_ltok_skip_obs_fws(const char *ptr, int optional)
614 const char *start = ptr, *prev;
616 if ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) == NULL)
617 return optional ? start : NULL;
619 while ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) != NULL)
624 if ((ptr = osmtpd_ltok_skip_crlf(ptr, 0)) == NULL)
626 if ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) == NULL)
629 while ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) != NULL)
636 osmtpd_ltok_skip_obs_angle_addr(const char *ptr, int optional)
638 const char *start = ptr;
640 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
642 return optional ? start : NULL;
643 if ((ptr = osmtpd_ltok_skip_obs_route(ptr, 0)) == NULL)
644 return optional ? start : NULL;
645 if ((ptr = osmtpd_ltok_skip_addr_spec(ptr, 0)) == NULL)
646 return optional ? start : NULL;
648 return optional ? start : NULL;
649 return osmtpd_ltok_skip_cfws(ptr, 1);
653 osmtpd_ltok_skip_obs_route(const char *ptr, int optional)
655 const char *start = ptr;
657 if ((ptr = osmtpd_ltok_skip_obs_domain_list(ptr, 0)) == NULL)
658 return optional ? start : NULL;
660 return optional ? start : NULL;
665 osmtpd_ltok_skip_obs_domain_list(const char *ptr, int optional)
667 const char *start = ptr, *prev = ptr;
674 } else if ((ptr = osmtpd_ltok_skip_cfws(ptr, 0)) != NULL) {
683 return optional ? start : NULL;
684 if ((ptr = osmtpd_ltok_skip_domain(ptr, 0)) == NULL)
685 return optional ? start : NULL;
690 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
694 if ((ptr = osmtpd_ltok_skip_domain(ptr + 1, 0)) == NULL) {
703 osmtpd_ltok_skip_obs_local_part(const char *ptr, int optional)
705 const char *start = ptr, *prev;
707 if ((ptr = osmtpd_ltok_skip_word(ptr, 0)) == NULL)
708 return optional ? start : NULL;
710 while (ptr[0] == '.') {
712 if ((ptr = osmtpd_ltok_skip_word(ptr, 0)) == NULL)
720 osmtpd_ltok_skip_obs_domain(const char *ptr, int optional)
722 const char *start = ptr, *prev;
724 if ((ptr = osmtpd_ltok_skip_atom(ptr, 0)) == NULL)
725 return optional ? start : NULL;
730 if ((ptr = osmtpd_ltok_skip_atom(ptr, 0)) == NULL)
737 osmtpd_ltok_skip_obs_dtext(const char *ptr, int optional)
739 const char *start = ptr;
741 if ((ptr = osmtpd_ltok_skip_obs_no_ws_ctl(ptr, 0)) != NULL)
743 return osmtpd_ltok_skip_quoted_pair(start, optional);
746 /* RFC 2045 - Multipurpose Internet Mail Extensions */
748 osmtpd_ltok_skip_value(const char *ptr, int optional)
750 const char *start = ptr;
752 if ((ptr = osmtpd_ltok_skip_token(start, 0)) != NULL)
754 if ((ptr = osmtpd_ltok_skip_quoted_string(start, 0)) != NULL)
756 return optional ? start : NULL;
760 osmtpd_ltok_skip_token(const char *ptr, int optional)
767 if ((ptr = osmtpd_ltok_skip_char(start, 0)) != NULL &&
768 osmtpd_ltok_skip_sp(start, 0) == NULL &&
769 osmtpd_ltok_skip_ctl(start, 0) == NULL &&
770 osmtpd_ltok_skip_tspecials(start, 0) == NULL) {
774 return optional || !first ? start : NULL;
779 osmtpd_ltok_skip_tspecials(const char *ptr, int optional)
781 if (ptr[0] == '(' || ptr[0] == ')' || ptr[0] == '<' || ptr[0] == '>' ||
782 ptr[0] == '@' || ptr[0] == ',' || ptr[0] == ';' || ptr[0] == ':' ||
783 ptr[0] == '\\' || ptr[0] == '"' || ptr[0] == '/' || ptr[0] == '[' ||
784 ptr[0] == ']' || ptr[0] == '?' || ptr[0] == '=')
786 return optional ? ptr : NULL;
790 osmtpd_ltok_skip_qp_section(const char *ptr, int optional)
792 const char *prev, *last = ptr;
796 if ((ptr = osmtpd_ltok_skip_ptext(prev, 0)) != NULL)
798 else if ((ptr = osmtpd_ltok_skip_sp(prev, 0)) == NULL &&
799 (ptr = osmtpd_ltok_skip_htab(prev, 0)) == NULL)
805 osmtpd_ltok_skip_ptext(const char *ptr, int optional)
807 const char *start = ptr;
809 if ((ptr = osmtpd_ltok_skip_hex_octet(start, 0)) == NULL &&
810 (ptr = osmtpd_ltok_skip_safe_char(start, 0)) == NULL)
811 return optional ? start : NULL;
816 osmtpd_ltok_skip_safe_char(const char *ptr, int optional)
818 if ((ptr[0] >= 33 && ptr[0] <= 60) || (ptr[0] >= 62 && ptr[0] <= 126))
820 return optional ? ptr : NULL;
824 osmtpd_ltok_skip_hex_octet(const char *ptr, int optional)
826 const char *start = ptr;
830 return optional ? start : NULL;
833 if (l == 'a' || l == 'b' || l == 'c' || l == 'd' ||
834 l == 'e' || l == 'f')
836 else if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) == NULL)
837 return optional ? start : NULL;
840 if (l == 'a' || l == 'b' || l == 'c' || l == 'd' ||
841 l == 'e' || l == 'f')
843 else if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) == NULL)
848 /* RFC 6376 - DomainKeys Identified Mail (DKIM) Signatures */
850 osmtpd_ltok_skip_hyphenated_word(const char *ptr, int optional)
852 const char *start = ptr, *end, *hyphen;
854 if ((ptr = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL)
855 return optional ? start : NULL;
860 hyphen = hyphen == NULL ? ptr - 1 : hyphen;
865 if ((ptr = osmtpd_ltok_skip_alpha(start, 0)) == NULL &&
866 (ptr = osmtpd_ltok_skip_digit(start, 0)) == NULL)
872 return hyphen == NULL ? end : hyphen;
876 osmtpd_ltok_skip_alphadigitps(const char *ptr, int optional)
880 if ((end = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL &&
881 (end = osmtpd_ltok_skip_digit(ptr, 0)) == NULL &&
882 ptr[0] != '+' && ptr[0] != '/')
883 return optional ? ptr : NULL;
884 return end == NULL ? ptr + 1 : end;
888 osmtpd_ltok_skip_base64string(const char *ptr, int optional)
890 const char *start = ptr;
892 if ((ptr = osmtpd_ltok_skip_alphadigitps(ptr, 0)) == NULL)
893 return optional ? start : NULL;
896 ptr = osmtpd_ltok_skip_fws(ptr, 1);
897 if ((ptr = osmtpd_ltok_skip_alphadigitps(ptr, 0)) == NULL)
901 ptr = osmtpd_ltok_skip_fws(ptr, 1);
905 ptr = osmtpd_ltok_skip_fws(ptr, 1);
916 osmtpd_ltok_skip_hdr_name(const char *ptr, int optional)
918 return osmtpd_ltok_skip_field_name(ptr, optional);
922 osmtpd_ltok_skip_qp_hdr_value(const char *ptr, int optional)
924 return osmtpd_ltok_skip_dkim_quoted_printable(ptr, optional);
928 osmtpd_ltok_skip_dkim_quoted_printable(const char *ptr, int optional)
934 if ((ptr = osmtpd_ltok_skip_fws(start, 0)) != NULL)
936 if ((ptr = osmtpd_ltok_skip_hex_octet(start, 0)) != NULL)
938 ptr = osmtpd_ltok_skip_dkim_safe_char(start, 0);
946 osmtpd_ltok_skip_dkim_safe_char(const char *ptr, int optional)
948 if ((ptr[0] >= 0x21 && ptr[0] <= 0x3a) || ptr[0] == 0x3c ||
949 (ptr[0] >= 0x3e && ptr[0] <= 0x7e))
951 return optional ? ptr : NULL;
955 osmtpd_ltok_skip_selector(const char *ptr, int optional)
957 const char *start = ptr;
959 if ((ptr = osmtpd_ltok_skip_sub_domain(ptr, 0)) == NULL)
960 return optional ? start : NULL;
966 if ((ptr = osmtpd_ltok_skip_sub_domain(ptr, 0)) == NULL)
972 osmtpd_ltok_skip_tag_list(const char *ptr, int optional)
974 const char *start = ptr;
976 if ((ptr = osmtpd_ltok_skip_tag_spec(ptr, 0)) == NULL)
977 return optional ? start : NULL;
979 /* Starting or trailing ';' */
984 if ((ptr = osmtpd_ltok_skip_tag_spec(ptr, 0)) == NULL)
990 osmtpd_ltok_skip_tag_spec(const char *ptr, int optional)
992 const char *start = ptr;
994 ptr = osmtpd_ltok_skip_fws(ptr, 1);
995 if ((ptr = osmtpd_ltok_skip_tag_name(ptr, 0)) == NULL)
996 return optional ? start : NULL;
997 ptr = osmtpd_ltok_skip_fws(ptr, 1);
999 return optional ? start : NULL;
1001 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1002 if ((ptr = osmtpd_ltok_skip_tag_value(ptr, 0)) == NULL)
1003 return optional ? start : NULL;
1004 return osmtpd_ltok_skip_fws(ptr, 1);
1008 osmtpd_ltok_skip_tag_name(const char *ptr, int optional)
1010 const char *start = ptr, *prev;
1012 if ((ptr = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL)
1013 return optional ? start : NULL;
1015 while ((ptr = osmtpd_ltok_skip_alnumpunc(ptr, 0)) != NULL)
1021 osmtpd_ltok_skip_tag_value(const char *ptr, int optional)
1023 const char *start = ptr, *prev;
1025 if ((ptr = osmtpd_ltok_skip_tval(ptr, 0)) == NULL)
1030 /* FWS contains WSP */
1031 if ((ptr = osmtpd_ltok_skip_fws(ptr, 0)) == NULL)
1034 while ((ptr = osmtpd_ltok_skip_fws(ptr, 0)) != NULL)
1037 if ((ptr = osmtpd_ltok_skip_tval(ptr, 0)) == NULL)
1043 osmtpd_ltok_skip_tval(const char *ptr, int optional)
1045 const char *start = ptr, *prev;
1047 if ((ptr = osmtpd_ltok_skip_valchar(ptr, 0)) == NULL)
1048 return optional ? start : NULL;
1050 while ((ptr = osmtpd_ltok_skip_valchar(ptr, 0)) != NULL)
1056 osmtpd_ltok_skip_valchar(const char *ptr, int optional)
1058 if ((ptr[0] >= 0x21 && ptr[0] <= 0x3A) ||
1059 (ptr[0] >= 0x3C && ptr[0] <= 0x7E))
1061 return optional ? ptr : NULL;
1065 osmtpd_ltok_skip_alnumpunc(const char *ptr, int optional)
1067 const char *start = ptr;
1069 if ((ptr = osmtpd_ltok_skip_alpha(start, 0)) != NULL)
1071 if ((ptr = osmtpd_ltok_skip_digit(start, 0)) != NULL)
1073 if (start[0] == '_')
1075 return optional ? start : NULL;
1079 osmtpd_ltok_skip_sig_v_tag(const char *ptr, int optional)
1081 const char *start = ptr;
1084 return optional ? start : NULL;
1085 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1087 return optional ? start : NULL;
1088 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1089 if ((ptr = osmtpd_ltok_skip_sig_v_tag_value(ptr, 0)) == NULL)
1090 return optional ? start : NULL;
1095 osmtpd_ltok_skip_sig_v_tag_value(const char *ptr, int optional)
1097 const char *start = ptr, *prev;
1099 if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) == NULL)
1100 return optional ? start : NULL;
1103 if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) == NULL)
1109 osmtpd_ltok_skip_sig_a_tag(const char *ptr, int optional)
1111 const char *start = ptr;
1114 return optional ? start : NULL;
1115 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1117 return optional ? start : NULL;
1118 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1119 if ((ptr = osmtpd_ltok_skip_sig_a_tag_value(ptr, 0)) == NULL)
1120 return optional ? start : NULL;
1125 osmtpd_ltok_skip_sig_a_tag_value(const char *ptr, int optional)
1127 return osmtpd_ltok_skip_sig_a_tag_alg(ptr, optional);
1131 osmtpd_ltok_skip_sig_a_tag_alg(const char *ptr, int optional)
1133 const char *start = ptr;
1135 if ((ptr = osmtpd_ltok_skip_sig_a_tag_k(ptr, 0)) == NULL)
1136 return optional ? start : NULL;
1138 return optional ? start : NULL;
1140 if ((ptr = osmtpd_ltok_skip_sig_a_tag_h(ptr, 0)) == NULL)
1141 return optional ? start : NULL;
1146 osmtpd_ltok_skip_sig_a_tag_k(const char *ptr, int optional)
1148 /* sha1 / sha256 covered by x-sig-a-tag-k */
1149 return osmtpd_ltok_skip_x_sig_a_tag_k(ptr, optional);
1153 osmtpd_ltok_skip_sig_a_tag_h(const char *ptr, int optional)
1155 /* rsa / ed25519 covered by x-sig-a-tag-h */
1156 return osmtpd_ltok_skip_x_sig_a_tag_h(ptr, optional);
1160 osmtpd_ltok_skip_x_sig_a_tag_k(const char *ptr, int optional)
1162 const char *start = ptr, *prev, *end;
1164 if ((ptr = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL)
1165 return optional ? start : NULL;
1167 while ((end = osmtpd_ltok_skip_alpha(ptr, 0)) != NULL ||
1168 (end = osmtpd_ltok_skip_digit(ptr, 0)) != NULL) {
1176 osmtpd_ltok_skip_x_sig_a_tag_h(const char *ptr, int optional)
1178 const char *start = ptr, *prev, *end;
1180 if ((ptr = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL)
1181 return optional ? start : NULL;
1183 while ((end = osmtpd_ltok_skip_alpha(ptr, 0)) != NULL ||
1184 (end = osmtpd_ltok_skip_digit(ptr, 0)) != NULL) {
1192 osmtpd_ltok_skip_sig_b_tag(const char *ptr, int optional)
1194 const char *start = ptr;
1197 return optional ? start : NULL;
1198 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1200 return optional ? start : NULL;
1201 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1202 if ((ptr = osmtpd_ltok_skip_sig_b_tag_value(ptr, 0)) == NULL)
1203 return optional ? start : NULL;
1208 osmtpd_ltok_skip_sig_b_tag_value(const char *ptr, int optional)
1210 return osmtpd_ltok_skip_sig_b_tag_data(ptr, optional);
1214 osmtpd_ltok_skip_sig_b_tag_data(const char *ptr, int optional)
1216 return osmtpd_ltok_skip_base64string(ptr, optional);
1220 osmtpd_ltok_skip_sig_bh_tag(const char *ptr, int optional)
1222 const char *start = ptr;
1224 if (ptr[0] != 0x62 && ptr[0] != 0x68)
1225 return optional ? start : NULL;
1226 ptr = osmtpd_ltok_skip_fws(ptr + 2, 1);
1228 return optional ? start : NULL;
1229 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1230 if ((ptr = osmtpd_ltok_skip_sig_bh_tag_value(ptr, 0)) == NULL)
1231 return optional ? start : NULL;
1236 osmtpd_ltok_skip_sig_bh_tag_value(const char *ptr, int optional)
1238 return osmtpd_ltok_skip_sig_bh_tag_data(ptr, optional);
1242 osmtpd_ltok_skip_sig_bh_tag_data(const char *ptr, int optional)
1244 return osmtpd_ltok_skip_base64string(ptr, optional);
1248 osmtpd_ltok_skip_sig_c_tag(const char *ptr, int optional)
1250 const char *start = ptr;
1253 return optional ? start : NULL;
1254 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1256 return optional ? start : NULL;
1257 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1258 if ((ptr = osmtpd_ltok_skip_sig_c_tag_value(ptr, 0)) == NULL)
1259 return optional ? start : NULL;
1264 osmtpd_ltok_skip_sig_c_tag_value(const char *ptr, int optional)
1266 const char *start = ptr;
1268 if ((ptr = osmtpd_ltok_skip_sig_c_tag_alg(ptr, 0)) == NULL)
1269 return optional ? start : NULL;
1270 if (ptr[0] == '/') {
1272 if ((ptr = osmtpd_ltok_skip_sig_c_tag_alg(ptr, 0)) == NULL)
1279 osmtpd_ltok_skip_sig_c_tag_alg(const char *ptr, int optional)
1281 /* simple / relaxed covered by x-sig-c-tag-alga */
1282 return osmtpd_ltok_skip_x_sig_c_tag_alg(ptr, optional);
1286 osmtpd_ltok_skip_x_sig_c_tag_alg(const char *ptr, int optional)
1288 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1292 osmtpd_ltok_skip_sig_d_tag(const char *ptr, int optional)
1294 const char *start = ptr;
1297 return optional ? start : NULL;
1298 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1300 return optional ? start : NULL;
1301 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1302 if ((ptr = osmtpd_ltok_skip_sig_d_tag_value(ptr, 0)) == NULL)
1303 return optional ? start : NULL;
1308 osmtpd_ltok_skip_sig_d_tag_value(const char *ptr, int optional)
1310 return osmtpd_ltok_skip_domain_name(ptr, optional);
1314 osmtpd_ltok_skip_domain_name(const char *ptr, int optional)
1316 const char *prev = ptr;
1318 if ((ptr = osmtpd_ltok_skip_sub_domain(ptr, 0)) == NULL)
1319 return optional ? prev : NULL;
1322 if (ptr[0] != '.' ||
1323 (ptr = osmtpd_ltok_skip_sub_domain(ptr + 1, 0)) == NULL)
1329 osmtpd_ltok_skip_sig_h_tag(const char *ptr, int optional)
1331 const char *start = ptr;
1334 return optional ? start : NULL;
1335 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1337 return optional ? start : NULL;
1338 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1339 if ((ptr = osmtpd_ltok_skip_sig_h_tag_value(ptr, 0)) == NULL)
1340 return optional ? start : NULL;
1345 osmtpd_ltok_skip_sig_h_tag_value(const char *ptr, int optional)
1347 const char *prev = ptr;
1349 if ((ptr = osmtpd_ltok_skip_hdr_name(ptr, 0)) == NULL)
1350 return optional ? prev : NULL;
1353 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1356 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1357 if ((ptr = osmtpd_ltok_skip_hdr_name(ptr, 0)) == NULL)
1363 osmtpd_ltok_skip_sig_i_tag(const char *ptr, int optional)
1365 const char *start = ptr;
1368 return optional ? start : NULL;
1369 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1371 return optional ? start : NULL;
1372 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1373 if ((ptr = osmtpd_ltok_skip_sig_i_tag_value(ptr, 0)) == NULL)
1374 return optional ? start : NULL;
1379 osmtpd_ltok_skip_sig_i_tag_value(const char *ptr, int optional)
1381 const char *start = ptr;
1383 ptr = osmtpd_ltok_skip_local_part(ptr, 1);
1384 if (ptr[0] != '@' ||
1385 (ptr = osmtpd_ltok_skip_domain_name(ptr, 0)) == NULL)
1386 return optional ? start : NULL;
1391 osmtpd_ltok_skip_sig_l_tag(const char *ptr, int optional)
1393 const char *start = ptr;
1396 return optional ? start : NULL;
1397 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1399 return optional ? start : NULL;
1400 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1401 if ((ptr = osmtpd_ltok_skip_sig_l_tag_value(ptr, 0)) == NULL)
1402 return optional ? start : NULL;
1407 osmtpd_ltok_skip_sig_l_tag_value(const char *ptr, int optional)
1411 for (i = 0; i < 76; i++) {
1412 if (osmtpd_ltok_skip_digit(ptr + i, 0) == NULL)
1415 if (i >= 1 && i <= 76)
1417 return optional ? ptr : NULL;
1421 osmtpd_ltok_skip_sig_q_tag(const char *ptr, int optional)
1423 const char *start = ptr;
1426 return optional ? start : NULL;
1427 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1429 return optional ? start : NULL;
1430 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1431 if ((ptr = osmtpd_ltok_skip_sig_q_tag_value(ptr, 0)) == NULL)
1432 return optional ? start : NULL;
1437 osmtpd_ltok_skip_sig_q_tag_value(const char *ptr, int optional)
1439 const char *prev = ptr;
1440 if ((ptr = osmtpd_ltok_skip_sig_q_tag_method(ptr, 0)) == NULL)
1441 return optional ? prev : NULL;
1444 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1447 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1448 if ((ptr = osmtpd_ltok_skip_sig_q_tag_method(ptr, 0)) == NULL)
1454 osmtpd_ltok_skip_sig_q_tag_method(const char *ptr, int optional)
1456 const char *start = ptr;
1458 /* dns/txt covered by x-sig-q-tag-type ["/" x-sig-q-tag-args] */
1459 if ((ptr = osmtpd_ltok_skip_x_sig_q_tag_type(ptr, 0)) == NULL)
1460 return optional ? start : NULL;
1464 if ((ptr = osmtpd_ltok_skip_x_sig_q_tag_args(ptr, 0)) == NULL)
1470 osmtpd_ltok_skip_x_sig_q_tag_type(const char *ptr, int optional)
1472 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1476 osmtpd_ltok_skip_x_sig_q_tag_args(const char *ptr, int optional)
1478 return osmtpd_ltok_skip_qp_hdr_value(ptr, optional);
1482 osmtpd_ltok_skip_sig_s_tag(const char *ptr, int optional)
1484 const char *start = ptr;
1487 return optional ? start : NULL;
1488 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1490 return optional ? start : NULL;
1491 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1492 if ((ptr = osmtpd_ltok_skip_sig_s_tag_value(ptr, 0)) == NULL)
1493 return optional ? start : NULL;
1498 osmtpd_ltok_skip_sig_s_tag_value(const char *ptr, int optional)
1500 return osmtpd_ltok_skip_selector(ptr, optional);
1504 osmtpd_ltok_skip_sig_t_tag(const char *ptr, int optional)
1506 const char *start = ptr;
1509 return optional ? start : NULL;
1510 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1512 return optional ? start : NULL;
1513 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1514 if ((ptr = osmtpd_ltok_skip_sig_t_tag_value(ptr, 0)) == NULL)
1515 return optional ? start : NULL;
1520 osmtpd_ltok_skip_sig_t_tag_value(const char *ptr, int optional)
1524 for (i = 0; i < 12; i++) {
1525 if (osmtpd_ltok_skip_digit(ptr + i, 0) == NULL)
1528 if (i >= 1 && i <= 12)
1530 return optional ? ptr : NULL;
1534 osmtpd_ltok_skip_sig_x_tag(const char *ptr, int optional)
1536 const char *start = ptr;
1539 return optional ? start : NULL;
1540 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1542 return optional ? start : NULL;
1543 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1544 if ((ptr = osmtpd_ltok_skip_sig_x_tag_value(ptr, 0)) == NULL)
1545 return optional ? start : NULL;
1550 osmtpd_ltok_skip_sig_x_tag_value(const char *ptr, int optional)
1554 for (i = 0; i < 12; i++) {
1555 if (osmtpd_ltok_skip_digit(ptr + i, 0) == NULL)
1558 if (i >= 1 && i <= 12)
1560 return optional ? ptr : NULL;
1564 osmtpd_ltok_skip_sig_z_tag(const char *ptr, int optional)
1566 const char *start = ptr;
1569 return optional ? start : NULL;
1570 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1572 return optional ? start : NULL;
1573 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1574 if ((ptr = osmtpd_ltok_skip_sig_z_tag_value(ptr, 0)) == NULL)
1575 return optional ? start : NULL;
1580 osmtpd_ltok_skip_sig_z_tag_value(const char *ptr, int optional)
1582 const char *prev = ptr;
1584 if ((ptr = osmtpd_ltok_skip_sig_z_tag_copy(ptr, 0)) == NULL)
1585 return optional ? ptr : NULL;
1590 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1591 if ((ptr = osmtpd_ltok_skip_sig_z_tag_copy(ptr, 0)) == NULL)
1597 osmtpd_ltok_skip_sig_z_tag_copy(const char *ptr, int optional)
1599 const char *start = ptr;
1601 if ((ptr = osmtpd_ltok_skip_hdr_name(ptr, 0)) == NULL)
1602 return optional ? start : NULL;
1603 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1605 return optional ? start : NULL;
1606 if ((ptr = osmtpd_ltok_skip_qp_hdr_value(ptr, 0)) == NULL)
1607 return optional ? start : NULL;
1612 osmtpd_ltok_skip_key_v_tag(const char *ptr, int optional)
1614 const char *start = ptr;
1617 return optional ? start : NULL;
1618 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1620 return optional ? start : NULL;
1621 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1622 if ((ptr = osmtpd_ltok_skip_key_v_tag_value(ptr, 0)) == NULL)
1623 return optional ? start : NULL;
1628 osmtpd_ltok_skip_key_v_tag_value(const char *ptr, int optional)
1630 if (ptr[0] == 0x44 && ptr[1] == 0x4b && ptr[2] == 0x49 &&
1631 ptr[3] == 0x4d && ptr[4] == 0x31)
1633 return optional ? ptr : NULL;
1637 osmtpd_ltok_skip_key_h_tag(const char *ptr, int optional)
1639 const char *start = ptr;
1642 return optional ? start : NULL;
1643 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1645 return optional ? start : NULL;
1646 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1647 if ((ptr = osmtpd_ltok_skip_key_h_tag_value(ptr, 0)) == NULL)
1648 return optional ? start : NULL;
1653 osmtpd_ltok_skip_key_h_tag_value(const char *ptr, int optional)
1655 const char *prev = ptr;
1657 if ((prev = osmtpd_ltok_skip_key_h_tag_alg(ptr, 0)) == NULL)
1658 return optional ? prev : NULL;
1661 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1664 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1665 if ((ptr = osmtpd_ltok_skip_key_h_tag_alg(ptr, 0)) == NULL)
1671 osmtpd_ltok_skip_key_h_tag_alg(const char *ptr, int optional)
1673 /* sha1 / sha256 covered by x-key-h-tag-alg */
1674 return osmtpd_ltok_skip_x_key_h_tag_alg(ptr, optional);
1678 osmtpd_ltok_skip_x_key_h_tag_alg(const char *ptr, int optional)
1680 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1684 osmtpd_ltok_skip_key_k_tag(const char *ptr, int optional)
1686 const char *start = ptr;
1689 return optional ? start : NULL;
1690 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1692 return optional ? start : NULL;
1693 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1694 if ((ptr = osmtpd_ltok_skip_key_k_tag_value(ptr, 0)) == NULL)
1695 return optional ? start : NULL;
1700 osmtpd_ltok_skip_key_k_tag_value(const char *ptr, int optional)
1702 const char *start = ptr;
1704 if ((ptr = osmtpd_ltok_skip_key_k_tag_type(ptr, 0)) == NULL)
1705 return optional ? start : NULL;
1710 osmtpd_ltok_skip_key_k_tag_type(const char *ptr, int optional)
1712 /* rsa covered by x-key-k-tag-type */
1713 return osmtpd_ltok_skip_x_key_k_tag_type(ptr, optional);
1717 osmtpd_ltok_skip_x_key_k_tag_type(const char *ptr, int optional)
1719 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1723 osmtpd_ltok_skip_key_n_tag(const char *ptr, int optional)
1725 const char *start = ptr;
1728 return optional ? start : NULL;
1729 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1731 return optional ? start : NULL;
1732 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1733 if ((ptr = osmtpd_ltok_skip_key_n_tag_value(ptr, 0)) == NULL)
1734 return optional ? start : NULL;
1739 osmtpd_ltok_skip_key_n_tag_value(const char *ptr, int optional)
1741 return osmtpd_ltok_skip_qp_section(ptr, optional);
1745 osmtpd_ltok_skip_key_p_tag(const char *ptr, int optional)
1747 const char *start = ptr;
1750 return optional ? start : NULL;
1751 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1753 return optional ? start : NULL;
1754 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1755 if ((ptr = osmtpd_ltok_skip_key_p_tag_value(ptr, 0)) == NULL)
1756 return optional ? start : NULL;
1761 osmtpd_ltok_skip_key_p_tag_value(const char *ptr, int optional)
1763 const char *start = ptr;
1765 if ((ptr = osmtpd_ltok_skip_base64string(ptr, 0)) == NULL)
1766 return optional ? start : NULL;
1771 osmtpd_ltok_skip_key_s_tag(const char *ptr, int optional)
1773 const char *start = ptr;
1776 return optional ? start : NULL;
1777 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1779 return optional ? start : NULL;
1780 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1781 if ((ptr = osmtpd_ltok_skip_key_s_tag_value(ptr, 0)) == NULL)
1782 return optional ? start : NULL;
1787 osmtpd_ltok_skip_key_s_tag_value(const char *ptr, int optional)
1789 const char *start = ptr;
1791 if ((ptr = osmtpd_ltok_skip_key_s_tag_type(ptr, 0)) == NULL)
1792 return optional ? start : NULL;
1795 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1798 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1799 ptr = osmtpd_ltok_skip_key_s_tag_type(ptr, 0);
1806 osmtpd_ltok_skip_key_s_tag_type(const char *ptr, int optional)
1810 /* email covered by x-key-s-tag-type */
1811 return osmtpd_ltok_skip_x_key_s_tag_type(ptr, optional);
1815 osmtpd_ltok_skip_x_key_s_tag_type(const char *ptr, int optional)
1817 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1821 osmtpd_ltok_skip_key_t_tag(const char *ptr, int optional)
1823 const char *start = ptr;
1826 return optional ? start : NULL;
1827 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1829 return optional ? start : NULL;
1830 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1831 if ((ptr = osmtpd_ltok_skip_key_t_tag_value(ptr, 0)) == NULL)
1832 return optional ? start : NULL;
1837 osmtpd_ltok_skip_key_t_tag_value(const char *ptr, int optional)
1839 const char *start = ptr;
1841 if ((ptr = osmtpd_ltok_skip_key_t_tag_flag(ptr, 0)) == NULL)
1842 return optional ? start : NULL;
1845 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1848 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1849 ptr = osmtpd_ltok_skip_key_t_tag_flag(ptr, 0);
1856 osmtpd_ltok_skip_key_t_tag_flag(const char *ptr, int optional)
1858 /* y / s covered by x-key-t-tag-flag */
1859 return osmtpd_ltok_skip_x_key_t_tag_flag(ptr, optional);
1863 osmtpd_ltok_skip_x_key_t_tag_flag(const char *ptr, int optional)
1865 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1869 osmtpd_ltok_skip_ar_pvalue(const char *ptr, int optional)
1871 const char *start = ptr, *tmp;
1873 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
1874 if ((tmp = osmtpd_ltok_skip_value(ptr, 0)) != NULL)
1876 ptr = osmtpd_ltok_skip_local_part(ptr, 1);
1879 if ((ptr = osmtpd_ltok_skip_domain(ptr, 0)) == NULL)
1880 return optional ? start : NULL;