smtpd.h revision 1.161
1/* $OpenBSD: smtpd.h,v 1.161 2009/12/13 22:02:55 jacekm Exp $ */ 2 3/* 4 * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org> 5 * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20#include <imsg.h> 21 22#ifndef nitems 23#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 24#endif 25 26#define IMSG_SIZE_CHECK(p) do { \ 27 if (IMSG_DATA_SIZE(&imsg) != sizeof(*p)) \ 28 fatalx("bad length imsg received"); \ 29} while (0) 30#define IMSG_DATA_SIZE(imsg) ((imsg)->hdr.len - IMSG_HEADER_SIZE) 31 32#define CONF_FILE "/etc/mail/smtpd.conf" 33#define MAX_LISTEN 16 34#define PROC_COUNT 9 35#define MAX_NAME_SIZE 64 36 37#define MAX_HOPS_COUNT 100 38 39/* sizes include the tailing '\0' */ 40#define MAX_LINE_SIZE 1024 41#define MAX_LOCALPART_SIZE 65 42#define MAX_DOMAINPART_SIZE MAXHOSTNAMELEN 43#define MAX_ID_SIZE 64 44#define MAX_TAG_SIZE 32 45 46/* return and forward path size */ 47#define MAX_PATH_SIZE 256 48 49#define SMTPD_QUEUE_INTERVAL (15 * 60) 50#define SMTPD_QUEUE_MAXINTERVAL (4 * 60 * 60) 51#define SMTPD_QUEUE_EXPIRY (4 * 24 * 60 * 60) 52#define SMTPD_USER "_smtpd" 53#define SMTPD_SOCKET "/var/run/smtpd.sock" 54#define SMTPD_BANNER "220 %s ESMTP OpenSMTPD" 55#define SMTPD_SESSION_TIMEOUT 300 56#define SMTPD_BACKLOG 5 57 58#define PATH_MAILLOCAL "/usr/libexec/mail.local" 59#define PATH_SMTPCTL "/usr/sbin/smtpctl" 60 61#define DIRHASH_BUCKETS 4096 62 63#define PATH_SPOOL "/var/spool/smtpd" 64 65#define PATH_ENQUEUE "/enqueue" 66#define PATH_INCOMING "/incoming" 67#define PATH_QUEUE "/queue" 68#define PATH_PURGE "/purge" 69 70#define PATH_MESSAGE "/message" 71#define PATH_ENVELOPES "/envelopes" 72 73#define PATH_RUNQUEUE "/runqueue" 74#define PATH_RUNQUEUEHIGH "/runqueue-high" 75#define PATH_RUNQUEUELOW "/runqueue-low" 76 77#define PATH_OFFLINE "/offline" 78#define PATH_BOUNCE "/bounce" 79 80/* number of MX records to lookup */ 81#define MAX_MX_COUNT 10 82 83/* max response delay under flood conditions */ 84#define MAX_RESPONSE_DELAY 60 85 86/* how many responses per state are undelayed */ 87#define FAST_RESPONSES 2 88 89/* max len of any smtp line */ 90#define SMTP_LINE_MAX 16384 91 92#define F_STARTTLS 0x01 93#define F_SMTPS 0x02 94#define F_AUTH 0x04 95#define F_SSL (F_SMTPS|F_STARTTLS) 96 97#define F_SCERT 0x01 98#define F_CCERT 0x02 99 100#define ADVERTISE_TLS(s) \ 101 ((s)->s_l->flags & F_STARTTLS && !((s)->s_flags & F_SECURE)) 102 103#define ADVERTISE_AUTH(s) \ 104 ((s)->s_l->flags & F_AUTH && (s)->s_flags & F_SECURE && \ 105 !((s)->s_flags & F_AUTHENTICATED)) 106 107struct netaddr { 108 struct sockaddr_storage ss; 109 int bits; 110}; 111 112struct relayhost { 113 u_int8_t flags; 114 char hostname[MAXHOSTNAMELEN]; 115 u_int16_t port; 116 char cert[PATH_MAX]; 117}; 118 119enum imsg_type { 120 IMSG_NONE, 121 IMSG_CTL_OK, /* answer to smtpctl requests */ 122 IMSG_CTL_FAIL, 123 IMSG_CTL_SHUTDOWN, 124 IMSG_CONF_START, 125 IMSG_CONF_SSL, 126 IMSG_CONF_SSL_CERT, 127 IMSG_CONF_SSL_KEY, 128 IMSG_CONF_LISTENER, 129 IMSG_CONF_MAP, 130 IMSG_CONF_MAP_CONTENT, 131 IMSG_CONF_RULE, 132 IMSG_CONF_RULE_SOURCE, 133 IMSG_CONF_CONDITION, 134 IMSG_CONF_OPTION, 135 IMSG_CONF_END, 136 IMSG_CONF_RELOAD, 137 IMSG_LKA_MAIL, 138 IMSG_LKA_RCPT, 139 IMSG_LKA_SECRET, 140 IMSG_LKA_RULEMATCH, 141 IMSG_MDA_FINALIZE, 142 IMSG_MFA_RCPT, 143 IMSG_MFA_MAIL, 144 145 IMSG_QUEUE_CREATE_MESSAGE, 146 IMSG_QUEUE_SUBMIT_ENVELOPE, 147 IMSG_QUEUE_COMMIT_ENVELOPES, 148 IMSG_QUEUE_REMOVE_MESSAGE, 149 IMSG_QUEUE_COMMIT_MESSAGE, 150 IMSG_QUEUE_TEMPFAIL, 151 IMSG_QUEUE_STATS, 152 153 IMSG_QUEUE_REMOVE_SUBMISSION, 154 IMSG_QUEUE_MESSAGE_UPDATE, 155 IMSG_QUEUE_MESSAGE_FD, 156 IMSG_QUEUE_MESSAGE_FILE, 157 158 IMSG_RUNNER_UPDATE_ENVELOPE, 159 IMSG_RUNNER_STATS, 160 IMSG_RUNNER_SCHEDULE, 161 162 IMSG_BATCH_CREATE, 163 IMSG_BATCH_APPEND, 164 IMSG_BATCH_CLOSE, 165 166 IMSG_PARENT_ENQUEUE_OFFLINE, 167 IMSG_PARENT_FORWARD_OPEN, 168 IMSG_PARENT_MAILBOX_OPEN, 169 IMSG_PARENT_MESSAGE_OPEN, 170 IMSG_PARENT_MAILDIR_RENAME, 171 IMSG_PARENT_MAILDIR_FAIL, 172 IMSG_PARENT_STATS, 173 174 IMSG_PARENT_AUTHENTICATE, 175 IMSG_PARENT_SEND_CONFIG, 176 177 IMSG_MDA_PAUSE, 178 IMSG_MTA_PAUSE, 179 IMSG_SMTP_PAUSE, 180 IMSG_SMTP_STATS, 181 182 IMSG_MDA_RESUME, 183 IMSG_MTA_RESUME, 184 IMSG_SMTP_RESUME, 185 186 IMSG_STATS, 187 188 IMSG_SMTP_ENQUEUE, 189 190 IMSG_DNS_A, 191 IMSG_DNS_A_END, 192 IMSG_DNS_MX, 193 IMSG_DNS_PTR 194}; 195 196enum blockmodes { 197 BM_NORMAL, 198 BM_NONBLOCK 199}; 200 201struct imsgev { 202 struct imsgbuf ibuf; 203 void (*handler)(int, short, void *); 204 struct event ev; 205 void *data; 206 short events; 207}; 208 209struct ctl_conn { 210 TAILQ_ENTRY(ctl_conn) entry; 211 u_int8_t flags; 212#define CTL_CONN_NOTIFY 0x01 213 struct imsgev iev; 214}; 215TAILQ_HEAD(ctl_connlist, ctl_conn); 216 217typedef u_int32_t objid_t; 218 219struct ctl_id { 220 objid_t id; 221 char name[MAX_NAME_SIZE]; 222}; 223 224enum smtp_proc_type { 225 PROC_PARENT = 0, 226 PROC_SMTP, 227 PROC_MFA, 228 PROC_LKA, 229 PROC_QUEUE, 230 PROC_MDA, 231 PROC_MTA, 232 PROC_CONTROL, 233 PROC_RUNNER, 234} smtpd_process; 235 236struct peer { 237 enum smtp_proc_type id; 238 void (*cb)(int, short, void *); 239}; 240 241enum map_type { 242 T_SINGLE, 243 T_LIST, 244 T_HASH 245}; 246 247enum map_src { 248 S_NONE, 249 S_DYN, 250 S_DNS, 251 S_FILE, 252 S_DB, 253 S_EXT 254}; 255 256enum mapel_type { 257 ME_STRING, 258 ME_NET, 259 ME_NETMASK 260}; 261 262struct mapel { 263 TAILQ_ENTRY(mapel) me_entry; 264 union mapel_data { 265 char med_string[MAX_LINE_SIZE]; 266 struct netaddr med_addr; 267 } me_key; 268 union mapel_data me_val; 269}; 270 271struct map { 272 TAILQ_ENTRY(map) m_entry; 273#define F_USED 0x01 274#define F_DYNAMIC 0x02 275 u_int8_t m_flags; 276 char m_name[MAX_LINE_SIZE]; 277 objid_t m_id; 278 enum map_type m_type; 279 enum mapel_type m_eltype; 280 enum map_src m_src; 281 char m_config[MAXPATHLEN]; 282 TAILQ_HEAD(mapel_list, mapel) m_contents; 283}; 284 285enum cond_type { 286 C_ALL, 287 C_NET, 288 C_DOM, 289 C_VDOM 290}; 291 292struct cond { 293 TAILQ_ENTRY(cond) c_entry; 294 objid_t c_map; 295 enum cond_type c_type; 296}; 297 298enum opt_type { 299 O_RWUSER, /* rewrite user */ 300 O_RWDOMAIN, /* rewrite domain */ 301}; 302 303struct opt { 304 TAILQ_ENTRY(opt) o_entry; 305 enum opt_type o_type; 306}; 307 308enum action_type { 309 A_INVALID, 310 A_RELAY, 311 A_RELAYVIA, 312 A_MAILDIR, 313 A_MBOX, 314 A_FILENAME, 315 A_EXT 316}; 317 318#define IS_MAILBOX(x) ((x).rule.r_action == A_MAILDIR || (x).rule.r_action == A_MBOX || (x).rule.r_action == A_FILENAME) 319#define IS_RELAY(x) ((x).rule.r_action == A_RELAY || (x).rule.r_action == A_RELAYVIA) 320#define IS_EXT(x) ((x).rule.r_action == A_EXT) 321 322struct rule { 323 TAILQ_ENTRY(rule) r_entry; 324 char r_tag[MAX_TAG_SIZE]; 325 int r_accept; 326 struct map *r_sources; 327 TAILQ_HEAD(condlist, cond) r_conditions; 328 enum action_type r_action; 329 union rule_dest { 330 char path[MAXPATHLEN]; 331 struct relayhost relayhost; 332#define MAXCOMMANDLEN 256 333 char command[MAXCOMMANDLEN]; 334 } r_value; 335 TAILQ_HEAD(optlist, opt) r_options; 336 337 char *r_user; 338 objid_t r_amap; 339}; 340 341enum path_flags { 342 F_PATH_ALIAS = 0x1, 343 F_PATH_VIRTUAL = 0x2, 344 F_PATH_EXPANDED = 0x4, 345 F_PATH_NOFORWARD = 0x8, 346 F_PATH_FORWARDED = 0x10, 347 F_PATH_ACCOUNT = 0x20, 348 F_PATH_AUTHENTICATED = 0x40, 349 F_PATH_RELAY = 0x80, 350}; 351 352struct mailaddr { 353 char user[MAX_LOCALPART_SIZE]; 354 char domain[MAX_DOMAINPART_SIZE]; 355}; 356 357union path_data { 358 char username[MAXLOGNAME]; 359 char filename[MAXPATHLEN]; 360 char filter[MAXPATHLEN]; 361 struct mailaddr mailaddr; 362}; 363 364struct path { 365 TAILQ_ENTRY(path) entry; 366 struct rule rule; 367 struct cond *cond; 368 enum path_flags flags; 369 u_int8_t forwardcnt; 370 char user[MAX_LOCALPART_SIZE]; 371 char domain[MAX_DOMAINPART_SIZE]; 372 char pw_name[MAXLOGNAME]; 373 union path_data u; 374}; 375TAILQ_HEAD(deliverylist, path); 376 377enum expand_type { 378 EXPAND_INVALID, 379 EXPAND_USERNAME, 380 EXPAND_FILENAME, 381 EXPAND_FILTER, 382 EXPAND_INCLUDE, 383 EXPAND_ADDRESS 384}; 385 386enum expand_flags { 387 F_EXPAND_NONE, 388 F_EXPAND_DONE 389}; 390 391struct expand_node { 392 RB_ENTRY(expand_node) entry; 393 size_t refcnt; 394 enum expand_flags flags; 395 enum expand_type type; 396 union path_data u; 397}; 398 399struct alias { 400 enum expand_type type; 401 union path_data u; 402}; 403 404enum message_type { 405 T_MDA_MESSAGE = 0x1, 406 T_MTA_MESSAGE = 0x2, 407 T_BOUNCE_MESSAGE = 0x4 408}; 409 410enum message_status { 411 S_MESSAGE_LOCKFAILURE = 0x1, 412 S_MESSAGE_PERMFAILURE = 0x2, 413 S_MESSAGE_TEMPFAILURE = 0x4, 414 S_MESSAGE_REJECTED = 0x8, 415 S_MESSAGE_ACCEPTED = 0x10, 416 S_MESSAGE_RETRY = 0x20, 417 S_MESSAGE_EDNS = 0x40, 418 S_MESSAGE_ECONNECT = 0x80 419}; 420 421enum message_flags { 422 F_MESSAGE_RESOLVED = 0x1, 423 F_MESSAGE_SCHEDULED = 0x2, 424 F_MESSAGE_PROCESSING = 0x4, 425 F_MESSAGE_AUTHENTICATED = 0x8, 426 F_MESSAGE_ENQUEUED = 0x10, 427 F_MESSAGE_FORCESCHEDULE = 0x20, 428 F_MESSAGE_BOUNCE = 0x40 429}; 430 431struct message { 432 TAILQ_ENTRY(message) entry; 433 434 enum message_type type; 435 436 u_int64_t id; 437 u_int64_t session_id; 438 u_int64_t batch_id; 439 440 char tag[MAX_TAG_SIZE]; 441 442 char message_id[MAX_ID_SIZE]; 443 char message_uid[MAX_ID_SIZE]; 444 445 char session_helo[MAXHOSTNAMELEN]; 446 char session_hostname[MAXHOSTNAMELEN]; 447 char session_errorline[MAX_LINE_SIZE]; 448 struct sockaddr_storage session_ss; 449 struct path session_rcpt; 450 451 struct path sender; 452 struct path recipient; 453 454 time_t creation; 455 time_t lasttry; 456 u_int8_t retry; 457 enum message_flags flags; 458 enum message_status status; 459}; 460 461enum batch_type { 462 T_MDA_BATCH = 0x1, 463 T_MTA_BATCH = 0x2, 464 T_BOUNCE_BATCH = 0x4 465}; 466 467struct batch { 468 SPLAY_ENTRY(batch) b_nodes; 469 470 u_int64_t id; 471 enum batch_type type; 472 struct rule rule; 473 474 struct smtpd *env; 475 476 char message_id[MAX_ID_SIZE]; 477 char hostname[MAXHOSTNAMELEN]; 478 479 struct message message; 480 TAILQ_HEAD(, message) messages; 481 482 FILE *mboxfp; 483 FILE *datafp; 484 int cleanup_parent; 485}; 486 487enum child_type { 488 CHILD_INVALID, 489 CHILD_DAEMON, 490 CHILD_MDA, 491 CHILD_ENQUEUE_OFFLINE 492}; 493 494struct child { 495 SPLAY_ENTRY(child) entry; 496 497 pid_t pid; 498 enum child_type type; 499 enum smtp_proc_type title; 500 struct batch mda_batch; 501}; 502 503enum session_state { 504 S_INVALID = 0, 505 S_INIT, 506 S_GREETED, 507 S_TLS, 508 S_AUTH_INIT, 509 S_AUTH_USERNAME, 510 S_AUTH_PASSWORD, 511 S_AUTH_FINALIZE, 512 S_HELO, 513 S_MAIL_MFA, 514 S_MAIL_QUEUE, 515 S_MAIL, 516 S_RCPT_MFA, 517 S_RCPT, 518 S_DATA, 519 S_DATA_QUEUE, 520 S_DATACONTENT, 521 S_DONE, 522 S_QUIT 523}; 524#define STATE_COUNT 18 525 526struct ssl { 527 SPLAY_ENTRY(ssl) ssl_nodes; 528 char ssl_name[PATH_MAX]; 529 char *ssl_cert; 530 off_t ssl_cert_len; 531 char *ssl_key; 532 off_t ssl_key_len; 533 u_int8_t flags; 534}; 535 536struct listener { 537 u_int8_t flags; 538 int fd; 539 struct sockaddr_storage ss; 540 in_port_t port; 541 struct timeval timeout; 542 struct event ev; 543 struct smtpd *env; 544 char ssl_cert_name[PATH_MAX]; 545 struct ssl *ssl; 546 void *ssl_ctx; 547 char tag[MAX_TAG_SIZE]; 548 TAILQ_ENTRY(listener) entry; 549}; 550 551struct auth { 552 u_int64_t id; 553 char user[MAXLOGNAME]; 554 char pass[MAX_LINE_SIZE]; 555 int success; 556}; 557 558enum session_flags { 559 F_EHLO = 0x1, 560 F_QUIT = 0x2, 561 F_8BITMIME = 0x4, 562 F_SECURE = 0x8, 563 F_AUTHENTICATED = 0x10, 564 F_PEERHASTLS = 0x20, 565 F_PEERHASAUTH = 0x40, 566 F_WRITEONLY = 0x80 567}; 568 569struct session { 570 SPLAY_ENTRY(session) s_nodes; 571 u_int64_t s_id; 572 573 enum session_flags s_flags; 574 enum session_state s_state; 575 int s_fd; 576 struct sockaddr_storage s_ss; 577 char s_hostname[MAXHOSTNAMELEN]; 578 struct event s_ev; 579 struct bufferevent *s_bev; 580 struct listener *s_l; 581 struct smtpd *s_env; 582 void *s_ssl; 583 u_char *s_buf; 584 int s_buflen; 585 struct timeval s_tv; 586 struct message s_msg; 587 short s_nresp[STATE_COUNT]; 588 size_t rcptcount; 589 long s_datalen; 590 591 struct auth s_auth; 592 struct batch *batch; 593 594 FILE *datafp; 595 int mboxfd; 596 int messagefd; 597}; 598 599struct smtpd { 600 char sc_conffile[MAXPATHLEN]; 601 602#define SMTPD_OPT_VERBOSE 0x00000001 603#define SMTPD_OPT_NOACTION 0x00000002 604 u_int32_t sc_opts; 605#define SMTPD_CONFIGURING 0x00000001 606#define SMTPD_EXITING 0x00000002 607#define SMTPD_MDA_PAUSED 0x00000004 608#define SMTPD_MTA_PAUSED 0x00000008 609#define SMTPD_SMTP_PAUSED 0x00000010 610 u_int32_t sc_flags; 611 struct timeval sc_qintval; 612 u_int32_t sc_maxconn; 613 struct event sc_ev; 614 int *sc_pipes[PROC_COUNT] 615 [PROC_COUNT]; 616 struct imsgev *sc_ievs[PROC_COUNT]; 617 int sc_instances[PROC_COUNT]; 618 int sc_instance; 619 char *sc_title[PROC_COUNT]; 620 struct passwd *sc_pw; 621 char sc_hostname[MAXHOSTNAMELEN]; 622 TAILQ_HEAD(listenerlist, listener) *sc_listeners; 623 TAILQ_HEAD(maplist, map) *sc_maps, *sc_maps_reload; 624 TAILQ_HEAD(rulelist, rule) *sc_rules, *sc_rules_reload; 625 SPLAY_HEAD(sessiontree, session) sc_sessions; 626 SPLAY_HEAD(msgtree, message) sc_messages; 627 SPLAY_HEAD(ssltree, ssl) *sc_ssl; 628 629 SPLAY_HEAD(batchtree, batch) batch_queue; 630 SPLAY_HEAD(childtree, child) children; 631 SPLAY_HEAD(lkatree, lkasession) lka_sessions; 632 SPLAY_HEAD(mtatree, mta_session) mta_sessions; 633 634 struct stats *stats; 635}; 636 637struct s_parent { 638 time_t start; 639}; 640 641struct s_queue { 642 size_t inserts_local; 643 size_t inserts_remote; 644}; 645 646struct s_runner { 647 size_t active; 648}; 649 650struct s_session { 651 size_t sessions; 652 size_t sessions_active; 653 654 size_t smtps; 655 size_t smtps_active; 656 657 size_t starttls; 658 size_t starttls_active; 659 660 size_t read_error; 661 size_t read_timeout; 662 size_t read_eof; 663 size_t write_error; 664 size_t write_timeout; 665 size_t write_eof; 666 size_t toofast; 667 size_t tempfail; 668 size_t linetoolong; 669 size_t delays; 670}; 671 672struct s_mda { 673 size_t write_error; 674}; 675 676struct s_control { 677 size_t sessions; 678 size_t sessions_active; 679}; 680 681struct stats { 682 struct s_parent parent; 683 struct s_queue queue; 684 struct s_runner runner; 685 struct s_session mta; 686 struct s_mda mda; 687 struct s_session smtp; 688 struct s_control control; 689}; 690 691struct sched { 692 int fd; 693 char mid[MAX_ID_SIZE]; 694 int ret; 695}; 696 697struct reload { 698 int fd; 699 int ret; 700}; 701 702struct submit_status { 703 u_int64_t id; 704 int code; 705 union submit_path { 706 struct path path; 707 char msgid[MAX_ID_SIZE]; 708 char errormsg[MAX_LINE_SIZE]; 709 } u; 710 enum message_flags flags; 711 struct sockaddr_storage ss; 712 struct message msg; 713}; 714 715struct forward_req { 716 u_int64_t id; 717 u_int8_t status; 718 char pw_name[MAXLOGNAME]; 719}; 720 721struct dns { 722 u_int64_t id; 723 char host[MAXHOSTNAMELEN]; 724 int port; 725 int error; 726 struct sockaddr_storage ss; 727 struct smtpd *env; 728 struct dns *next; 729}; 730 731struct secret { 732 u_int64_t id; 733 char host[MAXHOSTNAMELEN]; 734 char secret[MAX_LINE_SIZE]; 735}; 736 737struct rulematch { 738 u_int64_t id; 739 struct submit_status ss; 740}; 741 742enum lkasession_flags { 743 F_ERROR = 0x1 744}; 745 746struct lkasession { 747 SPLAY_ENTRY(lkasession) nodes; 748 u_int64_t id; 749 750 struct path path; 751 struct deliverylist deliverylist; 752 753 RB_HEAD(expandtree, expand_node) expandtree; 754 755 u_int8_t iterations; 756 u_int32_t pending; 757 enum lkasession_flags flags; 758 struct message message; 759 struct submit_status ss; 760}; 761 762enum mta_state { 763 MTA_INVALID_STATE, 764 MTA_INIT, 765 MTA_SECRET, 766 MTA_DATA, 767 MTA_MX, 768 MTA_CONNECT, 769 MTA_PTR, 770 MTA_PROTOCOL, 771 MTA_DONE 772}; 773 774/* mta session flags */ 775#define MTA_FORCE_ANYSSL 0x1 776#define MTA_FORCE_SMTPS 0x2 777#define MTA_ALLOW_PLAIN 0x4 778#define MTA_USE_AUTH 0x8 779 780struct mta_relay { 781 TAILQ_ENTRY(mta_relay) entry; 782 struct sockaddr_storage sa; 783 char fqdn[MAXHOSTNAMELEN]; 784 int used; 785}; 786 787struct mta_session { 788 SPLAY_ENTRY(mta_session) entry; 789 u_int64_t id; 790 struct smtpd *env; 791 enum mta_state state; 792 char *host; 793 int port; 794 int flags; 795 TAILQ_HEAD(,message) recipients; 796 TAILQ_HEAD(,mta_relay) relays; 797 char *secret; 798 int fd; 799 int datafd; 800 struct event ev; 801 char *cert; 802 void *pcb; 803}; 804 805/* aliases.c */ 806int aliases_exist(struct smtpd *, objid_t, char *); 807int aliases_get(struct smtpd *, objid_t, struct expandtree *, char *); 808int aliases_vdomain_exists(struct smtpd *, objid_t, char *); 809int aliases_virtual_exist(struct smtpd *, objid_t, struct path *); 810int aliases_virtual_get(struct smtpd *, objid_t, struct expandtree *, struct path *); 811int alias_parse(struct alias *, char *); 812void alias_to_expand_node(struct expand_node *, struct alias *); 813 814/* authenticate.c */ 815int authenticate_user(char *, char *); 816 817/* bounce.c */ 818void bounce_process(struct smtpd *, struct message *); 819int bounce_session(struct smtpd *, int, struct message *); 820int bounce_session_switch(struct smtpd *, FILE *, enum session_state *, char *, 821 struct message *); 822 823/* log.c */ 824void log_init(int); 825void log_warn(const char *, ...) 826 __attribute__ ((format (printf, 1, 2))); 827void log_warnx(const char *, ...) 828 __attribute__ ((format (printf, 1, 2))); 829void log_info(const char *, ...) 830 __attribute__ ((format (printf, 1, 2))); 831void log_debug(const char *, ...) 832 __attribute__ ((format (printf, 1, 2))); 833__dead void fatal(const char *); 834__dead void fatalx(const char *); 835 836 837/* dns.c */ 838void dns_query_a(struct smtpd *, char *, int, u_int64_t); 839void dns_query_mx(struct smtpd *, char *, int, u_int64_t); 840void dns_query_ptr(struct smtpd *, struct sockaddr_storage *, 841 u_int64_t); 842void dns_async(struct smtpd *, struct imsgev *, int, 843 struct dns *); 844/* expand.c */ 845int expand_cmp(struct expand_node *, struct expand_node *); 846void expandtree_increment_node(struct expandtree *, struct expand_node *); 847void expandtree_decrement_node(struct expandtree *, struct expand_node *); 848void expandtree_remove_node(struct expandtree *, struct expand_node *); 849struct expand_node *expandtree_lookup(struct expandtree *, struct expand_node *); 850RB_PROTOTYPE(expandtree, expand_node, nodes, expand_cmp); 851 852/* forward.c */ 853int forwards_get(int, struct expandtree *); 854 855/* smtpd.c */ 856int child_cmp(struct child *, struct child *); 857SPLAY_PROTOTYPE(childtree, child, entry, child_cmp); 858void imsg_event_add(struct imsgev *); 859int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t, 860 int, void *, u_int16_t); 861 862/* lka.c */ 863pid_t lka(struct smtpd *); 864int lkasession_cmp(struct lkasession *, struct lkasession *); 865SPLAY_PROTOTYPE(lkatree, lkasession, nodes, lkasession_cmp); 866 867/* mfa.c */ 868pid_t mfa(struct smtpd *); 869int msg_cmp(struct message *, struct message *); 870 871/* queue.c */ 872pid_t queue(struct smtpd *); 873int queue_load_envelope(struct message *, char *); 874int queue_update_envelope(struct message *); 875int queue_remove_envelope(struct message *); 876void queue_submit_envelope(struct smtpd *, struct message *); 877void queue_commit_envelopes(struct smtpd *, struct message*); 878int batch_cmp(struct batch *, struct batch *); 879struct batch *batch_by_id(struct smtpd *, u_int64_t); 880u_int16_t queue_hash(char *); 881 882/* queue_shared.c */ 883int queue_create_layout_message(char *, char *); 884void queue_delete_layout_message(char *, char *); 885int queue_record_layout_envelope(char *, struct message *); 886int queue_remove_layout_envelope(char *, struct message *); 887int queue_commit_layout_message(char *, struct message *); 888int queue_open_layout_messagefile(char *, struct message *); 889int enqueue_create_layout(char *); 890void enqueue_delete_message(char *); 891int enqueue_record_envelope(struct message *); 892int enqueue_remove_envelope(struct message *); 893int enqueue_commit_message(struct message *); 894int enqueue_open_messagefile(struct message *); 895int bounce_create_layout(char *, struct message *); 896void bounce_delete_message(char *); 897int bounce_record_envelope(struct message *); 898int bounce_remove_envelope(struct message *); 899int bounce_commit_message(struct message *); 900int bounce_record_message(struct message *); 901int queue_create_incoming_layout(char *); 902void queue_delete_incoming_message(char *); 903int queue_record_incoming_envelope(struct message *); 904int queue_remove_incoming_envelope(struct message *); 905int queue_commit_incoming_message(struct message *); 906int queue_open_incoming_message_file(struct message *); 907int queue_open_message_file(char *msgid); 908void queue_message_update(struct message *); 909void queue_delete_message(char *); 910struct qwalk *qwalk_new(char *); 911int qwalk(struct qwalk *, char *); 912void qwalk_close(struct qwalk *); 913void show_queue(char *, int); 914 915u_int16_t queue_hash(char *); 916 917/* map.c */ 918char *map_dblookup(struct smtpd *, objid_t, char *); 919char *map_dblookupbyname(struct smtpd *, char *, char *); 920 921/* mda.c */ 922pid_t mda(struct smtpd *); 923 924/* mta.c */ 925pid_t mta(struct smtpd *); 926int mta_session_cmp(struct mta_session *, struct mta_session *); 927SPLAY_PROTOTYPE(mtatree, mta_session, entry, mta_session_cmp); 928 929/* control.c */ 930pid_t control(struct smtpd *); 931void session_socket_blockmode(int, enum blockmodes); 932void session_socket_no_linger(int); 933int session_socket_error(int); 934 935/* enqueue.c */ 936int enqueue(int, char **); 937int enqueue_offline(int, char **); 938 939/* runner.c */ 940pid_t runner(struct smtpd *); 941void message_reset_flags(struct message *); 942SPLAY_PROTOTYPE(batchtree, batch, b_nodes, batch_cmp); 943 944/* smtp.c */ 945pid_t smtp(struct smtpd *); 946void smtp_resume(struct smtpd *); 947 948/* smtp_session.c */ 949void session_init(struct listener *, struct session *); 950int session_cmp(struct session *, struct session *); 951void session_pickup(struct session *, struct submit_status *); 952void session_destroy(struct session *); 953void session_respond(struct session *, char *, ...) 954 __attribute__ ((format (printf, 2, 3))); 955void session_bufferevent_new(struct session *); 956 957SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp); 958 959/* config.c */ 960#define PURGE_LISTENERS 0x01 961#define PURGE_MAPS 0x02 962#define PURGE_RULES 0x04 963#define PURGE_SSL 0x08 964#define PURGE_EVERYTHING 0xff 965void purge_config(struct smtpd *, u_int8_t); 966void unconfigure(struct smtpd *); 967void configure(struct smtpd *); 968void init_pipes(struct smtpd *); 969void config_pipes(struct smtpd *, struct peer *, u_int); 970void config_peers(struct smtpd *, struct peer *, u_int); 971 972/* parse.y */ 973int parse_config(struct smtpd *, const char *, int); 974int cmdline_symset(char *); 975 976/* ssl.c */ 977void ssl_init(void); 978void ssl_transaction(struct session *); 979 980void ssl_session_init(struct session *); 981void ssl_session_destroy(struct session *); 982int ssl_load_certfile(struct smtpd *, const char *, u_int8_t); 983void ssl_setup(struct smtpd *, struct listener *); 984int ssl_cmp(struct ssl *, struct ssl *); 985SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp); 986 987/* ssl_privsep.c */ 988int ssl_ctx_use_private_key(void *, char *, off_t); 989int ssl_ctx_use_certificate_chain(void *, char *, off_t); 990 991/* map.c */ 992struct map *map_find(struct smtpd *, objid_t); 993struct map *map_findbyname(struct smtpd *, const char *); 994 995/* util.c */ 996typedef struct arglist arglist; 997struct arglist { 998 char **list; 999 u_int num; 1000 u_int nalloc; 1001}; 1002void addargs(arglist *, char *, ...) 1003 __attribute__((format(printf, 2, 3))); 1004int bsnprintf(char *, size_t, const char *, ...) 1005 __attribute__ ((format (printf, 3, 4))); 1006int safe_fclose(FILE *); 1007int hostname_match(char *, char *); 1008int recipient_to_path(struct path *, char *); 1009int valid_localpart(char *); 1010int valid_domainpart(char *); 1011char *ss_to_text(struct sockaddr_storage *); 1012int valid_message_id(char *); 1013int valid_message_uid(char *); 1014char *time_to_text(time_t); 1015int secure_file(int, char *, struct passwd *, int); 1016void lowercase(char *, char *, size_t); 1017void message_set_errormsg(struct message *, char *, ...); 1018char *message_get_errormsg(struct message *); 1019void sa_set_port(struct sockaddr *, int); 1020struct path *path_dup(struct path *); 1021u_int64_t generate_uid(void); 1022void fdlimit(int); 1023int availdesc(void); 1024