2 * Copyright (c) 2020-2022 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.
25 /* RFC 5234 - Augmented BNF for Syntax Specifications: ABNF */
27 osmtpd_ltok_skip_alpha(const char *ptr, int optional)
29 if ((ptr[0] >= 0x41 && ptr[0] <= 0x5a) ||
30 (ptr[0] >= 0x61 && ptr[0] <= 0x7a))
32 return optional ? ptr : NULL;
36 osmtpd_ltok_skip_bit(const char *ptr, int optional)
38 if (ptr[0] == '0' || ptr[0] == '1')
40 return optional ? ptr : NULL;
44 osmtpd_ltok_skip_char(const char *ptr, int optional)
46 if (ptr[0] >= 0x01 && ptr[0] <= 0x7f)
48 return optional ? ptr : NULL;
52 osmtpd_ltok_skip_cr(const char *ptr, int optional)
56 return optional ? ptr : NULL;
60 osmtpd_ltok_skip_crlf(const char *ptr, int optional)
62 if (ptr[0] == 13 && ptr[1] == 10)
64 return optional ? ptr : NULL;
68 osmtpd_ltok_skip_ctl(const char *ptr, int optional)
70 if ((ptr[0] >= 0x00 && ptr[0] <= 0x1f) || ptr[0] == 0x7f)
72 return optional ? ptr : NULL;
76 osmtpd_ltok_skip_digit(const char *ptr, int optional)
78 if (ptr[0] >= 0x30 && ptr[0] <= 0x39)
80 return optional ? ptr : NULL;
84 osmtpd_ltok_skip_dquote(const char *ptr, int optional)
88 return optional ? ptr : NULL;
92 osmtpd_ltok_skip_hexdig(const char *ptr, int optional)
94 const char *start = ptr;
97 if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) != NULL)
99 l = tolower(start[0]);
100 if (l == 'a' || l == 'b' || l == 'c' || l == 'd' ||
101 l == 'e' || l == 'f')
103 return optional ? start : NULL;
107 osmtpd_ltok_skip_htab(const char *ptr, int optional)
111 return optional ? ptr : NULL;
115 osmtpd_ltok_skip_lf(const char *ptr, int optional)
119 return optional ? ptr : NULL;
123 osmtpd_ltok_skip_octet(const char *ptr, int optional)
129 osmtpd_ltok_skip_sp(const char *ptr, int optional)
133 return optional ? ptr : NULL;
137 osmtpd_ltok_skip_vchar(const char *ptr, int optional)
139 if (ptr[0] >= 0x21 && ptr[0] <= 0x7e)
141 return optional ? ptr : NULL;
145 osmtpd_ltok_skip_wsp(const char *ptr, int optional)
147 const char *start = ptr;
149 if ((ptr = osmtpd_ltok_skip_sp(start, 0)) != NULL ||
150 (ptr = osmtpd_ltok_skip_htab(start, 0)) != NULL)
152 return optional ? start : NULL;
155 /* RFC 5321 - Simple Mail Transfer Protocol */
157 osmtpd_ltok_skip_keyword(const char *ptr, int optional)
159 return osmtpd_ltok_skip_ldh_string(ptr, optional);
163 osmtpd_ltok_skip_sub_domain(const char *ptr, int optional)
165 const char *start = ptr;
167 if ((ptr = osmtpd_ltok_skip_let_dig(ptr, 0)) == NULL)
168 return optional ? start : NULL;
169 return osmtpd_ltok_skip_ldh_string(ptr, 1);
173 osmtpd_ltok_skip_let_dig(const char *ptr, int optional)
175 const char *start = ptr;
177 if ((ptr = osmtpd_ltok_skip_alpha(start, 0)) == NULL &&
178 (ptr = osmtpd_ltok_skip_digit(start, 0)) == NULL)
179 return optional ? start : NULL;
184 osmtpd_ltok_skip_ldh_string(const char *ptr, int optional)
186 const char *start = ptr, *prev;
191 if ((ptr = osmtpd_ltok_skip_alpha(prev, 0)) != NULL ||
192 (ptr = osmtpd_ltok_skip_digit(prev, 0)) != NULL) {
196 if (prev[0] == '-') {
207 return optional ? start : NULL;
211 /* RFC 5322 - Internet Message Format */
213 osmtpd_ltok_skip_quoted_pair(const char *ptr, int optional)
215 const char *start = ptr;
217 if (ptr[0] == '\\' && (
218 (ptr = osmtpd_ltok_skip_vchar(start + 1, 0)) != NULL ||
219 (ptr = osmtpd_ltok_skip_wsp(start + 1, 0)) != NULL))
221 return osmtpd_ltok_skip_obs_qp(start, optional);
225 osmtpd_ltok_skip_fws(const char *ptr, int optional)
227 const char *start = ptr, *prev = ptr;
229 while ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) != NULL)
231 if ((ptr = osmtpd_ltok_skip_crlf(prev, 1)) == prev)
233 if ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) == NULL)
234 return osmtpd_ltok_skip_obs_fws(start, optional);
236 while ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) != NULL)
242 osmtpd_ltok_skip_ctext(const char *ptr, int optional)
244 const char *start = ptr;
246 if ((ptr[0] >= 33 && ptr[0] <= 39) || (ptr[0] >= 42 && ptr[0] <= 91) ||
247 (ptr[0] >= 93 && ptr[0] <= 126))
249 if ((ptr = osmtpd_ltok_skip_obs_ctext(ptr, 0)) != NULL)
251 return optional ? start : NULL;
255 osmtpd_ltok_skip_ccontent(const char *ptr, int optional)
257 const char *start = ptr;
259 if ((ptr = osmtpd_ltok_skip_ctext(ptr, 0)) != NULL)
261 if ((ptr = osmtpd_ltok_skip_quoted_pair(start, 0)) != NULL)
263 if ((ptr = osmtpd_ltok_skip_comment(start, 0)) != NULL)
265 return optional ? start : NULL;
269 osmtpd_ltok_skip_comment(const char *ptr, int optional)
271 const char *start = ptr;
274 return optional ? start : NULL;
276 ptr = osmtpd_ltok_skip_fws(ptr, 1);
279 if ((ptr = osmtpd_ltok_skip_ccontent(ptr, 0)) == NULL)
280 return optional ? start : NULL;
285 osmtpd_ltok_skip_cfws(const char *ptr, int optional)
287 const char *start = ptr, *prev;
290 ptr = osmtpd_ltok_skip_fws(ptr, 1);
292 if ((ptr = osmtpd_ltok_skip_comment(ptr, 0)) == NULL) {
297 return ptr == start && !optional ? NULL : ptr;
301 osmtpd_ltok_skip_atext(const char *ptr, int optional)
303 const char *start = ptr;
305 if ((ptr = osmtpd_ltok_skip_alpha(start, 0)) != NULL ||
306 (ptr = osmtpd_ltok_skip_digit(start, 0)) != NULL)
309 if (ptr[0] == '!' || ptr[0] == '#' || ptr[0] == '$' || ptr[0] == '%' ||
310 ptr[0] == '&' || ptr[0] == '\'' || ptr[0] == '*' || ptr[0] == '+' ||
311 ptr[0] == '-' || ptr[0] == '/' || ptr[0] == '=' || ptr[0] == '?' ||
312 ptr[0] == '^' || ptr[0] == '_' || ptr[0] == '`' || ptr[0] == '{' ||
313 ptr[0] == '|' || ptr[0] == '}' || ptr[0] == '~')
315 return optional ? start : NULL;
319 osmtpd_ltok_skip_atom(const char *ptr, int optional)
321 const char *start = ptr, *prev;
323 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
324 if ((ptr = osmtpd_ltok_skip_atext(ptr, 0)) == NULL)
325 return optional ? start : NULL;
328 ptr = osmtpd_ltok_skip_atext(ptr, 1);
329 } while (prev != ptr);
330 return osmtpd_ltok_skip_cfws(ptr, 1);
334 osmtpd_ltok_skip_dot_atom_text(const char *ptr, int optional)
336 const char *start = ptr, *prev;
338 if ((ptr = osmtpd_ltok_skip_atext(ptr, 0)) == NULL)
339 return optional ? start : NULL;
342 ptr = osmtpd_ltok_skip_atext(ptr, 1);
343 } while (ptr != prev);
345 while (ptr[0] == '.') {
347 if ((ptr = osmtpd_ltok_skip_atext(ptr, 0)) == NULL)
351 ptr = osmtpd_ltok_skip_atext(ptr, 1);
352 } while (ptr != prev);
358 osmtpd_ltok_skip_dot_atom(const char *ptr, int optional)
360 const char *start = ptr;
362 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
363 if ((ptr = osmtpd_ltok_skip_dot_atom_text(ptr, 0)) == NULL)
364 return optional ? start : NULL;
365 return osmtpd_ltok_skip_cfws(ptr, 1);
369 osmtpd_ltok_skip_qtext(const char *ptr, int optional)
371 const char *start = ptr;
373 if (ptr[0] == 33 || (ptr[0] >= 35 && ptr[0] <= 91) ||
374 (ptr[0] >= 93 && ptr[0] <= 126))
376 if ((ptr = osmtpd_ltok_skip_obs_qtext(ptr, 0)) != NULL)
378 return optional ? start : NULL;
382 osmtpd_ltok_skip_qcontent(const char *ptr, int optional)
384 const char *start = ptr;
386 if ((ptr = osmtpd_ltok_skip_qtext(ptr, 0)) != NULL)
388 return osmtpd_ltok_skip_quoted_pair(start, optional);
392 osmtpd_ltok_skip_quoted_string(const char *ptr, int optional)
394 const char *start = ptr, *prev;
396 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
397 if ((ptr = osmtpd_ltok_skip_dquote(ptr, 0)) == NULL)
398 return optional ? start : NULL;
401 ptr = osmtpd_ltok_skip_fws(ptr, 1);
402 if ((ptr = osmtpd_ltok_skip_qcontent(ptr, 0)) == NULL)
406 if ((ptr = osmtpd_ltok_skip_dquote(prev, 0)) == NULL)
407 return optional ? start : NULL;
408 return osmtpd_ltok_skip_cfws(ptr, 1);
412 osmtpd_ltok_skip_word(const char *ptr, int optional)
414 const char *start = ptr;
416 if ((ptr = osmtpd_ltok_skip_atom(ptr, 0)) != NULL)
418 return osmtpd_ltok_skip_quoted_string(start, optional);
422 osmtpd_ltok_skip_phrase(const char *ptr, int optional)
424 /* obs-phrase is a superset of phrae */
425 return osmtpd_ltok_skip_obs_phrase(ptr, optional);
429 osmtpd_ltok_skip_name_addr(const char *ptr, int optional)
431 const char *start = ptr;
433 ptr = osmtpd_ltok_skip_display_name(ptr, 1);
434 if ((ptr = osmtpd_ltok_skip_angle_addr(ptr, 0)) == NULL)
435 return optional ? start : NULL;
440 osmtpd_ltok_skip_angle_addr(const char *ptr, int optional)
442 const char *start = ptr;
444 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
446 return osmtpd_ltok_skip_obs_angle_addr(start, optional);
447 if ((ptr = osmtpd_ltok_skip_addr_spec(ptr, 0)) == NULL)
448 return osmtpd_ltok_skip_obs_angle_addr(start, optional);
450 return osmtpd_ltok_skip_obs_angle_addr(start, optional);
451 return osmtpd_ltok_skip_cfws(ptr, 1);
455 osmtpd_ltok_skip_display_name(const char *ptr, int optional)
457 return osmtpd_ltok_skip_phrase(ptr, optional);
461 osmtpd_ltok_skip_addr_spec(const char *ptr, int optional)
463 const char *start = ptr;
465 if ((ptr = osmtpd_ltok_skip_local_part(ptr, 0)) == NULL)
466 return optional ? start : NULL;
468 return optional ? start : NULL;
469 if ((ptr = osmtpd_ltok_skip_domain(ptr, 0)) == NULL)
470 return optional ? start : NULL;
475 osmtpd_ltok_skip_local_part(const char *ptr, int optional)
477 const char *start = ptr;
479 if ((ptr = osmtpd_ltok_skip_dot_atom(ptr, 0)) != NULL)
482 if ((ptr = osmtpd_ltok_skip_quoted_string(ptr, 0)) != NULL)
484 return osmtpd_ltok_skip_obs_local_part(start, optional);
488 osmtpd_ltok_skip_domain(const char *ptr, int optional)
490 const char *start = ptr;
492 if ((ptr = osmtpd_ltok_skip_dot_atom(start, 0)) != NULL)
494 if ((ptr = osmtpd_ltok_skip_domain_literal(start, 0)) != NULL)
496 return osmtpd_ltok_skip_obs_domain(start, optional);
500 osmtpd_ltok_skip_domain_literal(const char *ptr, int optional)
502 const char *start = ptr, *prev;
504 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
506 return optional ? start : NULL;
508 ptr = osmtpd_ltok_skip_fws(ptr, 1);
510 if ((ptr = osmtpd_ltok_skip_dtext(ptr, 0)) == NULL) {
516 return optional ? start : NULL;
518 return osmtpd_ltok_skip_cfws(ptr, 1);
522 osmtpd_ltok_skip_dtext(const char *ptr, int optional)
524 if ((ptr[0] >= 33 && ptr[0] <= 90) || (ptr[0] >= 94 && ptr[0] <= 126))
526 return osmtpd_ltok_skip_obs_dtext(ptr, optional);
531 osmtpd_ltok_skip_field_name(const char *ptr, int optional)
533 const char *start = ptr;
535 if ((ptr = osmtpd_ltok_skip_ftext(ptr, 0)) == NULL)
536 return optional ? start : NULL;
539 if ((ptr = osmtpd_ltok_skip_ftext(ptr, 0)) == NULL)
545 osmtpd_ltok_skip_ftext(const char *ptr, int optional)
547 if ((ptr[0] >= 33 && ptr[0] <= 57) ||
548 (ptr[0] >= 59 && ptr[0] <= 126))
550 return optional ? ptr : NULL;
554 osmtpd_ltok_skip_obs_no_ws_ctl(const char *ptr, int optional)
556 if ((ptr[0] >= 1 && ptr[0] <= 8) || ptr[0] == 11 || ptr[0] == 12 ||
557 (ptr[0] >= 14 && ptr[0] <= 31) || ptr[0] == 127)
559 return optional ? ptr : NULL;
563 osmtpd_ltok_skip_obs_ctext(const char *ptr, int optional)
565 return osmtpd_ltok_skip_obs_no_ws_ctl(ptr, optional);
569 osmtpd_ltok_skip_obs_qtext(const char *ptr, int optional)
571 return osmtpd_ltok_skip_obs_no_ws_ctl(ptr, optional);
575 osmtpd_ltok_skip_obs_qp(const char *ptr, int optional)
577 const char *start = ptr;
579 if (ptr[0] == '\\' && (
580 (ptr = osmtpd_ltok_skip_obs_no_ws_ctl(start + 1, 0)) != NULL ||
581 (ptr = osmtpd_ltok_skip_lf(start + 1, 0)) != NULL ||
582 (ptr = osmtpd_ltok_skip_cr(start + 1, 0)) != NULL))
584 return optional ? start : NULL;
588 osmtpd_ltok_skip_obs_phrase(const char *ptr, int optional)
590 const char *start = ptr, *prev;
592 if ((ptr = osmtpd_ltok_skip_word(ptr, 0)) == NULL)
593 return optional ? start : NULL;
596 if ((ptr = osmtpd_ltok_skip_word(ptr, 0)) != NULL)
603 if ((ptr = osmtpd_ltok_skip_cfws(ptr, 0)) != NULL)
610 osmtpd_ltok_skip_obs_fws(const char *ptr, int optional)
612 const char *start = ptr, *prev;
614 if ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) == NULL)
615 return optional ? start : NULL;
617 while ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) != NULL)
622 if ((ptr = osmtpd_ltok_skip_crlf(ptr, 0)) == NULL)
624 if ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) == NULL)
627 while ((ptr = osmtpd_ltok_skip_wsp(ptr, 0)) != NULL)
634 osmtpd_ltok_skip_obs_angle_addr(const char *ptr, int optional)
636 const char *start = ptr;
638 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
640 return optional ? start : NULL;
641 if ((ptr = osmtpd_ltok_skip_obs_route(ptr, 0)) == NULL)
642 return optional ? start : NULL;
643 if ((ptr = osmtpd_ltok_skip_addr_spec(ptr, 0)) == NULL)
644 return optional ? start : NULL;
646 return optional ? start : NULL;
647 return osmtpd_ltok_skip_cfws(ptr, 1);
651 osmtpd_ltok_skip_obs_route(const char *ptr, int optional)
653 const char *start = ptr;
655 if ((ptr = osmtpd_ltok_skip_obs_domain_list(ptr, 0)) == NULL)
656 return optional ? start : NULL;
658 return optional ? start : NULL;
663 osmtpd_ltok_skip_obs_domain_list(const char *ptr, int optional)
665 const char *start = ptr, *prev = ptr;
672 } else if ((ptr = osmtpd_ltok_skip_cfws(ptr, 0)) != NULL) {
681 return optional ? start : NULL;
682 if ((ptr = osmtpd_ltok_skip_domain(ptr, 0)) == NULL)
683 return optional ? start : NULL;
688 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
692 if ((ptr = osmtpd_ltok_skip_domain(ptr + 1, 0)) == NULL) {
701 osmtpd_ltok_skip_obs_local_part(const char *ptr, int optional)
703 const char *start = ptr, *prev;
705 if ((ptr = osmtpd_ltok_skip_word(ptr, 0)) == NULL)
706 return optional ? start : NULL;
708 while (ptr[0] == '.') {
710 if ((ptr = osmtpd_ltok_skip_word(ptr, 0)) == NULL)
718 osmtpd_ltok_skip_obs_domain(const char *ptr, int optional)
720 const char *start = ptr, *prev;
722 if ((ptr = osmtpd_ltok_skip_atom(ptr, 0)) == NULL)
723 return optional ? start : NULL;
728 if ((ptr = osmtpd_ltok_skip_atom(ptr, 0)) == NULL)
735 osmtpd_ltok_skip_obs_dtext(const char *ptr, int optional)
737 const char *start = ptr;
739 if ((ptr = osmtpd_ltok_skip_obs_no_ws_ctl(ptr, 0)) != NULL)
741 return osmtpd_ltok_skip_quoted_pair(start, optional);
744 /* RFC 2045 - Multipurpose Internet Mail Extensions */
746 osmtpd_ltok_skip_value(const char *ptr, int optional)
748 const char *start = ptr;
750 if ((ptr = osmtpd_ltok_skip_token(start, 0)) != NULL)
752 if ((ptr = osmtpd_ltok_skip_quoted_string(start, 0)) != NULL)
754 return optional ? start : NULL;
758 osmtpd_ltok_skip_token(const char *ptr, int optional)
765 if ((ptr = osmtpd_ltok_skip_char(start, 0)) != NULL &&
766 osmtpd_ltok_skip_sp(start, 0) == NULL &&
767 osmtpd_ltok_skip_ctl(start, 0) == NULL &&
768 osmtpd_ltok_skip_tspecials(start, 0) == NULL) {
772 return optional || !first ? start : NULL;
777 osmtpd_ltok_skip_tspecials(const char *ptr, int optional)
779 if (ptr[0] == '(' || ptr[0] == ')' || ptr[0] == '<' || ptr[0] == '>' ||
780 ptr[0] == '@' || ptr[0] == ',' || ptr[0] == ';' || ptr[0] == ':' ||
781 ptr[0] == '\\' || ptr[0] == '"' || ptr[0] == '/' || ptr[0] == '[' ||
782 ptr[0] == ']' || ptr[0] == '?' || ptr[0] == '=')
784 return optional ? ptr : NULL;
788 osmtpd_ltok_skip_qp_section(const char *ptr, int optional)
790 const char *prev, *last = ptr;
794 if ((ptr = osmtpd_ltok_skip_ptext(prev, 0)) != NULL)
796 else if ((ptr = osmtpd_ltok_skip_sp(prev, 0)) == NULL &&
797 (ptr = osmtpd_ltok_skip_htab(prev, 0)) == NULL)
803 osmtpd_ltok_skip_ptext(const char *ptr, int optional)
805 const char *start = ptr;
807 if ((ptr = osmtpd_ltok_skip_hex_octet(start, 0)) == NULL &&
808 (ptr = osmtpd_ltok_skip_safe_char(start, 0)) == NULL)
809 return optional ? start : NULL;
814 osmtpd_ltok_skip_safe_char(const char *ptr, int optional)
816 if ((ptr[0] >= 33 && ptr[0] <= 60) || (ptr[0] >= 62 && ptr[0] <= 126))
818 return optional ? ptr : NULL;
822 osmtpd_ltok_skip_hex_octet(const char *ptr, int optional)
824 const char *start = ptr;
828 return optional ? start : NULL;
831 if (l == 'a' || l == 'b' || l == 'c' || l == 'd' ||
832 l == 'e' || l == 'f')
834 else if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) == NULL)
835 return optional ? start : NULL;
838 if (l == 'a' || l == 'b' || l == 'c' || l == 'd' ||
839 l == 'e' || l == 'f')
841 else if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) == NULL)
846 /* RFC 6376 - DomainKeys Identified Mail (DKIM) Signatures */
848 osmtpd_ltok_skip_hyphenated_word(const char *ptr, int optional)
850 const char *start = ptr, *end;
852 if ((ptr = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL)
853 return optional ? start : NULL;
858 if ((ptr = osmtpd_ltok_skip_alpha(start, 0)) != NULL ||
859 (ptr = osmtpd_ltok_skip_digit(start, 0)) != NULL) {
861 } else if (start[0] == '-')
870 osmtpd_ltok_skip_alphadigitps(const char *ptr, int optional)
874 if ((end = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL &&
875 (end = osmtpd_ltok_skip_digit(ptr, 0)) == NULL &&
876 ptr[0] != '+' && ptr[0] != '/')
877 return optional ? ptr : NULL;
878 return end == NULL ? ptr + 1 : end;
882 osmtpd_ltok_skip_base64string(const char *ptr, int optional)
884 const char *start = ptr;
886 if ((ptr = osmtpd_ltok_skip_alphadigitps(ptr, 0)) == NULL)
887 return optional ? start : NULL;
890 ptr = osmtpd_ltok_skip_fws(ptr, 1);
891 if ((ptr = osmtpd_ltok_skip_alphadigitps(ptr, 0)) == NULL)
895 ptr = osmtpd_ltok_skip_fws(ptr, 1);
899 ptr = osmtpd_ltok_skip_fws(ptr, 1);
910 osmtpd_ltok_skip_hdr_name(const char *ptr, int optional)
912 return osmtpd_ltok_skip_field_name(ptr, optional);
916 osmtpd_ltok_skip_qp_hdr_value(const char *ptr, int optional)
918 return osmtpd_ltok_skip_dkim_quoted_printable(ptr, optional);
922 osmtpd_ltok_skip_dkim_quoted_printable(const char *ptr, int optional)
928 if ((ptr = osmtpd_ltok_skip_fws(start, 0)) != NULL)
930 if ((ptr = osmtpd_ltok_skip_hex_octet(start, 0)) != NULL)
932 ptr = osmtpd_ltok_skip_dkim_safe_char(start, 0);
940 osmtpd_ltok_skip_dkim_safe_char(const char *ptr, int optional)
942 if ((ptr[0] >= 0x21 && ptr[0] <= 0x3a) || ptr[0] == 0x3c ||
943 (ptr[0] >= 0x3e && ptr[0] <= 0x7e))
945 return optional ? ptr : NULL;
949 osmtpd_ltok_skip_selector(const char *ptr, int optional)
951 const char *start = ptr;
953 if ((ptr = osmtpd_ltok_skip_sub_domain(ptr, 0)) == NULL)
954 return optional ? start : NULL;
960 if ((ptr = osmtpd_ltok_skip_sub_domain(ptr, 0)) == NULL)
966 osmtpd_ltok_skip_tag_list(const char *ptr, int optional)
968 const char *start = ptr;
970 if ((ptr = osmtpd_ltok_skip_tag_spec(ptr, 0)) == NULL)
971 return optional ? start : NULL;
973 /* Starting or trailing ';' */
978 if ((ptr = osmtpd_ltok_skip_tag_spec(ptr, 0)) == NULL)
984 osmtpd_ltok_skip_tag_spec(const char *ptr, int optional)
986 const char *start = ptr;
988 ptr = osmtpd_ltok_skip_fws(ptr, 1);
989 if ((ptr = osmtpd_ltok_skip_tag_name(ptr, 0)) == NULL)
990 return optional ? start : NULL;
991 ptr = osmtpd_ltok_skip_fws(ptr, 1);
993 return optional ? start : NULL;
995 ptr = osmtpd_ltok_skip_fws(ptr, 1);
996 if ((ptr = osmtpd_ltok_skip_tag_value(ptr, 0)) == NULL)
997 return optional ? start : NULL;
998 return osmtpd_ltok_skip_fws(ptr, 1);
1002 osmtpd_ltok_skip_tag_name(const char *ptr, int optional)
1004 const char *start = ptr, *prev;
1006 if ((ptr = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL)
1007 return optional ? start : NULL;
1009 while ((ptr = osmtpd_ltok_skip_alnumpunc(ptr, 0)) != NULL)
1015 osmtpd_ltok_skip_tag_value(const char *ptr, int optional)
1017 const char *start = ptr, *prev;
1019 if ((ptr = osmtpd_ltok_skip_tval(ptr, 0)) == NULL)
1024 /* FWS contains WSP */
1025 if ((ptr = osmtpd_ltok_skip_fws(ptr, 0)) == NULL)
1028 while ((ptr = osmtpd_ltok_skip_fws(ptr, 0)) != NULL)
1031 if ((ptr = osmtpd_ltok_skip_tval(ptr, 0)) == NULL)
1037 osmtpd_ltok_skip_tval(const char *ptr, int optional)
1039 const char *start = ptr, *prev;
1041 if ((ptr = osmtpd_ltok_skip_valchar(ptr, 0)) == NULL)
1042 return optional ? start : NULL;
1044 while ((ptr = osmtpd_ltok_skip_valchar(ptr, 0)) != NULL)
1050 osmtpd_ltok_skip_valchar(const char *ptr, int optional)
1052 if ((ptr[0] >= 0x21 && ptr[0] <= 0x3A) ||
1053 (ptr[0] >= 0x3C && ptr[0] <= 0x7E))
1055 return optional ? ptr : NULL;
1059 osmtpd_ltok_skip_alnumpunc(const char *ptr, int optional)
1061 const char *start = ptr;
1063 if ((ptr = osmtpd_ltok_skip_alpha(start, 0)) != NULL)
1065 if ((ptr = osmtpd_ltok_skip_digit(start, 0)) != NULL)
1067 if (start[0] == '_')
1069 return optional ? start : NULL;
1073 osmtpd_ltok_skip_sig_v_tag(const char *ptr, int optional)
1075 const char *start = ptr;
1078 return optional ? start : NULL;
1079 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1081 return optional ? start : NULL;
1082 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1083 if ((ptr = osmtpd_ltok_skip_sig_v_tag_value(ptr, 0)) == NULL)
1084 return optional ? start : NULL;
1089 osmtpd_ltok_skip_sig_v_tag_value(const char *ptr, int optional)
1091 const char *start = ptr, *prev;
1093 if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) == NULL)
1094 return optional ? start : NULL;
1097 if ((ptr = osmtpd_ltok_skip_digit(ptr, 0)) == NULL)
1103 osmtpd_ltok_skip_sig_a_tag(const char *ptr, int optional)
1105 const char *start = ptr;
1108 return optional ? start : NULL;
1109 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1111 return optional ? start : NULL;
1112 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1113 if ((ptr = osmtpd_ltok_skip_sig_a_tag_value(ptr, 0)) == NULL)
1114 return optional ? start : NULL;
1119 osmtpd_ltok_skip_sig_a_tag_value(const char *ptr, int optional)
1121 return osmtpd_ltok_skip_sig_a_tag_alg(ptr, optional);
1125 osmtpd_ltok_skip_sig_a_tag_alg(const char *ptr, int optional)
1127 const char *start = ptr;
1129 if ((ptr = osmtpd_ltok_skip_sig_a_tag_k(ptr, 0)) == NULL)
1130 return optional ? start : NULL;
1132 return optional ? start : NULL;
1134 if ((ptr = osmtpd_ltok_skip_sig_a_tag_h(ptr, 0)) == NULL)
1135 return optional ? start : NULL;
1140 osmtpd_ltok_skip_sig_a_tag_k(const char *ptr, int optional)
1142 /* sha1 / sha256 covered by x-sig-a-tag-k */
1143 return osmtpd_ltok_skip_x_sig_a_tag_k(ptr, optional);
1147 osmtpd_ltok_skip_sig_a_tag_h(const char *ptr, int optional)
1149 /* rsa / ed25519 covered by x-sig-a-tag-h */
1150 return osmtpd_ltok_skip_x_sig_a_tag_h(ptr, optional);
1154 osmtpd_ltok_skip_x_sig_a_tag_k(const char *ptr, int optional)
1156 const char *start = ptr, *prev, *end;
1158 if ((ptr = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL)
1159 return optional ? start : NULL;
1161 while ((end = osmtpd_ltok_skip_alpha(ptr, 0)) != NULL ||
1162 (end = osmtpd_ltok_skip_digit(ptr, 0)) != NULL) {
1170 osmtpd_ltok_skip_x_sig_a_tag_h(const char *ptr, int optional)
1172 const char *start = ptr, *prev, *end;
1174 if ((ptr = osmtpd_ltok_skip_alpha(ptr, 0)) == NULL)
1175 return optional ? start : NULL;
1177 while ((end = osmtpd_ltok_skip_alpha(ptr, 0)) != NULL ||
1178 (end = osmtpd_ltok_skip_digit(ptr, 0)) != NULL) {
1186 osmtpd_ltok_skip_sig_b_tag(const char *ptr, int optional)
1188 const char *start = ptr;
1191 return optional ? start : NULL;
1192 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1194 return optional ? start : NULL;
1195 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1196 if ((ptr = osmtpd_ltok_skip_sig_b_tag_value(ptr, 0)) == NULL)
1197 return optional ? start : NULL;
1202 osmtpd_ltok_skip_sig_b_tag_value(const char *ptr, int optional)
1204 return osmtpd_ltok_skip_sig_b_tag_data(ptr, optional);
1208 osmtpd_ltok_skip_sig_b_tag_data(const char *ptr, int optional)
1210 return osmtpd_ltok_skip_base64string(ptr, optional);
1214 osmtpd_ltok_skip_sig_bh_tag(const char *ptr, int optional)
1216 const char *start = ptr;
1218 if (ptr[0] != 0x62 && ptr[0] != 0x68)
1219 return optional ? start : NULL;
1220 ptr = osmtpd_ltok_skip_fws(ptr + 2, 1);
1222 return optional ? start : NULL;
1223 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1224 if ((ptr = osmtpd_ltok_skip_sig_bh_tag_value(ptr, 0)) == NULL)
1225 return optional ? start : NULL;
1230 osmtpd_ltok_skip_sig_bh_tag_value(const char *ptr, int optional)
1232 return osmtpd_ltok_skip_sig_bh_tag_data(ptr, optional);
1236 osmtpd_ltok_skip_sig_bh_tag_data(const char *ptr, int optional)
1238 return osmtpd_ltok_skip_base64string(ptr, optional);
1242 osmtpd_ltok_skip_sig_c_tag(const char *ptr, int optional)
1244 const char *start = ptr;
1247 return optional ? start : NULL;
1248 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1250 return optional ? start : NULL;
1251 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1252 if ((ptr = osmtpd_ltok_skip_sig_c_tag_value(ptr, 0)) == NULL)
1253 return optional ? start : NULL;
1258 osmtpd_ltok_skip_sig_c_tag_value(const char *ptr, int optional)
1260 const char *start = ptr;
1262 if ((ptr = osmtpd_ltok_skip_sig_c_tag_alg(ptr, 0)) == NULL)
1263 return optional ? start : NULL;
1264 if (ptr[0] == '/') {
1266 if ((ptr = osmtpd_ltok_skip_sig_c_tag_alg(ptr, 0)) == NULL)
1273 osmtpd_ltok_skip_sig_c_tag_alg(const char *ptr, int optional)
1275 /* simple / relaxed covered by x-sig-c-tag-alga */
1276 return osmtpd_ltok_skip_x_sig_c_tag_alg(ptr, optional);
1280 osmtpd_ltok_skip_x_sig_c_tag_alg(const char *ptr, int optional)
1282 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1286 osmtpd_ltok_skip_sig_d_tag(const char *ptr, int optional)
1288 const char *start = ptr;
1291 return optional ? start : NULL;
1292 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1294 return optional ? start : NULL;
1295 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1296 if ((ptr = osmtpd_ltok_skip_sig_d_tag_value(ptr, 0)) == NULL)
1297 return optional ? start : NULL;
1302 osmtpd_ltok_skip_sig_d_tag_value(const char *ptr, int optional)
1304 return osmtpd_ltok_skip_domain_name(ptr, optional);
1308 osmtpd_ltok_skip_domain_name(const char *ptr, int optional)
1310 const char *prev = ptr;
1312 if ((ptr = osmtpd_ltok_skip_sub_domain(ptr, 0)) == NULL)
1313 return optional ? prev : NULL;
1316 if (ptr[0] != '.' ||
1317 (ptr = osmtpd_ltok_skip_sub_domain(ptr + 1, 0)) == NULL)
1323 osmtpd_ltok_skip_sig_h_tag(const char *ptr, int optional)
1325 const char *start = ptr;
1328 return optional ? start : NULL;
1329 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1331 return optional ? start : NULL;
1332 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1333 if ((ptr = osmtpd_ltok_skip_sig_h_tag_value(ptr, 0)) == NULL)
1334 return optional ? start : NULL;
1339 osmtpd_ltok_skip_sig_h_tag_value(const char *ptr, int optional)
1341 const char *prev = ptr;
1343 if ((ptr = osmtpd_ltok_skip_hdr_name(ptr, 0)) == NULL)
1344 return optional ? prev : NULL;
1347 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1350 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1351 if ((ptr = osmtpd_ltok_skip_hdr_name(ptr, 0)) == NULL)
1357 osmtpd_ltok_skip_sig_i_tag(const char *ptr, int optional)
1359 const char *start = ptr;
1362 return optional ? start : NULL;
1363 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1365 return optional ? start : NULL;
1366 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1367 if ((ptr = osmtpd_ltok_skip_sig_i_tag_value(ptr, 0)) == NULL)
1368 return optional ? start : NULL;
1373 osmtpd_ltok_skip_sig_i_tag_value(const char *ptr, int optional)
1375 const char *start = ptr;
1377 ptr = osmtpd_ltok_skip_local_part(ptr, 1);
1378 if (ptr[0] != '@' ||
1379 (ptr = osmtpd_ltok_skip_domain_name(ptr + 1, 0)) == NULL)
1380 return optional ? start : NULL;
1385 osmtpd_ltok_skip_sig_l_tag(const char *ptr, int optional)
1387 const char *start = ptr;
1390 return optional ? start : NULL;
1391 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1393 return optional ? start : NULL;
1394 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1395 if ((ptr = osmtpd_ltok_skip_sig_l_tag_value(ptr, 0)) == NULL)
1396 return optional ? start : NULL;
1401 osmtpd_ltok_skip_sig_l_tag_value(const char *ptr, int optional)
1405 for (i = 0; i < 76; i++) {
1406 if (osmtpd_ltok_skip_digit(ptr + i, 0) == NULL)
1409 if (i >= 1 && i <= 76)
1411 return optional ? ptr : NULL;
1415 osmtpd_ltok_skip_sig_q_tag(const char *ptr, int optional)
1417 const char *start = ptr;
1420 return optional ? start : NULL;
1421 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1423 return optional ? start : NULL;
1424 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1425 if ((ptr = osmtpd_ltok_skip_sig_q_tag_value(ptr, 0)) == NULL)
1426 return optional ? start : NULL;
1431 osmtpd_ltok_skip_sig_q_tag_value(const char *ptr, int optional)
1433 const char *prev = ptr;
1434 if ((ptr = osmtpd_ltok_skip_sig_q_tag_method(ptr, 0)) == NULL)
1435 return optional ? prev : NULL;
1438 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1441 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1442 if ((ptr = osmtpd_ltok_skip_sig_q_tag_method(ptr, 0)) == NULL)
1448 osmtpd_ltok_skip_sig_q_tag_method(const char *ptr, int optional)
1450 const char *start = ptr;
1452 /* dns/txt covered by x-sig-q-tag-type ["/" x-sig-q-tag-args] */
1453 if ((ptr = osmtpd_ltok_skip_x_sig_q_tag_type(ptr, 0)) == NULL)
1454 return optional ? start : NULL;
1458 if ((ptr = osmtpd_ltok_skip_x_sig_q_tag_args(ptr, 0)) == NULL)
1464 osmtpd_ltok_skip_x_sig_q_tag_type(const char *ptr, int optional)
1466 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1470 osmtpd_ltok_skip_x_sig_q_tag_args(const char *ptr, int optional)
1472 return osmtpd_ltok_skip_qp_hdr_value(ptr, optional);
1476 osmtpd_ltok_skip_sig_s_tag(const char *ptr, int optional)
1478 const char *start = ptr;
1481 return optional ? start : NULL;
1482 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1484 return optional ? start : NULL;
1485 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1486 if ((ptr = osmtpd_ltok_skip_sig_s_tag_value(ptr, 0)) == NULL)
1487 return optional ? start : NULL;
1492 osmtpd_ltok_skip_sig_s_tag_value(const char *ptr, int optional)
1494 return osmtpd_ltok_skip_selector(ptr, optional);
1498 osmtpd_ltok_skip_sig_t_tag(const char *ptr, int optional)
1500 const char *start = ptr;
1503 return optional ? start : NULL;
1504 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1506 return optional ? start : NULL;
1507 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1508 if ((ptr = osmtpd_ltok_skip_sig_t_tag_value(ptr, 0)) == NULL)
1509 return optional ? start : NULL;
1514 osmtpd_ltok_skip_sig_t_tag_value(const char *ptr, int optional)
1518 for (i = 0; i < 12; i++) {
1519 if (osmtpd_ltok_skip_digit(ptr + i, 0) == NULL)
1522 if (i >= 1 && i <= 12)
1524 return optional ? ptr : NULL;
1528 osmtpd_ltok_skip_sig_x_tag(const char *ptr, int optional)
1530 const char *start = ptr;
1533 return optional ? start : NULL;
1534 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1536 return optional ? start : NULL;
1537 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1538 if ((ptr = osmtpd_ltok_skip_sig_x_tag_value(ptr, 0)) == NULL)
1539 return optional ? start : NULL;
1544 osmtpd_ltok_skip_sig_x_tag_value(const char *ptr, int optional)
1548 for (i = 0; i < 12; i++) {
1549 if (osmtpd_ltok_skip_digit(ptr + i, 0) == NULL)
1552 if (i >= 1 && i <= 12)
1554 return optional ? ptr : NULL;
1558 osmtpd_ltok_skip_sig_z_tag(const char *ptr, int optional)
1560 const char *start = ptr;
1563 return optional ? start : NULL;
1564 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1566 return optional ? start : NULL;
1567 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1568 if ((ptr = osmtpd_ltok_skip_sig_z_tag_value(ptr, 0)) == NULL)
1569 return optional ? start : NULL;
1574 osmtpd_ltok_skip_sig_z_tag_value(const char *ptr, int optional)
1576 const char *prev = ptr;
1578 if ((ptr = osmtpd_ltok_skip_sig_z_tag_copy(ptr, 0)) == NULL)
1579 return optional ? ptr : NULL;
1584 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1585 if ((ptr = osmtpd_ltok_skip_sig_z_tag_copy(ptr, 0)) == NULL)
1591 osmtpd_ltok_skip_sig_z_tag_copy(const char *ptr, int optional)
1593 const char *start = ptr;
1595 if ((ptr = osmtpd_ltok_skip_hdr_name(ptr, 0)) == NULL)
1596 return optional ? start : NULL;
1597 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1599 return optional ? start : NULL;
1600 if ((ptr = osmtpd_ltok_skip_qp_hdr_value(ptr, 0)) == NULL)
1601 return optional ? start : NULL;
1606 osmtpd_ltok_skip_key_v_tag(const char *ptr, int optional)
1608 const char *start = ptr;
1611 return optional ? start : NULL;
1612 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1614 return optional ? start : NULL;
1615 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1616 if ((ptr = osmtpd_ltok_skip_key_v_tag_value(ptr, 0)) == NULL)
1617 return optional ? start : NULL;
1622 osmtpd_ltok_skip_key_v_tag_value(const char *ptr, int optional)
1624 if (ptr[0] == 0x44 && ptr[1] == 0x4b && ptr[2] == 0x49 &&
1625 ptr[3] == 0x4d && ptr[4] == 0x31)
1627 return optional ? ptr : NULL;
1631 osmtpd_ltok_skip_key_h_tag(const char *ptr, int optional)
1633 const char *start = ptr;
1636 return optional ? start : NULL;
1637 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1639 return optional ? start : NULL;
1640 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1641 if ((ptr = osmtpd_ltok_skip_key_h_tag_value(ptr, 0)) == NULL)
1642 return optional ? start : NULL;
1647 osmtpd_ltok_skip_key_h_tag_value(const char *ptr, int optional)
1649 const char *prev = ptr;
1651 if ((ptr = osmtpd_ltok_skip_key_h_tag_alg(ptr, 0)) == NULL)
1652 return optional ? prev : NULL;
1655 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1658 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1659 if ((ptr = osmtpd_ltok_skip_key_h_tag_alg(ptr, 0)) == NULL)
1665 osmtpd_ltok_skip_key_h_tag_alg(const char *ptr, int optional)
1667 /* sha1 / sha256 covered by x-key-h-tag-alg */
1668 return osmtpd_ltok_skip_x_key_h_tag_alg(ptr, optional);
1672 osmtpd_ltok_skip_x_key_h_tag_alg(const char *ptr, int optional)
1674 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1678 osmtpd_ltok_skip_key_k_tag(const char *ptr, int optional)
1680 const char *start = ptr;
1683 return optional ? start : NULL;
1684 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1686 return optional ? start : NULL;
1687 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1688 if ((ptr = osmtpd_ltok_skip_key_k_tag_value(ptr, 0)) == NULL)
1689 return optional ? start : NULL;
1694 osmtpd_ltok_skip_key_k_tag_value(const char *ptr, int optional)
1696 const char *start = ptr;
1698 if ((ptr = osmtpd_ltok_skip_key_k_tag_type(ptr, 0)) == NULL)
1699 return optional ? start : NULL;
1704 osmtpd_ltok_skip_key_k_tag_type(const char *ptr, int optional)
1706 /* rsa covered by x-key-k-tag-type */
1707 return osmtpd_ltok_skip_x_key_k_tag_type(ptr, optional);
1711 osmtpd_ltok_skip_x_key_k_tag_type(const char *ptr, int optional)
1713 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1717 osmtpd_ltok_skip_key_n_tag(const char *ptr, int optional)
1719 const char *start = ptr;
1722 return optional ? start : NULL;
1723 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1725 return optional ? start : NULL;
1726 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1727 if ((ptr = osmtpd_ltok_skip_key_n_tag_value(ptr, 0)) == NULL)
1728 return optional ? start : NULL;
1733 osmtpd_ltok_skip_key_n_tag_value(const char *ptr, int optional)
1735 return osmtpd_ltok_skip_qp_section(ptr, optional);
1739 osmtpd_ltok_skip_key_p_tag(const char *ptr, int optional)
1741 const char *start = ptr;
1744 return optional ? start : NULL;
1745 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1747 return optional ? start : NULL;
1748 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1749 if ((ptr = osmtpd_ltok_skip_key_p_tag_value(ptr, 0)) == NULL)
1750 return optional ? start : NULL;
1755 osmtpd_ltok_skip_key_p_tag_value(const char *ptr, int optional)
1757 const char *start = ptr;
1759 if ((ptr = osmtpd_ltok_skip_base64string(ptr, 0)) == NULL)
1760 return optional ? start : NULL;
1765 osmtpd_ltok_skip_key_s_tag(const char *ptr, int optional)
1767 const char *start = ptr;
1770 return optional ? start : NULL;
1771 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1773 return optional ? start : NULL;
1774 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1775 if ((ptr = osmtpd_ltok_skip_key_s_tag_value(ptr, 0)) == NULL)
1776 return optional ? start : NULL;
1781 osmtpd_ltok_skip_key_s_tag_value(const char *ptr, int optional)
1783 const char *start = ptr;
1785 if ((ptr = osmtpd_ltok_skip_key_s_tag_type(ptr, 0)) == NULL)
1786 return optional ? start : NULL;
1789 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1792 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1793 ptr = osmtpd_ltok_skip_key_s_tag_type(ptr, 0);
1800 osmtpd_ltok_skip_key_s_tag_type(const char *ptr, int optional)
1804 /* email covered by x-key-s-tag-type */
1805 return osmtpd_ltok_skip_x_key_s_tag_type(ptr, optional);
1809 osmtpd_ltok_skip_x_key_s_tag_type(const char *ptr, int optional)
1811 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1815 osmtpd_ltok_skip_key_t_tag(const char *ptr, int optional)
1817 const char *start = ptr;
1820 return optional ? start : NULL;
1821 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1823 return optional ? start : NULL;
1824 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1825 if ((ptr = osmtpd_ltok_skip_key_t_tag_value(ptr, 0)) == NULL)
1826 return optional ? start : NULL;
1831 osmtpd_ltok_skip_key_t_tag_value(const char *ptr, int optional)
1833 const char *start = ptr;
1835 if ((ptr = osmtpd_ltok_skip_key_t_tag_flag(ptr, 0)) == NULL)
1836 return optional ? start : NULL;
1839 ptr = osmtpd_ltok_skip_fws(ptr, 1);
1842 ptr = osmtpd_ltok_skip_fws(ptr + 1, 1);
1843 ptr = osmtpd_ltok_skip_key_t_tag_flag(ptr, 0);
1850 osmtpd_ltok_skip_key_t_tag_flag(const char *ptr, int optional)
1852 /* y / s covered by x-key-t-tag-flag */
1853 return osmtpd_ltok_skip_x_key_t_tag_flag(ptr, optional);
1857 osmtpd_ltok_skip_x_key_t_tag_flag(const char *ptr, int optional)
1859 return osmtpd_ltok_skip_hyphenated_word(ptr, optional);
1863 osmtpd_ltok_skip_ar_pvalue(const char *ptr, int optional)
1865 const char *start = ptr, *tmp;
1867 ptr = osmtpd_ltok_skip_cfws(ptr, 1);
1868 if ((tmp = osmtpd_ltok_skip_value(ptr, 0)) != NULL)
1870 ptr = osmtpd_ltok_skip_local_part(ptr, 1);
1873 if ((ptr = osmtpd_ltok_skip_domain(ptr, 0)) == NULL)
1874 return optional ? start : NULL;