smtpd.h revision 1.177
1/* $OpenBSD: smtpd.h,v 1.177 2010/04/21 19:53: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#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 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 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 75#define PATH_OFFLINE "/offline" 76#define PATH_BOUNCE "/bounce" 77 78/* number of MX records to lookup */ 79#define MAX_MX_COUNT 10 80 81/* max response delay under flood conditions */ 82#define MAX_RESPONSE_DELAY 60 83 84/* how many responses per state are undelayed */ 85#define FAST_RESPONSES 2 86 87/* max len of any smtp line */ 88#define SMTP_LINE_MAX 16384 89 90#define F_STARTTLS 0x01 91#define F_SMTPS 0x02 92#define F_AUTH 0x04 93#define F_SSL (F_SMTPS|F_STARTTLS) 94 95#define F_SCERT 0x01 96#define F_CCERT 0x02 97 98#define ADVERTISE_TLS(s) \ 99 ((s)->s_l->flags & F_STARTTLS && !((s)->s_flags & F_SECURE)) 100 101#define ADVERTISE_AUTH(s) \ 102 ((s)->s_l->flags & F_AUTH && (s)->s_flags & F_SECURE && \ 103 !((s)->s_flags & F_AUTHENTICATED)) 104 105struct netaddr { 106 struct sockaddr_storage ss; 107 int bits; 108}; 109 110struct relayhost { 111 u_int8_t flags; 112 char hostname[MAXHOSTNAMELEN]; 113 u_int16_t port; 114 char cert[PATH_MAX]; 115}; 116 117enum imsg_type { 118 IMSG_NONE, 119 IMSG_CTL_OK, /* answer to smtpctl requests */ 120 IMSG_CTL_FAIL, 121 IMSG_CTL_SHUTDOWN, 122 IMSG_CTL_VERBOSE, 123 IMSG_CONF_START, 124 IMSG_CONF_SSL, 125 IMSG_CONF_SSL_CERT, 126 IMSG_CONF_SSL_KEY, 127 IMSG_CONF_LISTENER, 128 IMSG_CONF_MAP, 129 IMSG_CONF_MAP_CONTENT, 130 IMSG_CONF_RULE, 131 IMSG_CONF_RULE_SOURCE, 132 IMSG_CONF_CONDITION, 133 IMSG_CONF_OPTION, 134 IMSG_CONF_END, 135 IMSG_CONF_RELOAD, 136 IMSG_LKA_MAIL, 137 IMSG_LKA_RCPT, 138 IMSG_LKA_SECRET, 139 IMSG_LKA_RULEMATCH, 140 IMSG_MDA_SESS_NEW, 141 IMSG_MDA_DONE, 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 IMSG_QUEUE_PAUSE_LOCAL, 153 IMSG_QUEUE_PAUSE_OUTGOING, 154 IMSG_QUEUE_RESUME_LOCAL, 155 IMSG_QUEUE_RESUME_OUTGOING, 156 157 IMSG_QUEUE_REMOVE_SUBMISSION, 158 IMSG_QUEUE_MESSAGE_UPDATE, 159 IMSG_QUEUE_MESSAGE_FD, 160 IMSG_QUEUE_MESSAGE_FILE, 161 IMSG_QUEUE_SCHEDULE, 162 IMSG_QUEUE_REMOVE, 163 164 IMSG_BATCH_CREATE, 165 IMSG_BATCH_APPEND, 166 IMSG_BATCH_CLOSE, 167 IMSG_BATCH_DONE, 168 169 IMSG_PARENT_ENQUEUE_OFFLINE, 170 IMSG_PARENT_FORWARD_OPEN, 171 IMSG_PARENT_FORK_MDA, 172 IMSG_PARENT_STATS, 173 174 IMSG_PARENT_AUTHENTICATE, 175 IMSG_PARENT_SEND_CONFIG, 176 177 IMSG_SMTP_STATS, 178 179 IMSG_STATS, 180 IMSG_SMTP_ENQUEUE, 181 IMSG_SMTP_PAUSE, 182 IMSG_SMTP_RESUME, 183 184 IMSG_DNS_A, 185 IMSG_DNS_A_END, 186 IMSG_DNS_MX, 187 IMSG_DNS_PTR 188}; 189 190enum blockmodes { 191 BM_NORMAL, 192 BM_NONBLOCK 193}; 194 195struct imsgev { 196 struct imsgbuf ibuf; 197 void (*handler)(int, short, void *); 198 struct event ev; 199 void *data; 200 struct smtpd *env; 201 int proc; 202 short events; 203}; 204 205struct ctl_conn { 206 TAILQ_ENTRY(ctl_conn) entry; 207 u_int8_t flags; 208#define CTL_CONN_NOTIFY 0x01 209 struct imsgev iev; 210}; 211TAILQ_HEAD(ctl_connlist, ctl_conn); 212 213typedef u_int32_t objid_t; 214 215struct ctl_id { 216 objid_t id; 217 char name[MAX_NAME_SIZE]; 218}; 219 220enum smtp_proc_type { 221 PROC_PARENT = 0, 222 PROC_SMTP, 223 PROC_MFA, 224 PROC_LKA, 225 PROC_QUEUE, 226 PROC_MDA, 227 PROC_MTA, 228 PROC_CONTROL, 229 PROC_RUNNER, 230} smtpd_process; 231 232struct peer { 233 enum smtp_proc_type id; 234 void (*cb)(int, short, void *); 235}; 236 237enum map_type { 238 T_SINGLE, 239 T_LIST, 240 T_HASH 241}; 242 243enum map_src { 244 S_NONE, 245 S_DYN, 246 S_DNS, 247 S_FILE, 248 S_DB, 249 S_EXT 250}; 251 252enum map_kind { 253 K_NONE, 254 K_ALIASES, 255 K_VIRTUAL, 256 K_SECRETS 257}; 258 259enum mapel_type { 260 ME_STRING, 261 ME_NET, 262 ME_NETMASK 263}; 264 265struct mapel { 266 TAILQ_ENTRY(mapel) me_entry; 267 union mapel_data { 268 char med_string[MAX_LINE_SIZE]; 269 struct netaddr med_addr; 270 } me_key; 271 union mapel_data me_val; 272}; 273 274struct map { 275 TAILQ_ENTRY(map) m_entry; 276#define F_USED 0x01 277#define F_DYNAMIC 0x02 278 u_int8_t m_flags; 279 char m_name[MAX_LINE_SIZE]; 280 objid_t m_id; 281 enum map_type m_type; 282 enum mapel_type m_eltype; 283 enum map_src m_src; 284 char m_config[MAXPATHLEN]; 285 TAILQ_HEAD(mapel_list, mapel) m_contents; 286}; 287 288enum cond_type { 289 C_ALL, 290 C_NET, 291 C_DOM, 292 C_VDOM 293}; 294 295struct cond { 296 TAILQ_ENTRY(cond) c_entry; 297 objid_t c_map; 298 enum cond_type c_type; 299}; 300 301enum opt_type { 302 O_RWUSER, /* rewrite user */ 303 O_RWDOMAIN, /* rewrite domain */ 304}; 305 306struct opt { 307 TAILQ_ENTRY(opt) o_entry; 308 enum opt_type o_type; 309}; 310 311enum action_type { 312 A_INVALID, 313 A_RELAY, 314 A_RELAYVIA, 315 A_MAILDIR, 316 A_MBOX, 317 A_FILENAME, 318 A_EXT 319}; 320 321#define IS_MAILBOX(x) ((x).rule.r_action == A_MAILDIR || (x).rule.r_action == A_MBOX || (x).rule.r_action == A_FILENAME) 322#define IS_RELAY(x) ((x).rule.r_action == A_RELAY || (x).rule.r_action == A_RELAYVIA) 323#define IS_EXT(x) ((x).rule.r_action == A_EXT) 324 325struct rule { 326 TAILQ_ENTRY(rule) r_entry; 327 char r_tag[MAX_TAG_SIZE]; 328 int r_accept; 329 struct map *r_sources; 330 TAILQ_HEAD(condlist, cond) r_conditions; 331 enum action_type r_action; 332 union rule_dest { 333 char path[MAXPATHLEN]; 334 struct relayhost relayhost; 335#define MAXCOMMANDLEN 256 336 char command[MAXCOMMANDLEN]; 337 } r_value; 338 TAILQ_HEAD(optlist, opt) r_options; 339 340 char *r_user; 341 objid_t r_amap; 342}; 343 344enum path_flags { 345 F_PATH_ALIAS = 0x1, 346 F_PATH_VIRTUAL = 0x2, 347 F_PATH_EXPANDED = 0x4, 348 F_PATH_NOFORWARD = 0x8, 349 F_PATH_FORWARDED = 0x10, 350 F_PATH_ACCOUNT = 0x20, 351 F_PATH_AUTHENTICATED = 0x40, 352 F_PATH_RELAY = 0x80, 353}; 354 355struct mailaddr { 356 char user[MAX_LOCALPART_SIZE]; 357 char domain[MAX_DOMAINPART_SIZE]; 358}; 359 360union path_data { 361 char username[MAXLOGNAME]; 362 char filename[MAXPATHLEN]; 363 char filter[MAXPATHLEN]; 364 struct mailaddr mailaddr; 365}; 366 367struct path { 368 TAILQ_ENTRY(path) entry; 369 struct rule rule; 370 struct cond *cond; 371 enum path_flags flags; 372 u_int8_t forwardcnt; 373 char user[MAX_LOCALPART_SIZE]; 374 char domain[MAX_DOMAINPART_SIZE]; 375 char pw_name[MAXLOGNAME]; 376 union path_data u; 377}; 378TAILQ_HEAD(deliverylist, path); 379 380enum expand_type { 381 EXPAND_INVALID, 382 EXPAND_USERNAME, 383 EXPAND_FILENAME, 384 EXPAND_FILTER, 385 EXPAND_INCLUDE, 386 EXPAND_ADDRESS 387}; 388 389enum expand_flags { 390 F_EXPAND_NONE, 391 F_EXPAND_DONE 392}; 393 394struct expand_node { 395 RB_ENTRY(expand_node) entry; 396 size_t refcnt; 397 enum expand_flags flags; 398 enum expand_type type; 399 union path_data u; 400}; 401 402struct alias { 403 enum expand_type type; 404 union path_data u; 405}; 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 u_int8_t retry; 459 enum message_flags flags; 460 enum message_status status; 461}; 462 463enum batch_type { 464 T_MDA_BATCH = 0x1, 465 T_MTA_BATCH = 0x2, 466 T_BOUNCE_BATCH = 0x4 467}; 468 469struct batch { 470 SPLAY_ENTRY(batch) b_nodes; 471 u_int64_t id; 472 enum batch_type type; 473 struct rule rule; 474 struct smtpd *env; 475 char message_id[MAX_ID_SIZE]; 476 char hostname[MAXHOSTNAMELEN]; 477 TAILQ_HEAD(, message) messages; 478}; 479 480enum child_type { 481 CHILD_INVALID, 482 CHILD_DAEMON, 483 CHILD_MDA, 484 CHILD_ENQUEUE_OFFLINE 485}; 486 487struct child { 488 SPLAY_ENTRY(child) entry; 489 pid_t pid; 490 enum child_type type; 491 enum smtp_proc_type title; 492 int mda_out; 493 u_int32_t mda_id; 494}; 495 496enum session_state { 497 S_INVALID = 0, 498 S_INIT, 499 S_GREETED, 500 S_TLS, 501 S_AUTH_INIT, 502 S_AUTH_USERNAME, 503 S_AUTH_PASSWORD, 504 S_AUTH_FINALIZE, 505 S_HELO, 506 S_MAIL_MFA, 507 S_MAIL_QUEUE, 508 S_MAIL, 509 S_RCPT_MFA, 510 S_RCPT, 511 S_DATA, 512 S_DATA_QUEUE, 513 S_DATACONTENT, 514 S_DONE, 515 S_QUIT 516}; 517#define STATE_COUNT 18 518 519struct ssl { 520 SPLAY_ENTRY(ssl) ssl_nodes; 521 char ssl_name[PATH_MAX]; 522 char *ssl_cert; 523 off_t ssl_cert_len; 524 char *ssl_key; 525 off_t ssl_key_len; 526 u_int8_t flags; 527}; 528 529struct listener { 530 u_int8_t flags; 531 int fd; 532 struct sockaddr_storage ss; 533 in_port_t port; 534 struct timeval timeout; 535 struct event ev; 536 struct smtpd *env; 537 char ssl_cert_name[PATH_MAX]; 538 struct ssl *ssl; 539 void *ssl_ctx; 540 char tag[MAX_TAG_SIZE]; 541 TAILQ_ENTRY(listener) entry; 542}; 543 544struct auth { 545 u_int64_t id; 546 char user[MAXLOGNAME]; 547 char pass[MAX_LINE_SIZE]; 548 int success; 549}; 550 551enum session_flags { 552 F_EHLO = 0x1, 553 F_QUIT = 0x2, 554 F_8BITMIME = 0x4, 555 F_SECURE = 0x8, 556 F_AUTHENTICATED = 0x10, 557 F_PEERHASTLS = 0x20, 558 F_PEERHASAUTH = 0x40, 559 F_WRITEONLY = 0x80 560}; 561 562struct session { 563 SPLAY_ENTRY(session) s_nodes; 564 u_int64_t s_id; 565 566 enum session_flags s_flags; 567 enum session_state s_state; 568 int s_fd; 569 struct sockaddr_storage s_ss; 570 char s_hostname[MAXHOSTNAMELEN]; 571 struct event s_ev; 572 struct bufferevent *s_bev; 573 struct listener *s_l; 574 struct smtpd *s_env; 575 void *s_ssl; 576 u_char *s_buf; 577 int s_buflen; 578 struct timeval s_tv; 579 struct message s_msg; 580 short s_nresp[STATE_COUNT]; 581 size_t rcptcount; 582 long s_datalen; 583 584 struct auth s_auth; 585 struct batch *batch; 586 587 FILE *datafp; 588 int mboxfd; 589 int messagefd; 590}; 591 592struct smtpd { 593 char sc_conffile[MAXPATHLEN]; 594 size_t sc_maxsize; 595 596#define SMTPD_OPT_VERBOSE 0x00000001 597#define SMTPD_OPT_NOACTION 0x00000002 598 u_int32_t sc_opts; 599#define SMTPD_CONFIGURING 0x00000001 600#define SMTPD_EXITING 0x00000002 601#define SMTPD_MDA_PAUSED 0x00000004 602#define SMTPD_MTA_PAUSED 0x00000008 603#define SMTPD_SMTP_PAUSED 0x00000010 604 u_int32_t sc_flags; 605 struct timeval sc_qintval; 606 u_int32_t sc_maxconn; 607 struct event sc_ev; 608 int *sc_pipes[PROC_COUNT] 609 [PROC_COUNT]; 610 struct imsgev *sc_ievs[PROC_COUNT]; 611 int sc_instances[PROC_COUNT]; 612 int sc_instance; 613 char *sc_title[PROC_COUNT]; 614 struct passwd *sc_pw; 615 char sc_hostname[MAXHOSTNAMELEN]; 616 TAILQ_HEAD(listenerlist, listener) *sc_listeners; 617 TAILQ_HEAD(maplist, map) *sc_maps, *sc_maps_reload; 618 TAILQ_HEAD(rulelist, rule) *sc_rules, *sc_rules_reload; 619 SPLAY_HEAD(sessiontree, session) sc_sessions; 620 SPLAY_HEAD(msgtree, message) sc_messages; 621 SPLAY_HEAD(ssltree, ssl) *sc_ssl; 622 623 SPLAY_HEAD(batchtree, batch) batch_queue; 624 SPLAY_HEAD(childtree, child) children; 625 SPLAY_HEAD(lkatree, lkasession) lka_sessions; 626 SPLAY_HEAD(mtatree, mta_session) mta_sessions; 627 LIST_HEAD(mdalist, mda_session) mda_sessions; 628 629 struct stats *stats; 630}; 631 632struct s_parent { 633 time_t start; 634}; 635 636struct s_queue { 637 size_t inserts_local; 638 size_t inserts_remote; 639}; 640 641struct s_runner { 642 size_t active; 643 size_t bounces_active; 644 size_t bounces; 645}; 646 647struct s_session { 648 size_t sessions; 649 size_t sessions_active; 650 651 size_t smtps; 652 size_t smtps_active; 653 654 size_t starttls; 655 size_t starttls_active; 656 657 size_t read_error; 658 size_t read_timeout; 659 size_t read_eof; 660 size_t write_error; 661 size_t write_timeout; 662 size_t write_eof; 663 size_t toofast; 664 size_t tempfail; 665 size_t linetoolong; 666 size_t delays; 667}; 668 669struct s_mda { 670 size_t sessions; 671 size_t sessions_active; 672}; 673 674struct s_control { 675 size_t sessions; 676 size_t sessions_active; 677}; 678 679struct stats { 680 struct s_parent parent; 681 struct s_queue queue; 682 struct s_runner runner; 683 struct s_session mta; 684 struct s_mda mda; 685 struct s_session smtp; 686 struct s_control control; 687}; 688 689struct sched { 690 int fd; 691 char mid[MAX_ID_SIZE]; 692 int ret; 693}; 694 695struct remove { 696 int fd; 697 char mid[MAX_ID_SIZE]; 698 int ret; 699}; 700 701struct reload { 702 int fd; 703 int ret; 704}; 705 706struct submit_status { 707 u_int64_t id; 708 int code; 709 union submit_path { 710 struct path path; 711 char msgid[MAX_ID_SIZE]; 712 char errormsg[MAX_LINE_SIZE]; 713 } u; 714 enum message_flags flags; 715 struct sockaddr_storage ss; 716 struct message msg; 717}; 718 719struct forward_req { 720 u_int64_t id; 721 u_int8_t status; 722 char pw_name[MAXLOGNAME]; 723}; 724 725struct dns { 726 u_int64_t id; 727 char host[MAXHOSTNAMELEN]; 728 int port; 729 int error; 730 struct sockaddr_storage ss; 731 struct smtpd *env; 732 struct dns *next; 733}; 734 735struct secret { 736 u_int64_t id; 737 char host[MAXHOSTNAMELEN]; 738 char secret[MAX_LINE_SIZE]; 739}; 740 741struct mda_session { 742 LIST_ENTRY(mda_session) entry; 743 struct message msg; 744 struct msgbuf w; 745 struct event ev; 746 u_int32_t id; 747 FILE *datafp; 748}; 749 750struct deliver { 751 char to[PATH_MAX]; 752 char user[MAXLOGNAME]; 753 short mode; 754}; 755 756struct rulematch { 757 u_int64_t id; 758 struct submit_status ss; 759}; 760 761enum lkasession_flags { 762 F_ERROR = 0x1 763}; 764 765struct lkasession { 766 SPLAY_ENTRY(lkasession) nodes; 767 u_int64_t id; 768 769 struct path path; 770 struct deliverylist deliverylist; 771 772 RB_HEAD(expandtree, expand_node) expandtree; 773 774 u_int8_t iterations; 775 u_int32_t pending; 776 enum lkasession_flags flags; 777 struct message message; 778 struct submit_status ss; 779}; 780 781enum mta_state { 782 MTA_INVALID_STATE, 783 MTA_INIT, 784 MTA_SECRET, 785 MTA_DATA, 786 MTA_MX, 787 MTA_CONNECT, 788 MTA_PTR, 789 MTA_PROTOCOL, 790 MTA_DONE 791}; 792 793/* mta session flags */ 794#define MTA_FORCE_ANYSSL 0x1 795#define MTA_FORCE_SMTPS 0x2 796#define MTA_ALLOW_PLAIN 0x4 797#define MTA_USE_AUTH 0x8 798 799struct mta_relay { 800 TAILQ_ENTRY(mta_relay) entry; 801 struct sockaddr_storage sa; 802 char fqdn[MAXHOSTNAMELEN]; 803 int used; 804}; 805 806struct mta_session { 807 SPLAY_ENTRY(mta_session) entry; 808 u_int64_t id; 809 struct smtpd *env; 810 enum mta_state state; 811 char *host; 812 int port; 813 int flags; 814 TAILQ_HEAD(,message) recipients; 815 TAILQ_HEAD(,mta_relay) relays; 816 char *secret; 817 int fd; 818 int datafd; 819 struct event ev; 820 char *cert; 821 void *pcb; 822}; 823 824extern void (*imsg_callback)(struct smtpd *, struct imsgev *, struct imsg *); 825 826/* aliases.c */ 827int aliases_exist(struct smtpd *, objid_t, char *); 828int aliases_get(struct smtpd *, objid_t, struct expandtree *, char *); 829int aliases_vdomain_exists(struct smtpd *, objid_t, char *); 830int aliases_virtual_exist(struct smtpd *, objid_t, struct path *); 831int aliases_virtual_get(struct smtpd *, objid_t, struct expandtree *, struct path *); 832int alias_parse(struct alias *, char *); 833void alias_to_expand_node(struct expand_node *, struct alias *); 834 835/* authenticate.c */ 836int authenticate_user(char *, char *); 837 838/* bounce.c */ 839void bounce_process(struct smtpd *, struct message *); 840int bounce_session(struct smtpd *, int, struct message *); 841int bounce_session_switch(struct smtpd *, FILE *, enum session_state *, char *, 842 struct message *); 843 844/* log.c */ 845void log_init(int); 846void log_verbose(int); 847void log_warn(const char *, ...) 848 __attribute__ ((format (printf, 1, 2))); 849void log_warnx(const char *, ...) 850 __attribute__ ((format (printf, 1, 2))); 851void log_info(const char *, ...) 852 __attribute__ ((format (printf, 1, 2))); 853void log_debug(const char *, ...) 854 __attribute__ ((format (printf, 1, 2))); 855__dead void fatal(const char *); 856__dead void fatalx(const char *); 857 858 859/* dns.c */ 860void dns_query_a(struct smtpd *, char *, int, u_int64_t); 861void dns_query_mx(struct smtpd *, char *, int, u_int64_t); 862void dns_query_ptr(struct smtpd *, struct sockaddr_storage *, 863 u_int64_t); 864void dns_async(struct smtpd *, struct imsgev *, int, 865 struct dns *); 866/* expand.c */ 867int expand_cmp(struct expand_node *, struct expand_node *); 868void expandtree_increment_node(struct expandtree *, struct expand_node *); 869void expandtree_decrement_node(struct expandtree *, struct expand_node *); 870void expandtree_remove_node(struct expandtree *, struct expand_node *); 871struct expand_node *expandtree_lookup(struct expandtree *, struct expand_node *); 872RB_PROTOTYPE(expandtree, expand_node, nodes, expand_cmp); 873 874/* forward.c */ 875int forwards_get(int, struct expandtree *); 876 877/* smtpd.c */ 878int child_cmp(struct child *, struct child *); 879SPLAY_PROTOTYPE(childtree, child, entry, child_cmp); 880void imsg_event_add(struct imsgev *); 881int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t, 882 int, void *, u_int16_t); 883void imsg_dispatch(int, short, void *); 884 885/* lka.c */ 886pid_t lka(struct smtpd *); 887int lkasession_cmp(struct lkasession *, struct lkasession *); 888SPLAY_PROTOTYPE(lkatree, lkasession, nodes, lkasession_cmp); 889 890/* mfa.c */ 891pid_t mfa(struct smtpd *); 892int msg_cmp(struct message *, struct message *); 893 894/* queue.c */ 895pid_t queue(struct smtpd *); 896int queue_load_envelope(struct message *, char *); 897int queue_update_envelope(struct message *); 898int queue_remove_envelope(struct message *); 899void queue_submit_envelope(struct smtpd *, struct message *); 900void queue_commit_envelopes(struct smtpd *, struct message*); 901int batch_cmp(struct batch *, struct batch *); 902struct batch *batch_by_id(struct smtpd *, u_int64_t); 903u_int16_t queue_hash(char *); 904 905/* queue_shared.c */ 906int queue_create_layout_message(char *, char *); 907void queue_delete_layout_message(char *, char *); 908int queue_record_layout_envelope(char *, struct message *); 909int queue_remove_layout_envelope(char *, struct message *); 910int queue_commit_layout_message(char *, struct message *); 911int queue_open_layout_messagefile(char *, struct message *); 912int enqueue_create_layout(char *); 913void enqueue_delete_message(char *); 914int enqueue_record_envelope(struct message *); 915int enqueue_remove_envelope(struct message *); 916int enqueue_commit_message(struct message *); 917int enqueue_open_messagefile(struct message *); 918int bounce_create_layout(char *, struct message *); 919void bounce_delete_message(char *); 920int bounce_record_envelope(struct message *); 921int bounce_remove_envelope(struct message *); 922int bounce_commit_message(struct message *); 923int bounce_record_message(struct message *); 924int queue_create_incoming_layout(char *); 925void queue_delete_incoming_message(char *); 926int queue_record_incoming_envelope(struct message *); 927int queue_remove_incoming_envelope(struct message *); 928int queue_commit_incoming_message(struct message *); 929int queue_open_incoming_message_file(struct message *); 930int queue_open_message_file(char *msgid); 931void queue_message_update(struct message *); 932void queue_delete_message(char *); 933struct qwalk *qwalk_new(char *); 934int qwalk(struct qwalk *, char *); 935void qwalk_close(struct qwalk *); 936void show_queue(char *, int); 937 938u_int16_t queue_hash(char *); 939 940/* map.c */ 941char *map_lookup(struct smtpd *, objid_t, char *, enum map_kind); 942 943/* mda.c */ 944pid_t mda(struct smtpd *); 945 946/* mta.c */ 947pid_t mta(struct smtpd *); 948int mta_session_cmp(struct mta_session *, struct mta_session *); 949SPLAY_PROTOTYPE(mtatree, mta_session, entry, mta_session_cmp); 950 951/* control.c */ 952pid_t control(struct smtpd *); 953void session_socket_blockmode(int, enum blockmodes); 954void session_socket_no_linger(int); 955int session_socket_error(int); 956 957/* enqueue.c */ 958int enqueue(int, char **); 959int enqueue_offline(int, char **); 960 961/* runner.c */ 962pid_t runner(struct smtpd *); 963void message_reset_flags(struct message *); 964SPLAY_PROTOTYPE(batchtree, batch, b_nodes, batch_cmp); 965 966/* smtp.c */ 967pid_t smtp(struct smtpd *); 968void smtp_resume(struct smtpd *); 969 970/* smtp_session.c */ 971void session_init(struct listener *, struct session *); 972int session_cmp(struct session *, struct session *); 973void session_pickup(struct session *, struct submit_status *); 974void session_destroy(struct session *); 975void session_respond(struct session *, char *, ...) 976 __attribute__ ((format (printf, 2, 3))); 977void session_bufferevent_new(struct session *); 978 979SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp); 980 981/* config.c */ 982#define PURGE_LISTENERS 0x01 983#define PURGE_MAPS 0x02 984#define PURGE_RULES 0x04 985#define PURGE_SSL 0x08 986#define PURGE_EVERYTHING 0xff 987void purge_config(struct smtpd *, u_int8_t); 988void unconfigure(struct smtpd *); 989void configure(struct smtpd *); 990void init_pipes(struct smtpd *); 991void config_pipes(struct smtpd *, struct peer *, u_int); 992void config_peers(struct smtpd *, struct peer *, u_int); 993 994/* parse.y */ 995int parse_config(struct smtpd *, const char *, int); 996int cmdline_symset(char *); 997 998/* ssl.c */ 999void ssl_init(void); 1000void ssl_transaction(struct session *); 1001 1002void ssl_session_init(struct session *); 1003void ssl_session_destroy(struct session *); 1004int ssl_load_certfile(struct smtpd *, const char *, u_int8_t); 1005void ssl_setup(struct smtpd *, struct listener *); 1006int ssl_cmp(struct ssl *, struct ssl *); 1007SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp); 1008 1009/* ssl_privsep.c */ 1010int ssl_ctx_use_private_key(void *, char *, off_t); 1011int ssl_ctx_use_certificate_chain(void *, char *, off_t); 1012 1013/* map.c */ 1014struct map *map_find(struct smtpd *, objid_t); 1015struct map *map_findbyname(struct smtpd *, const char *); 1016 1017/* util.c */ 1018typedef struct arglist arglist; 1019struct arglist { 1020 char **list; 1021 u_int num; 1022 u_int nalloc; 1023}; 1024void addargs(arglist *, char *, ...) 1025 __attribute__((format(printf, 2, 3))); 1026int bsnprintf(char *, size_t, const char *, ...) 1027 __attribute__ ((format (printf, 3, 4))); 1028int safe_fclose(FILE *); 1029int hostname_match(char *, char *); 1030int recipient_to_path(struct path *, char *); 1031int valid_localpart(char *); 1032int valid_domainpart(char *); 1033char *ss_to_text(struct sockaddr_storage *); 1034int valid_message_id(char *); 1035int valid_message_uid(char *); 1036char *time_to_text(time_t); 1037int secure_file(int, char *, struct passwd *, int); 1038void lowercase(char *, char *, size_t); 1039void message_set_errormsg(struct message *, char *, ...); 1040char *message_get_errormsg(struct message *); 1041void sa_set_port(struct sockaddr *, int); 1042struct path *path_dup(struct path *); 1043u_int64_t generate_uid(void); 1044void fdlimit(double); 1045int availdesc(void); 1046