smtpd.h revision 1.213
1/* $OpenBSD: smtpd.h,v 1.213 2011/04/14 23:26:16 gilles 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#ifndef nitems 21#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 22#endif 23 24#define IMSG_SIZE_CHECK(p) do { \ 25 if (IMSG_DATA_SIZE(&imsg) != sizeof(*p)) \ 26 fatalx("bad length imsg received"); \ 27} while (0) 28#define IMSG_DATA_SIZE(imsg) ((imsg)->hdr.len - IMSG_HEADER_SIZE) 29 30 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 128 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#define MAX_RULEBUFFER_LEN 256 49 50#define SMTPD_QUEUE_INTERVAL (15 * 60) 51#define SMTPD_QUEUE_MAXINTERVAL (4 * 60 * 60) 52#define SMTPD_QUEUE_EXPIRY (4 * 24 * 60 * 60) 53#define SMTPD_USER "_smtpd" 54#define SMTPD_SOCKET "/var/run/smtpd.sock" 55#define SMTPD_BANNER "220 %s ESMTP OpenSMTPD" 56#define SMTPD_SESSION_TIMEOUT 300 57#define SMTPD_BACKLOG 5 58 59#define PATH_MAILLOCAL "/usr/libexec/mail.local" 60#define PATH_SMTPCTL "/usr/sbin/smtpctl" 61 62#define DIRHASH_BUCKETS 4096 63 64#define PATH_SPOOL "/var/spool/smtpd" 65 66#define PATH_ENQUEUE "/enqueue" 67#define PATH_INCOMING "/incoming" 68#define PATH_QUEUE "/queue" 69#define PATH_PURGE "/purge" 70 71#define PATH_MESSAGE "/message" 72#define PATH_ENVELOPES "/envelopes" 73 74#define PATH_OFFLINE "/offline" 75#define PATH_BOUNCE "/bounce" 76 77/* number of MX records to lookup */ 78#define MAX_MX_COUNT 10 79 80/* max response delay under flood conditions */ 81#define MAX_RESPONSE_DELAY 60 82 83/* how many responses per state are undelayed */ 84#define FAST_RESPONSES 2 85 86/* max len of any smtp line */ 87#define SMTP_LINE_MAX 16384 88 89#define F_STARTTLS 0x01 90#define F_SMTPS 0x02 91#define F_AUTH 0x04 92#define F_SSL (F_SMTPS|F_STARTTLS) 93 94#define F_SCERT 0x01 95#define F_CCERT 0x02 96 97#define ADVERTISE_TLS(s) \ 98 ((s)->s_l->flags & F_STARTTLS && !((s)->s_flags & F_SECURE)) 99 100#define ADVERTISE_AUTH(s) \ 101 ((s)->s_l->flags & F_AUTH && (s)->s_flags & F_SECURE && \ 102 !((s)->s_flags & F_AUTHENTICATED)) 103 104#define SET_IF_GREATER(x,y) do { y = MAX(x,y); } while(0) 105 106 107typedef u_int32_t objid_t; 108 109struct netaddr { 110 struct sockaddr_storage ss; 111 int bits; 112}; 113 114struct relayhost { 115 u_int8_t flags; 116 char hostname[MAXHOSTNAMELEN]; 117 u_int16_t port; 118 char cert[PATH_MAX]; 119 objid_t secmapid; 120}; 121 122enum imsg_type { 123 IMSG_NONE, 124 IMSG_CTL_OK, /* answer to smtpctl requests */ 125 IMSG_CTL_FAIL, 126 IMSG_CTL_SHUTDOWN, 127 IMSG_CTL_VERBOSE, 128 IMSG_CONF_START, 129 IMSG_CONF_SSL, 130 IMSG_CONF_SSL_CERT, 131 IMSG_CONF_SSL_KEY, 132 IMSG_CONF_LISTENER, 133 IMSG_CONF_MAP, 134 IMSG_CONF_MAP_CONTENT, 135 IMSG_CONF_RULE, 136 IMSG_CONF_RULE_SOURCE, 137 IMSG_CONF_CONDITION, 138 IMSG_CONF_OPTION, 139 IMSG_CONF_END, 140 IMSG_CONF_RELOAD, 141 IMSG_LKA_MAIL, 142 IMSG_LKA_RCPT, 143 IMSG_LKA_SECRET, 144 IMSG_LKA_RULEMATCH, 145 IMSG_MDA_SESS_NEW, 146 IMSG_MDA_DONE, 147 IMSG_MFA_RCPT, 148 IMSG_MFA_MAIL, 149 150 IMSG_QUEUE_CREATE_MESSAGE, 151 IMSG_QUEUE_SUBMIT_ENVELOPE, 152 IMSG_QUEUE_COMMIT_ENVELOPES, 153 IMSG_QUEUE_REMOVE_MESSAGE, 154 IMSG_QUEUE_COMMIT_MESSAGE, 155 IMSG_QUEUE_TEMPFAIL, 156 IMSG_QUEUE_STATS, 157 IMSG_QUEUE_PAUSE_LOCAL, 158 IMSG_QUEUE_PAUSE_OUTGOING, 159 IMSG_QUEUE_RESUME_LOCAL, 160 IMSG_QUEUE_RESUME_OUTGOING, 161 162 IMSG_QUEUE_REMOVE_SUBMISSION, 163 IMSG_QUEUE_MESSAGE_UPDATE, 164 IMSG_QUEUE_MESSAGE_FD, 165 IMSG_QUEUE_MESSAGE_FILE, 166 IMSG_QUEUE_SCHEDULE, 167 IMSG_QUEUE_REMOVE, 168 169 IMSG_BATCH_CREATE, 170 IMSG_BATCH_APPEND, 171 IMSG_BATCH_CLOSE, 172 IMSG_BATCH_DONE, 173 174 IMSG_PARENT_ENQUEUE_OFFLINE, 175 IMSG_PARENT_FORWARD_OPEN, 176 IMSG_PARENT_FORK_MDA, 177 IMSG_PARENT_STATS, 178 179 IMSG_PARENT_AUTHENTICATE, 180 IMSG_PARENT_SEND_CONFIG, 181 182 IMSG_SMTP_STATS, 183 184 IMSG_STATS, 185 IMSG_SMTP_ENQUEUE, 186 IMSG_SMTP_PAUSE, 187 IMSG_SMTP_RESUME, 188 189 IMSG_DNS_HOST, 190 IMSG_DNS_HOST_END, 191 IMSG_DNS_MX, 192 IMSG_DNS_PTR 193}; 194 195enum blockmodes { 196 BM_NORMAL, 197 BM_NONBLOCK 198}; 199 200struct imsgev { 201 struct imsgbuf ibuf; 202 void (*handler)(int, short, void *); 203 struct event ev; 204 void *data; 205 struct smtpd *env; 206 int proc; 207 short events; 208}; 209 210struct ctl_conn { 211 TAILQ_ENTRY(ctl_conn) entry; 212 u_int8_t flags; 213#define CTL_CONN_NOTIFY 0x01 214 struct imsgev iev; 215}; 216TAILQ_HEAD(ctl_connlist, ctl_conn); 217 218struct ctl_id { 219 objid_t id; 220 char name[MAX_NAME_SIZE]; 221}; 222 223enum smtp_proc_type { 224 PROC_PARENT = 0, 225 PROC_SMTP, 226 PROC_MFA, 227 PROC_LKA, 228 PROC_QUEUE, 229 PROC_MDA, 230 PROC_MTA, 231 PROC_CONTROL, 232 PROC_RUNNER, 233} smtpd_process; 234 235struct peer { 236 enum smtp_proc_type id; 237 void (*cb)(int, short, void *); 238}; 239 240enum map_type { 241 T_SINGLE, 242 T_LIST, 243 T_HASH 244}; 245 246enum map_src { 247 S_NONE, 248 S_DYN, 249 S_DNS, 250 S_PLAIN, 251 S_DB, 252 S_EXT 253}; 254 255enum map_kind { 256 K_NONE, 257 K_ALIAS, 258 K_VIRTUAL, 259 K_SECRET 260}; 261 262enum mapel_type { 263 ME_STRING, 264 ME_NET, 265 ME_NETMASK 266}; 267 268struct mapel { 269 TAILQ_ENTRY(mapel) me_entry; 270 union mapel_data { 271 char med_string[MAX_LINE_SIZE]; 272 struct netaddr med_addr; 273 } me_key; 274 union mapel_data me_val; 275}; 276 277struct map { 278 TAILQ_ENTRY(map) m_entry; 279#define F_USED 0x01 280#define F_DYNAMIC 0x02 281 u_int8_t m_flags; 282 char m_name[MAX_LINE_SIZE]; 283 objid_t m_id; 284 enum map_type m_type; 285 enum mapel_type m_eltype; 286 enum map_src m_src; 287 char m_config[MAXPATHLEN]; 288 TAILQ_HEAD(mapel_list, mapel) m_contents; 289}; 290 291struct map_backend { 292 enum map_src source; 293 void *(*open)(char *); 294 void (*close)(void *); 295 char *(*get)(void *, char *, size_t *); 296 int (*put)(void *, char *, char *); 297}; 298 299struct map_parser { 300 enum map_kind kind; 301 void *(*extract)(char *, char *, size_t); 302}; 303 304enum cond_type { 305 C_ALL, 306 C_NET, 307 C_DOM, 308 C_VDOM 309}; 310 311struct cond { 312 TAILQ_ENTRY(cond) c_entry; 313 objid_t c_map; 314 enum cond_type c_type; 315}; 316 317enum action_type { 318 A_INVALID, 319 A_RELAY, 320 A_RELAYVIA, 321 A_MAILDIR, 322 A_MBOX, 323 A_FILENAME, 324 A_EXT 325}; 326 327#define IS_MAILBOX(x) ((x).rule.r_action == A_MAILDIR || (x).rule.r_action == A_MBOX || (x).rule.r_action == A_FILENAME) 328#define IS_RELAY(x) ((x).rule.r_action == A_RELAY || (x).rule.r_action == A_RELAYVIA) 329#define IS_EXT(x) ((x).rule.r_action == A_EXT) 330 331struct rule { 332 TAILQ_ENTRY(rule) r_entry; 333 char r_tag[MAX_TAG_SIZE]; 334 int r_accept; 335 struct map *r_sources; 336 struct cond r_condition; 337 enum action_type r_action; 338 union rule_dest { 339 char buffer[MAX_RULEBUFFER_LEN]; 340 struct relayhost relayhost; 341 } r_value; 342 343 char *r_user; 344 objid_t r_amap; 345 time_t r_qexpire; 346}; 347 348enum path_flags { 349 F_PATH_ALIAS = 0x1, 350 F_PATH_VIRTUAL = 0x2, 351 F_PATH_EXPANDED = 0x4, 352 F_PATH_NOFORWARD = 0x8, 353 F_PATH_FORWARDED = 0x10, 354 F_PATH_ACCOUNT = 0x20, 355 F_PATH_AUTHENTICATED = 0x40, 356 F_PATH_RELAY = 0x80, 357}; 358 359struct mailaddr { 360 char user[MAX_LOCALPART_SIZE]; 361 char domain[MAX_DOMAINPART_SIZE]; 362}; 363 364union path_data { 365 char username[MAXLOGNAME]; 366 char filename[MAXPATHLEN]; 367 char filter[MAXPATHLEN]; 368 struct mailaddr mailaddr; 369}; 370 371struct path { 372 TAILQ_ENTRY(path) entry; 373 struct rule rule; 374 enum path_flags flags; 375 u_int8_t forwardcnt; 376 char user[MAX_LOCALPART_SIZE]; 377 char domain[MAX_DOMAINPART_SIZE]; 378 char pw_name[MAXLOGNAME]; 379 union path_data u; 380}; 381TAILQ_HEAD(deliverylist, path); 382 383enum expand_type { 384 EXPAND_INVALID, 385 EXPAND_USERNAME, 386 EXPAND_FILENAME, 387 EXPAND_FILTER, 388 EXPAND_INCLUDE, 389 EXPAND_ADDRESS 390}; 391 392enum expand_flags { 393 F_EXPAND_NONE, 394 F_EXPAND_DONE 395}; 396 397struct expandnode { 398 RB_ENTRY(expandnode) entry; 399 size_t refcnt; 400 enum expand_flags flags; 401 enum expand_type type; 402 union path_data u; 403}; 404 405RB_HEAD(expandtree, expandnode); 406 407enum message_type { 408 T_MDA_MESSAGE = 0x1, 409 T_MTA_MESSAGE = 0x2, 410 T_BOUNCE_MESSAGE = 0x4 411}; 412 413enum message_status { 414 S_MESSAGE_PERMFAILURE = 0x2, 415 S_MESSAGE_TEMPFAILURE = 0x4, 416 S_MESSAGE_REJECTED = 0x8, 417 S_MESSAGE_ACCEPTED = 0x10, 418 S_MESSAGE_RETRY = 0x20, 419 S_MESSAGE_EDNS = 0x40, 420 S_MESSAGE_ECONNECT = 0x80 421}; 422 423enum message_flags { 424 F_MESSAGE_RESOLVED = 0x1, 425 F_MESSAGE_SCHEDULED = 0x2, 426 F_MESSAGE_PROCESSING = 0x4, 427 F_MESSAGE_AUTHENTICATED = 0x8, 428 F_MESSAGE_ENQUEUED = 0x10, 429 F_MESSAGE_FORCESCHEDULE = 0x20, 430 F_MESSAGE_BOUNCE = 0x40 431}; 432 433struct message { 434 TAILQ_ENTRY(message) entry; 435 436 enum message_type type; 437 438 u_int64_t id; 439 u_int64_t session_id; 440 u_int64_t batch_id; 441 442 char tag[MAX_TAG_SIZE]; 443 444 char message_id[MAX_ID_SIZE]; 445 char message_uid[MAX_ID_SIZE]; 446 447 char session_helo[MAXHOSTNAMELEN]; 448 char session_hostname[MAXHOSTNAMELEN]; 449 char session_errorline[MAX_LINE_SIZE]; 450 struct sockaddr_storage session_ss; 451 struct path session_rcpt; 452 453 struct path sender; 454 struct path recipient; 455 456 time_t creation; 457 time_t lasttry; 458 time_t expire; 459 u_int8_t retry; 460 enum message_flags flags; 461 enum message_status status; 462}; 463 464enum child_type { 465 CHILD_INVALID, 466 CHILD_DAEMON, 467 CHILD_MDA, 468 CHILD_ENQUEUE_OFFLINE 469}; 470 471struct child { 472 SPLAY_ENTRY(child) entry; 473 pid_t pid; 474 enum child_type type; 475 enum smtp_proc_type title; 476 int mda_out; 477 u_int32_t mda_id; 478}; 479 480enum session_state { 481 S_INVALID = 0, 482 S_INIT, 483 S_GREETED, 484 S_TLS, 485 S_AUTH_INIT, 486 S_AUTH_USERNAME, 487 S_AUTH_PASSWORD, 488 S_AUTH_FINALIZE, 489 S_HELO, 490 S_MAIL_MFA, 491 S_MAIL_QUEUE, 492 S_MAIL, 493 S_RCPT_MFA, 494 S_RCPT, 495 S_DATA, 496 S_DATA_QUEUE, 497 S_DATACONTENT, 498 S_DONE, 499 S_QUIT 500}; 501#define STATE_COUNT 18 502 503struct ssl { 504 SPLAY_ENTRY(ssl) ssl_nodes; 505 char ssl_name[PATH_MAX]; 506 char *ssl_cert; 507 off_t ssl_cert_len; 508 char *ssl_key; 509 off_t ssl_key_len; 510 char *ssl_dhparams; 511 off_t ssl_dhparams_len; 512 u_int8_t flags; 513}; 514 515struct listener { 516 u_int8_t flags; 517 int fd; 518 struct sockaddr_storage ss; 519 in_port_t port; 520 struct timeval timeout; 521 struct event ev; 522 struct smtpd *env; 523 char ssl_cert_name[PATH_MAX]; 524 struct ssl *ssl; 525 void *ssl_ctx; 526 char tag[MAX_TAG_SIZE]; 527 TAILQ_ENTRY(listener) entry; 528}; 529 530struct auth { 531 u_int64_t id; 532 char user[MAXLOGNAME]; 533 char pass[MAX_LINE_SIZE]; 534 int success; 535}; 536 537enum session_flags { 538 F_EHLO = 0x1, 539 F_QUIT = 0x2, 540 F_8BITMIME = 0x4, 541 F_SECURE = 0x8, 542 F_AUTHENTICATED = 0x10, 543 F_PEERHASTLS = 0x20, 544 F_PEERHASAUTH = 0x40, 545 F_WRITEONLY = 0x80 546}; 547 548struct session { 549 SPLAY_ENTRY(session) s_nodes; 550 u_int64_t s_id; 551 552 enum session_flags s_flags; 553 enum session_state s_state; 554 int s_fd; 555 struct sockaddr_storage s_ss; 556 char s_hostname[MAXHOSTNAMELEN]; 557 struct event s_ev; 558 struct bufferevent *s_bev; 559 struct listener *s_l; 560 struct smtpd *s_env; 561 void *s_ssl; 562 u_char *s_buf; 563 int s_buflen; 564 struct timeval s_tv; 565 struct message s_msg; 566 short s_nresp[STATE_COUNT]; 567 size_t rcptcount; 568 long s_datalen; 569 570 struct auth s_auth; 571 572 FILE *datafp; 573 int mboxfd; 574 int messagefd; 575}; 576 577 578/* ram-queue structures */ 579struct ramqueue_host { 580 RB_ENTRY(ramqueue_host) host_entry; 581 TAILQ_HEAD(,ramqueue_batch) batch_queue; 582 u_int64_t h_id; 583 char hostname[MAXHOSTNAMELEN]; 584}; 585struct ramqueue_batch { 586 TAILQ_ENTRY(ramqueue_batch) batch_entry; 587 TAILQ_HEAD(,ramqueue_envelope) envelope_queue; 588 enum message_type type; 589 u_int64_t h_id; 590 u_int64_t b_id; 591 char m_id[MAX_ID_SIZE]; 592 struct rule rule; 593}; 594struct ramqueue_envelope { 595 TAILQ_ENTRY(ramqueue_envelope) queue_entry; 596 TAILQ_ENTRY(ramqueue_envelope) batchqueue_entry; 597 struct ramqueue_host *host; 598 struct ramqueue_batch *batch; 599 char id[MAX_ID_SIZE]; 600 time_t sched; 601}; 602 603struct ramqueue { 604 struct smtpd *env; 605 struct ramqueue_envelope *current_evp; 606 RB_HEAD(hosttree, ramqueue_host) hosttree; 607 TAILQ_HEAD(,ramqueue_envelope) queue; 608}; 609 610 611struct smtpd { 612 char sc_conffile[MAXPATHLEN]; 613 size_t sc_maxsize; 614 615#define SMTPD_OPT_VERBOSE 0x00000001 616#define SMTPD_OPT_NOACTION 0x00000002 617 u_int32_t sc_opts; 618#define SMTPD_CONFIGURING 0x00000001 619#define SMTPD_EXITING 0x00000002 620#define SMTPD_MDA_PAUSED 0x00000004 621#define SMTPD_MTA_PAUSED 0x00000008 622#define SMTPD_SMTP_PAUSED 0x00000010 623 u_int32_t sc_flags; 624 struct timeval sc_qintval; 625 int sc_qexpire; 626 u_int32_t sc_maxconn; 627 struct event sc_ev; 628 int *sc_pipes[PROC_COUNT] 629 [PROC_COUNT]; 630 struct imsgev *sc_ievs[PROC_COUNT]; 631 int sc_instances[PROC_COUNT]; 632 int sc_instance; 633 char *sc_title[PROC_COUNT]; 634 struct passwd *sc_pw; 635 char sc_hostname[MAXHOSTNAMELEN]; 636 struct ramqueue sc_rqueue; 637 struct queue_backend *sc_queue; 638 639 TAILQ_HEAD(listenerlist, listener) *sc_listeners; 640 TAILQ_HEAD(maplist, map) *sc_maps, *sc_maps_reload; 641 TAILQ_HEAD(rulelist, rule) *sc_rules, *sc_rules_reload; 642 SPLAY_HEAD(sessiontree, session) sc_sessions; 643 SPLAY_HEAD(msgtree, message) sc_messages; 644 SPLAY_HEAD(ssltree, ssl) *sc_ssl; 645 SPLAY_HEAD(childtree, child) children; 646 SPLAY_HEAD(lkatree, lkasession) lka_sessions; 647 SPLAY_HEAD(dnstree, dnssession) dns_sessions; 648 SPLAY_HEAD(mtatree, mta_session) mta_sessions; 649 LIST_HEAD(mdalist, mda_session) mda_sessions; 650 651 struct stats *stats; 652}; 653 654struct s_parent { 655 time_t start; 656}; 657 658struct s_queue { 659 size_t inserts_local; 660 size_t inserts_remote; 661}; 662 663struct s_runner { 664 size_t active; 665 size_t maxactive; 666 size_t bounces_active; 667 size_t bounces_maxactive; 668 size_t bounces; 669}; 670 671struct s_session { 672 size_t sessions; 673 size_t sessions_inet4; 674 size_t sessions_inet6; 675 size_t sessions_active; 676 size_t sessions_maxactive; 677 678 size_t smtps; 679 size_t smtps_active; 680 size_t smtps_maxactive; 681 682 size_t starttls; 683 size_t starttls_active; 684 size_t starttls_maxactive; 685 686 size_t read_error; 687 size_t read_timeout; 688 size_t read_eof; 689 size_t write_error; 690 size_t write_timeout; 691 size_t write_eof; 692 size_t toofast; 693 size_t tempfail; 694 size_t linetoolong; 695 size_t delays; 696}; 697 698struct s_mda { 699 size_t sessions; 700 size_t sessions_active; 701 size_t sessions_maxactive; 702}; 703 704struct s_control { 705 size_t sessions; 706 size_t sessions_active; 707 size_t sessions_maxactive; 708}; 709 710struct s_lka { 711 size_t queries; 712 size_t queries_active; 713 size_t queries_maxactive; 714 size_t queries_mx; 715 size_t queries_host; 716 size_t queries_cname; 717 size_t queries_failure; 718}; 719 720struct s_ramqueue { 721 size_t hosts; 722 size_t batches; 723 size_t envelopes; 724 size_t hosts_max; 725 size_t batches_max; 726 size_t envelopes_max; 727}; 728 729struct stats { 730 struct s_parent parent; 731 struct s_queue queue; 732 struct s_runner runner; 733 struct s_session mta; 734 struct s_mda mda; 735 struct s_session smtp; 736 struct s_control control; 737 struct s_lka lka; 738 struct s_ramqueue ramqueue; 739}; 740 741struct reload { 742 int fd; 743 int ret; 744}; 745 746struct submit_status { 747 u_int64_t id; 748 int code; 749 union submit_path { 750 struct path path; 751 char msgid[MAX_ID_SIZE]; 752 char errormsg[MAX_LINE_SIZE]; 753 } u; 754 enum message_flags flags; 755 struct sockaddr_storage ss; 756 struct message msg; 757}; 758 759struct forward_req { 760 u_int64_t id; 761 u_int8_t status; 762 char pw_name[MAXLOGNAME]; 763}; 764 765struct dns { 766 u_int64_t id; 767 char host[MAXHOSTNAMELEN]; 768 int port; 769 int error; 770 int type; 771 struct imsgev *asker; 772 struct sockaddr_storage ss; 773 struct smtpd *env; 774 struct dns *next; 775}; 776 777struct secret { 778 u_int64_t id; 779 objid_t secmapid; 780 char host[MAXHOSTNAMELEN]; 781 char secret[MAX_LINE_SIZE]; 782}; 783 784struct mda_session { 785 LIST_ENTRY(mda_session) entry; 786 struct message msg; 787 struct msgbuf w; 788 struct event ev; 789 u_int32_t id; 790 FILE *datafp; 791}; 792 793struct deliver { 794 char to[PATH_MAX]; 795 char user[MAXLOGNAME]; 796 short mode; 797}; 798 799struct rulematch { 800 u_int64_t id; 801 struct submit_status ss; 802}; 803 804enum lkasession_flags { 805 F_ERROR = 0x1 806}; 807 808struct lkasession { 809 SPLAY_ENTRY(lkasession) nodes; 810 u_int64_t id; 811 812 struct path path; 813 struct deliverylist deliverylist; 814 815 struct expandtree expandtree; 816 817 u_int8_t iterations; 818 u_int32_t pending; 819 enum lkasession_flags flags; 820 struct message message; 821 struct submit_status ss; 822}; 823 824struct mx { 825 char host[MAXHOSTNAMELEN]; 826 int prio; 827}; 828 829struct dnssession { 830 SPLAY_ENTRY(dnssession) nodes; 831 u_int64_t id; 832 struct dns query; 833 struct event ev; 834 struct asr_query *aq; 835 struct mx mxarray[MAX_MX_COUNT]; 836 size_t mxarraysz; 837 size_t mxcurrent; 838 size_t mxfound; 839}; 840 841enum mta_state { 842 MTA_INVALID_STATE, 843 MTA_INIT, 844 MTA_SECRET, 845 MTA_DATA, 846 MTA_MX, 847 MTA_CONNECT, 848 MTA_PTR, 849 MTA_PROTOCOL, 850 MTA_DONE 851}; 852 853/* mta session flags */ 854#define MTA_FORCE_ANYSSL 0x01 855#define MTA_FORCE_SMTPS 0x02 856#define MTA_ALLOW_PLAIN 0x04 857#define MTA_USE_AUTH 0x08 858#define MTA_FORCE_MX 0x10 859 860struct mta_relay { 861 TAILQ_ENTRY(mta_relay) entry; 862 struct sockaddr_storage sa; 863 char fqdn[MAXHOSTNAMELEN]; 864 int used; 865}; 866 867struct mta_session { 868 SPLAY_ENTRY(mta_session) entry; 869 u_int64_t id; 870 struct smtpd *env; 871 enum mta_state state; 872 char *host; 873 int port; 874 int flags; 875 TAILQ_HEAD(,message) recipients; 876 TAILQ_HEAD(,mta_relay) relays; 877 objid_t secmapid; 878 char *secret; 879 int fd; 880 FILE *datafp; 881 struct event ev; 882 char *cert; 883 void *pcb; 884 struct ramqueue_batch *batch; 885}; 886 887 888/* maps return structures */ 889struct map_secret { 890 char username[MAX_LINE_SIZE]; 891 char password[MAX_LINE_SIZE]; 892}; 893 894struct map_alias { 895 size_t nbnodes; 896 struct expandtree expandtree; 897}; 898 899struct map_virtual { 900 size_t nbnodes; 901 struct expandtree expandtree; 902}; 903 904 905/* queue structures */ 906enum queue_type { 907 QT_INVALID=0, 908 QT_FS 909}; 910 911enum queue_kind { 912 Q_INVALID=0, 913 Q_ENQUEUE, 914 Q_INCOMING, 915 Q_QUEUE, 916 Q_PURGE, 917 Q_OFFLINE, 918 Q_BOUNCE 919}; 920 921enum queue_op { 922 QOP_INVALID=0, 923 QOP_CREATE, 924 QOP_DELETE, 925 QOP_UPDATE, 926 QOP_COMMIT, 927 QOP_LOAD, 928 QOP_FD_R, 929 QOP_FD_RW, 930 QOP_PURGE 931}; 932 933struct queue_backend { 934 enum queue_type type; 935 int (*init)(struct smtpd *); 936 int (*message)(struct smtpd *, enum queue_kind, enum queue_op, char *); 937 int (*envelope)(struct smtpd *, enum queue_kind, enum queue_op, 938 struct message *); 939}; 940 941extern void (*imsg_callback)(struct smtpd *, struct imsgev *, struct imsg *); 942 943 944 945/* aliases.c */ 946int aliases_exist(struct smtpd *, objid_t, char *); 947int aliases_get(struct smtpd *, objid_t, struct expandtree *, char *); 948int aliases_vdomain_exists(struct smtpd *, objid_t, char *); 949int aliases_virtual_exist(struct smtpd *, objid_t, struct path *); 950int aliases_virtual_get(struct smtpd *, objid_t, struct expandtree *, struct path *); 951int alias_parse(struct expandnode *, char *); 952 953 954/* authenticate.c */ 955int authenticate_user(char *, char *); 956 957 958/* bounce.c */ 959int bounce_session(struct smtpd *, int, struct message *); 960int bounce_session_switch(struct smtpd *, FILE *, enum session_state *, char *, 961 struct message *); 962void bounce_event(int, short, void *); 963 964 965/* config.c */ 966#define PURGE_LISTENERS 0x01 967#define PURGE_MAPS 0x02 968#define PURGE_RULES 0x04 969#define PURGE_SSL 0x08 970#define PURGE_EVERYTHING 0xff 971void purge_config(struct smtpd *, u_int8_t); 972void unconfigure(struct smtpd *); 973void configure(struct smtpd *); 974void init_pipes(struct smtpd *); 975void config_pipes(struct smtpd *, struct peer *, u_int); 976void config_peers(struct smtpd *, struct peer *, u_int); 977 978 979/* control.c */ 980pid_t control(struct smtpd *); 981void session_socket_blockmode(int, enum blockmodes); 982void session_socket_no_linger(int); 983int session_socket_error(int); 984 985 986/* dns.c */ 987void dns_query_host(struct smtpd *, char *, int, u_int64_t); 988void dns_query_mx(struct smtpd *, char *, int, u_int64_t); 989void dns_query_ptr(struct smtpd *, struct sockaddr_storage *, 990 u_int64_t); 991void dns_async(struct smtpd *, struct imsgev *, int, struct dns *); 992 993 994/* enqueue.c */ 995int enqueue(int, char **); 996int enqueue_offline(int, char **); 997 998 999/* expand.c */ 1000int expand_cmp(struct expandnode *, struct expandnode *); 1001void expandtree_increment_node(struct expandtree *, struct expandnode *); 1002void expandtree_decrement_node(struct expandtree *, struct expandnode *); 1003void expandtree_remove_node(struct expandtree *, struct expandnode *); 1004struct expandnode *expandtree_lookup(struct expandtree *, struct expandnode *); 1005void expandtree_free_nodes(struct expandtree *); 1006RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp); 1007 1008 1009/* forward.c */ 1010int forwards_get(int, struct expandtree *); 1011 1012 1013/* lka.c */ 1014pid_t lka(struct smtpd *); 1015int lkasession_cmp(struct lkasession *, struct lkasession *); 1016int dnssession_cmp(struct dnssession *, struct dnssession *); 1017SPLAY_PROTOTYPE(lkatree, lkasession, nodes, lkasession_cmp); 1018SPLAY_PROTOTYPE(dnstree, dnssession, nodes, dnssession_cmp); 1019 1020 1021/* map.c */ 1022void *map_lookup(struct smtpd *, objid_t, char *, enum map_kind); 1023struct map *map_find(struct smtpd *, objid_t); 1024struct map *map_findbyname(struct smtpd *, const char *); 1025 1026 1027 1028/* mda.c */ 1029pid_t mda(struct smtpd *); 1030 1031 1032/* mfa.c */ 1033pid_t mfa(struct smtpd *); 1034 1035 1036/* mta.c */ 1037pid_t mta(struct smtpd *); 1038int mta_session_cmp(struct mta_session *, struct mta_session *); 1039SPLAY_PROTOTYPE(mtatree, mta_session, entry, mta_session_cmp); 1040 1041 1042/* parse.y */ 1043int parse_config(struct smtpd *, const char *, int); 1044int cmdline_symset(char *); 1045 1046 1047/* queue.c */ 1048pid_t queue(struct smtpd *); 1049int queue_load_envelope(struct message *, char *); 1050int queue_update_envelope(struct message *); 1051int queue_remove_envelope(struct message *); 1052void queue_submit_envelope(struct smtpd *, struct message *); 1053void queue_commit_envelopes(struct smtpd *, struct message*); 1054u_int16_t queue_hash(char *); 1055 1056 1057/* queue_backend.c */ 1058struct queue_backend *queue_backend_lookup(enum queue_type); 1059int queue_message_create(struct smtpd *, enum queue_kind, char *); 1060int queue_message_delete(struct smtpd *, enum queue_kind, char *); 1061int queue_message_commit(struct smtpd *, enum queue_kind, char *); 1062int queue_message_fd_r(struct smtpd *, enum queue_kind, char *); 1063int queue_message_fd_rw(struct smtpd *, enum queue_kind, char *); 1064int queue_message_purge(struct smtpd *, enum queue_kind, char *); 1065int queue_envelope_create(struct smtpd *, enum queue_kind, 1066 struct message *); 1067int queue_envelope_delete(struct smtpd *, enum queue_kind, 1068 struct message *); 1069int queue_envelope_load(struct smtpd *, enum queue_kind, 1070 char *, struct message *); 1071int queue_envelope_update(struct smtpd *, enum queue_kind, 1072 struct message *); 1073 1074 1075/* queue_shared.c */ 1076int queue_create_layout_message(char *, char *); 1077int queue_record_layout_envelope(char *, struct message *); 1078int queue_remove_layout_envelope(char *, struct message *); 1079int queue_commit_layout_message(char *, struct message *); 1080int queue_open_layout_messagefile(char *, struct message *); 1081int enqueue_create_layout(char *); 1082void enqueue_delete_message(char *); 1083int enqueue_record_envelope(struct message *); 1084int enqueue_remove_envelope(struct message *); 1085int enqueue_commit_message(struct message *); 1086int enqueue_open_messagefile(struct message *); 1087int bounce_create_layout(struct smtpd *, char *, struct message *); 1088void bounce_delete_message(char *); 1089int bounce_record_envelope(struct message *); 1090int bounce_remove_envelope(struct message *); 1091int bounce_commit_message(struct message *); 1092int bounce_record_message(struct smtpd *, struct message *, struct message *); 1093int queue_create_incoming_layout(char *); 1094void queue_delete_incoming_message(char *); 1095int queue_record_incoming_envelope(struct message *); 1096int queue_remove_incoming_envelope(struct message *); 1097int queue_commit_incoming_message(struct message *); 1098int queue_open_incoming_message_file(struct message *); 1099int queue_open_message_file(char *msgid); 1100void queue_message_update(struct smtpd *, struct message *); 1101void queue_delete_message(char *); 1102struct qwalk *qwalk_new(char *); 1103int qwalk(struct qwalk *, char *); 1104void qwalk_close(struct qwalk *); 1105void show_queue(char *, int); 1106u_int16_t queue_hash(char *); 1107 1108 1109/* ramqueue.c */ 1110void ramqueue_init(struct smtpd *, struct ramqueue *); 1111int ramqueue_load(struct ramqueue *, time_t *); 1112int ramqueue_load_offline(struct ramqueue *); 1113int ramqueue_host_cmp(struct ramqueue_host *, struct ramqueue_host *); 1114void ramqueue_remove(struct ramqueue *, struct ramqueue_envelope *); 1115int ramqueue_is_empty(struct ramqueue *); 1116int ramqueue_is_empty(struct ramqueue *); 1117int ramqueue_batch_is_empty(struct ramqueue_batch *); 1118int ramqueue_host_is_empty(struct ramqueue_host *); 1119void ramqueue_remove_batch(struct ramqueue_host *, struct ramqueue_batch *); 1120void ramqueue_remove_host(struct ramqueue *, struct ramqueue_host *); 1121struct ramqueue_envelope *ramqueue_first_envelope(struct ramqueue *); 1122struct ramqueue_envelope *ramqueue_next_envelope(struct ramqueue *); 1123struct ramqueue_envelope *ramqueue_batch_first_envelope(struct ramqueue_batch *); 1124RB_PROTOTYPE(hosttree, ramqueue_host, host_entry, ramqueue_host_cmp); 1125 1126 1127/* runner.c */ 1128pid_t runner(struct smtpd *); 1129void message_reset_flags(struct message *); 1130 1131 1132/* smtp.c */ 1133pid_t smtp(struct smtpd *); 1134void smtp_resume(struct smtpd *); 1135 1136 1137/* smtp_session.c */ 1138void session_init(struct listener *, struct session *); 1139int session_cmp(struct session *, struct session *); 1140void session_pickup(struct session *, struct submit_status *); 1141void session_destroy(struct session *); 1142void session_respond(struct session *, char *, ...) 1143 __attribute__ ((format (printf, 2, 3))); 1144void session_bufferevent_new(struct session *); 1145 1146SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp); 1147 1148 1149/* smtpd.c */ 1150int child_cmp(struct child *, struct child *); 1151SPLAY_PROTOTYPE(childtree, child, entry, child_cmp); 1152void imsg_event_add(struct imsgev *); 1153void imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t, 1154 int, void *, u_int16_t); 1155void imsg_dispatch(int, short, void *); 1156 1157 1158/* ssl.c */ 1159void ssl_init(void); 1160void ssl_transaction(struct session *); 1161 1162void ssl_session_init(struct session *); 1163void ssl_session_destroy(struct session *); 1164int ssl_load_certfile(struct smtpd *, const char *, u_int8_t); 1165void ssl_setup(struct smtpd *, struct listener *); 1166int ssl_cmp(struct ssl *, struct ssl *); 1167SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp); 1168 1169 1170/* ssl_privsep.c */ 1171int ssl_ctx_use_private_key(void *, char *, off_t); 1172int ssl_ctx_use_certificate_chain(void *, char *, off_t); 1173 1174 1175/* util.c */ 1176typedef struct arglist arglist; 1177struct arglist { 1178 char **list; 1179 u_int num; 1180 u_int nalloc; 1181}; 1182void addargs(arglist *, char *, ...) 1183 __attribute__((format(printf, 2, 3))); 1184int bsnprintf(char *, size_t, const char *, ...) 1185 __attribute__ ((format (printf, 3, 4))); 1186int safe_fclose(FILE *); 1187int hostname_match(char *, char *); 1188int recipient_to_path(struct path *, char *); 1189int valid_localpart(char *); 1190int valid_domainpart(char *); 1191char *ss_to_text(struct sockaddr_storage *); 1192int valid_message_id(char *); 1193int valid_message_uid(char *); 1194char *time_to_text(time_t); 1195int secure_file(int, char *, struct passwd *, int); 1196void lowercase(char *, char *, size_t); 1197void message_set_errormsg(struct message *, char *, ...); 1198char *message_get_errormsg(struct message *); 1199void sa_set_port(struct sockaddr *, int); 1200struct path *path_dup(struct path *); 1201u_int64_t generate_uid(void); 1202void fdlimit(double); 1203int availdesc(void); 1204