smtpd.h revision 1.97
1/* $OpenBSD: smtpd.h,v 1.97 2009/04/09 19:49:34 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#define CONF_FILE "/etc/mail/smtpd.conf" 21#define MAX_LISTEN 16 22#define PROC_COUNT 9 23#define READ_BUF_SIZE 32768 24#define MAX_NAME_SIZE 64 25 26#define MAX_HOPS_COUNT 100 27 28/* sizes include the tailing '\0' */ 29#define MAX_LINE_SIZE 1024 30#define MAX_LOCALPART_SIZE 65 31#define MAX_DOMAINPART_SIZE MAXHOSTNAMELEN 32#define MAX_ID_SIZE 64 33 34/* return and forward path size */ 35#define MAX_PATH_SIZE 256 36 37/*#define SMTPD_CONNECT_TIMEOUT (60)*/ 38#define SMTPD_CONNECT_TIMEOUT (10) 39#define SMTPD_QUEUE_INTERVAL (15 * 60) 40#define SMTPD_QUEUE_MAXINTERVAL (4 * 60 * 60) 41#define SMTPD_QUEUE_EXPIRY (4 * 24 * 60 * 60) 42#define SMTPD_USER "_smtpd" 43#define SMTPD_SOCKET "/var/run/smtpd.sock" 44#define SMTPD_BANNER "220 %s ESMTP OpenSMTPD" 45#define SMTPD_SESSION_TIMEOUT 300 46#define SMTPD_BACKLOG 5 47 48#define PATH_MAILLOCAL "/usr/libexec/mail.local" 49 50#define DIRHASH_BUCKETS 4096 51 52#define PATH_SPOOL "/var/spool/smtpd" 53 54#define PATH_ENQUEUE "/enqueue" 55#define PATH_INCOMING "/incoming" 56#define PATH_QUEUE "/queue" 57#define PATH_PURGE "/purge" 58 59#define PATH_MESSAGE "/message" 60#define PATH_ENVELOPES "/envelopes" 61 62#define PATH_RUNQUEUE "/runqueue" 63#define PATH_RUNQUEUEHIGH "/runqueue-high" 64#define PATH_RUNQUEUELOW "/runqueue-low" 65 66/* number of MX records to lookup */ 67#define MXARRAYSIZE 5 68#define MAX_MX_COUNT 10 69 70/* rfc5321 limits */ 71#define SMTP_TEXTLINE_MAX 1000 72#define SMTP_CMDLINE_MAX 512 73#define SMTP_ANYLINE_MAX SMTP_TEXTLINE_MAX 74 75#define F_STARTTLS 0x01 76#define F_SMTPS 0x02 77#define F_AUTH 0x04 78#define F_SSL (F_SMTPS|F_STARTTLS) 79 80 81struct netaddr { 82 struct sockaddr_storage ss; 83 int bits; 84}; 85 86struct relayhost { 87 u_int8_t flags; 88 char hostname[MAXHOSTNAMELEN]; 89 u_int16_t port; 90}; 91 92struct mxhost { 93 TAILQ_ENTRY(mxhost) entry; 94 u_int8_t flags; 95 struct sockaddr_storage ss; 96 char credentials[MAX_LINE_SIZE]; 97}; 98 99/* buffer specific headers */ 100struct buf { 101 TAILQ_ENTRY(buf) entry; 102 u_char *buf; 103 size_t size; 104 size_t max; 105 size_t wpos; 106 size_t rpos; 107 int fd; 108}; 109 110struct msgbuf { 111 TAILQ_HEAD(, buf) bufs; 112 u_int32_t queued; 113 int fd; 114}; 115 116struct buf_read { 117 u_char buf[READ_BUF_SIZE]; 118 u_char *rptr; 119 size_t wpos; 120}; 121 122struct imsg_fd { 123 TAILQ_ENTRY(imsg_fd) entry; 124 int fd; 125 u_int32_t id; 126}; 127 128struct imsgbuf { 129 TAILQ_HEAD(, imsg_fd) fds; 130 struct buf_read r; 131 struct msgbuf w; 132 struct event ev; 133 void (*handler)(int, short, void *); 134 int fd; 135 pid_t pid; 136 short events; 137 void *data; 138 u_int32_t id; 139}; 140 141struct imsg_hdr { 142 u_int16_t type; 143 u_int16_t len; 144 u_int32_t peerid; 145 pid_t pid; 146}; 147 148struct imsg { 149 struct imsg_hdr hdr; 150 u_int32_t id; 151 void *data; 152}; 153 154enum imsg_type { 155 IMSG_NONE, 156 IMSG_CTL_OK, /* answer to smtpctl requests */ 157 IMSG_CTL_FAIL, 158 IMSG_CTL_SHUTDOWN, 159 IMSG_CONF_START, 160 IMSG_CONF_SSL, 161 IMSG_CONF_SSL_CERT, 162 IMSG_CONF_SSL_KEY, 163 IMSG_CONF_LISTENER, 164 IMSG_CONF_MAP, 165 IMSG_CONF_RULE, 166 IMSG_CONF_CONDITION, 167 IMSG_CONF_OPTION, 168 IMSG_CONF_END, 169 IMSG_CONF_RELOAD, 170 IMSG_LKA_MAIL, 171 IMSG_LKA_RCPT, 172 IMSG_LKA_MX, 173 IMSG_LKA_MX_END, 174 IMSG_LKA_HOST, 175 IMSG_MDA_MAILBOX_FILE, 176 IMSG_MDA_MESSAGE_FILE, 177 IMSG_MFA_RCPT, 178 IMSG_MFA_MAIL, 179 180 IMSG_QUEUE_CREATE_MESSAGE, 181 IMSG_QUEUE_SUBMIT_ENVELOPE, 182 IMSG_QUEUE_COMMIT_ENVELOPES, 183 IMSG_QUEUE_REMOVE_MESSAGE, 184 IMSG_QUEUE_COMMIT_MESSAGE, 185 IMSG_QUEUE_TEMPFAIL, 186 IMSG_QUEUE_STATS, 187 188 IMSG_QUEUE_REMOVE_SUBMISSION, 189 IMSG_QUEUE_MESSAGE_UPDATE, 190 IMSG_QUEUE_MESSAGE_FD, 191 IMSG_QUEUE_MESSAGE_FILE, 192 193 IMSG_RUNNER_UPDATE_ENVELOPE, 194 IMSG_RUNNER_STATS, 195 IMSG_RUNNER_SCHEDULE, 196 197 IMSG_BATCH_CREATE, 198 IMSG_BATCH_APPEND, 199 IMSG_BATCH_CLOSE, 200 201 IMSG_PARENT_FORWARD_OPEN, 202 IMSG_PARENT_MAILBOX_OPEN, 203 IMSG_PARENT_MESSAGE_OPEN, 204 IMSG_PARENT_MAILBOX_RENAME, 205 IMSG_PARENT_STATS, 206 207 IMSG_PARENT_AUTHENTICATE, 208 IMSG_PARENT_SEND_CONFIG, 209 210 IMSG_MDA_PAUSE, 211 IMSG_MTA_PAUSE, 212 IMSG_SMTP_PAUSE, 213 IMSG_SMTP_STATS, 214 215 IMSG_MDA_RESUME, 216 IMSG_MTA_RESUME, 217 IMSG_SMTP_RESUME, 218 219 IMSG_STATS 220}; 221 222#define IMSG_HEADER_SIZE sizeof(struct imsg_hdr) 223#define MAX_IMSGSIZE 16384 224 225enum blockmodes { 226 BM_NORMAL, 227 BM_NONBLOCK 228}; 229 230enum ctl_state { 231 CS_NONE = 0, 232 CS_INIT, 233 CS_RCPT, 234 CS_FD, 235 CS_DONE 236}; 237 238struct ctl_conn { 239 TAILQ_ENTRY(ctl_conn) entry; 240 u_int8_t flags; 241#define CTL_CONN_NOTIFY 0x01 242 struct imsgbuf ibuf; 243 enum ctl_state state; 244}; 245TAILQ_HEAD(ctl_connlist, ctl_conn); 246 247typedef u_int32_t objid_t; 248 249struct ctl_id { 250 objid_t id; 251 char name[MAX_NAME_SIZE]; 252}; 253 254enum smtp_proc_type { 255 PROC_PARENT = 0, 256 PROC_SMTP, 257 PROC_MFA, 258 PROC_LKA, 259 PROC_QUEUE, 260 PROC_MDA, 261 PROC_MTA, 262 PROC_CONTROL, 263 PROC_RUNNER, 264} smtpd_process; 265 266struct peer { 267 enum smtp_proc_type id; 268 void (*cb)(int, short, void *); 269}; 270 271enum map_type { 272 T_SINGLE, 273 T_LIST, 274 T_HASH 275}; 276 277enum map_src { 278 S_NONE, 279 S_DYN, 280 S_DNS, 281 S_FILE, 282 S_DB, 283 S_EXT 284}; 285 286enum mapel_type { 287 ME_STRING, 288 ME_NET, 289 ME_NETMASK 290}; 291 292struct mapel { 293 TAILQ_ENTRY(mapel) me_entry; 294 union mapel_data { 295 char med_string[MAX_LINE_SIZE]; 296 struct netaddr med_addr; 297 } me_key; 298 union mapel_data me_val; 299}; 300 301struct map { 302 TAILQ_ENTRY(map) m_entry; 303#define F_USED 0x01 304#define F_DYNAMIC 0x02 305 u_int8_t m_flags; 306 char m_name[MAX_LINE_SIZE]; 307 objid_t m_id; 308 enum map_type m_type; 309 enum mapel_type m_eltype; 310 enum map_src m_src; 311 char m_config[MAXPATHLEN]; 312 TAILQ_HEAD(mapel_list, mapel) m_contents; 313}; 314 315enum cond_type { 316 C_ALL, 317 C_NET, 318 C_DOM 319}; 320 321struct cond { 322 TAILQ_ENTRY(cond) c_entry; 323 objid_t c_map; 324 enum cond_type c_type; 325 struct map *c_match; 326}; 327 328enum opt_type { 329 O_RWUSER, /* rewrite user */ 330 O_RWDOMAIN, /* rewrite domain */ 331}; 332 333struct opt { 334 TAILQ_ENTRY(opt) o_entry; 335 enum opt_type o_type; 336}; 337 338enum action_type { 339 A_INVALID, 340 A_RELAY, 341 A_RELAYVIA, 342 A_MAILDIR, 343 A_MBOX, 344 A_FILENAME, 345 A_EXT 346}; 347#define IS_MAILBOX(x) ((x) == A_MAILDIR || (x) == A_MBOX || (x) == A_FILENAME) 348#define IS_RELAY(x) ((x) == A_RELAY || (x) == A_RELAYVIA) 349#define IS_EXT(x) ((x) == A_EXT) 350 351struct rule { 352 TAILQ_ENTRY(rule) r_entry; 353 int r_accept; 354 struct map *r_sources; 355 TAILQ_HEAD(condlist, cond) r_conditions; 356 enum action_type r_action; 357 union rule_dest { 358 char path[MAXPATHLEN]; 359 struct relayhost relayhost; 360#define MAXCOMMANDLEN 256 361 char command[MAXCOMMANDLEN]; 362 } r_value; 363 TAILQ_HEAD(optlist, opt) r_options; 364}; 365 366enum path_flags { 367 F_ALIAS = 0x1, 368 F_VIRTUAL = 0x2, 369 F_EXPANDED = 0x4, 370 F_NOFORWARD = 0x8, 371 F_FORWARDED = 0x10, 372 F_ACCOUNT = 0x20, 373}; 374 375struct path { 376 TAILQ_ENTRY(path) entry; 377 struct rule rule; 378 enum path_flags flags; 379 u_int8_t forwardcnt; 380 char user[MAX_LOCALPART_SIZE]; 381 char domain[MAX_DOMAINPART_SIZE]; 382 char pw_name[MAXLOGNAME]; 383 union path_data { 384 char filename[MAXPATHLEN]; 385 char filter[MAXPATHLEN]; 386 } u; 387}; 388 389enum alias_type { 390 ALIAS_USERNAME, 391 ALIAS_FILENAME, 392 ALIAS_FILTER, 393 ALIAS_INCLUDE, 394 ALIAS_ADDRESS 395}; 396 397struct alias { 398 TAILQ_ENTRY(alias) entry; 399 enum alias_type type; 400 union alias_data { 401 char username[MAXLOGNAME]; 402 char filename[MAXPATHLEN]; 403 char filter[MAXPATHLEN]; 404 struct path path; 405 } u; 406}; 407TAILQ_HEAD(aliaseslist, alias); 408 409enum message_type { 410 T_MDA_MESSAGE = 0x1, 411 T_MTA_MESSAGE = 0x2, 412 T_DAEMON_MESSAGE = 0x4 413}; 414 415enum message_status { 416 S_MESSAGE_LOCKFAILURE = 0x1, 417 S_MESSAGE_PERMFAILURE = 0x2, 418 S_MESSAGE_TEMPFAILURE = 0x4, 419 S_MESSAGE_REJECTED = 0x8, 420 S_MESSAGE_ACCEPTED = 0x10, 421 S_MESSAGE_RETRY = 0x20, 422 S_MESSAGE_EDNS = 0x40, 423 S_MESSAGE_ECONNECT = 0x80 424}; 425 426enum message_flags { 427 F_MESSAGE_RESOLVED = 0x1, 428 F_MESSAGE_SCHEDULED = 0x2, 429 F_MESSAGE_PROCESSING = 0x4, 430 F_MESSAGE_AUTHENTICATED = 0x8, 431 F_MESSAGE_ENQUEUED = 0x10, 432 F_MESSAGE_FORCESCHEDULE = 0x20 433}; 434 435struct message { 436 TAILQ_ENTRY(message) entry; 437 438 enum message_type type; 439 440 u_int64_t id; 441 u_int64_t session_id; 442 u_int64_t batch_id; 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_status { 464 S_BATCH_PERMFAILURE = 0x1, 465 S_BATCH_TEMPFAILURE = 0x2, 466 S_BATCH_REJECTED = 0x4, 467 S_BATCH_ACCEPTED = 0x8, 468 S_BATCH_RETRY = 0x10, 469 S_BATCH_EDNS = 0x20, 470 S_BATCH_ECONNECT = 0x40 471}; 472 473enum batch_type { 474 T_MDA_BATCH = 0x1, 475 T_MTA_BATCH = 0x2, 476 T_DAEMON_BATCH = 0x4 477}; 478 479enum batch_flags { 480 F_BATCH_COMPLETE = 0x1, 481 F_BATCH_RESOLVED = 0x2, 482 F_BATCH_SCHEDULED = 0x4, 483 F_BATCH_EXPIRED = 0x8, 484}; 485 486struct mdaproc { 487 SPLAY_ENTRY(mdaproc) mdaproc_nodes; 488 489 pid_t pid; 490}; 491 492struct batch { 493 SPLAY_ENTRY(batch) b_nodes; 494 495 u_int64_t id; 496 u_int64_t session_id; 497 enum batch_type type; 498 enum batch_flags flags; 499 500 struct rule rule; 501 502 struct smtpd *env; 503 504 char message_id[MAX_ID_SIZE]; 505 char hostname[MAXHOSTNAMELEN]; 506 char errorline[MAX_LINE_SIZE]; 507 508 char session_helo[MAXHOSTNAMELEN]; 509 char session_hostname[MAXHOSTNAMELEN]; 510 struct sockaddr_storage session_ss; 511 512 time_t creation; 513 time_t lasttry; 514 u_int8_t retry; 515 516 struct session *sessionp; 517 518 struct message message; 519 struct message *messagep; 520 FILE *messagefp; 521 TAILQ_HEAD(messagelist, message) messages; 522 523 enum batch_status status; 524}; 525 526enum session_state { 527 S_INIT = 0, 528 S_GREETED, 529 S_TLS, 530 S_AUTH_INIT, 531 S_AUTH_USERNAME, 532 S_AUTH_PASSWORD, 533 S_AUTH_FINALIZE, 534 S_HELO, 535 S_MAILREQUEST, 536 S_MAIL, 537 S_RCPTREQUEST, 538 S_RCPT, 539 S_DATAREQUEST, 540 S_DATA, 541 S_DATACONTENT, 542 S_DONE, 543 S_QUIT 544}; 545#define IS_AUTH(x) ((x) == S_AUTH_INIT || (x) == S_AUTH_USERNAME || (x) == S_AUTH_PASSWORD || (x) == S_AUTH_FINALIZE) 546 547struct ssl { 548 SPLAY_ENTRY(ssl) ssl_nodes; 549 char ssl_name[PATH_MAX]; 550 char *ssl_cert; 551 off_t ssl_cert_len; 552 char *ssl_key; 553 off_t ssl_key_len; 554}; 555 556struct listener { 557 u_int8_t flags; 558 int fd; 559 struct sockaddr_storage ss; 560 in_port_t port; 561 struct timeval timeout; 562 struct event ev; 563 struct smtpd *env; 564 char ssl_cert_name[PATH_MAX]; 565 struct ssl *ssl; 566 void *ssl_ctx; 567 TAILQ_ENTRY(listener) entry; 568}; 569 570struct session_auth_req { 571 u_int64_t session_id; 572 char buffer[MAX_LINE_SIZE]; 573}; 574 575struct session_auth_reply { 576 u_int64_t session_id; 577 u_int8_t value; 578}; 579 580enum session_flags { 581 F_EHLO = 0x1, 582 F_QUIT = 0x2, 583 F_8BITMIME = 0x4, 584 F_SECURE = 0x8, 585 F_AUTHENTICATED = 0x10, 586 F_PEERHASTLS = 0x20, 587 F_PEERHASAUTH = 0x40, 588 F_EVLOCKED = 0x80 589}; 590 591struct session { 592 SPLAY_ENTRY(session) s_nodes; 593 u_int64_t s_id; 594 595 enum session_flags s_flags; 596 enum session_state s_state; 597 time_t s_tm; 598 int s_fd; 599 struct sockaddr_storage s_ss; 600 char s_hostname[MAXHOSTNAMELEN]; 601 struct event s_ev; 602 struct bufferevent *s_bev; 603 struct listener *s_l; 604 struct smtpd *s_env; 605 void *s_ssl; 606 u_char *s_buf; 607 int s_buflen; 608 struct timeval s_tv; 609 struct message s_msg; 610 size_t rcptcount; 611 612 struct session_auth_req s_auth; 613 614 struct batch *batch; 615 TAILQ_HEAD(mxhostlist, mxhost) mxhosts; 616 617 FILE *datafp; 618 int mboxfd; 619 int messagefd; 620}; 621 622struct smtpd { 623#define SMTPD_OPT_VERBOSE 0x00000001 624#define SMTPD_OPT_NOACTION 0x00000002 625 u_int32_t sc_opts; 626#define SMTPD_CONFIGURING 0x00000001 627#define SMTPD_EXITING 0x00000002 628#define SMTPD_MDA_PAUSED 0x00000004 629#define SMTPD_MTA_PAUSED 0x00000008 630#define SMTPD_SMTP_PAUSED 0x00000010 631 u_int32_t sc_flags; 632 struct timeval sc_qintval; 633 u_int32_t sc_maxconn; 634 struct event sc_ev; 635 int *sc_pipes[PROC_COUNT] 636 [PROC_COUNT]; 637 struct imsgbuf *sc_ibufs[PROC_COUNT]; 638 int sc_instances[PROC_COUNT]; 639 int sc_instance; 640 struct passwd *sc_pw; 641 char sc_hostname[MAXHOSTNAMELEN]; 642 TAILQ_HEAD(listenerlist, listener) sc_listeners; 643 TAILQ_HEAD(maplist, map) *sc_maps; 644 TAILQ_HEAD(rulelist, rule) *sc_rules; 645 SPLAY_HEAD(sessiontree, session) sc_sessions; 646 SPLAY_HEAD(msgtree, message) sc_messages; 647 SPLAY_HEAD(ssltree, ssl) sc_ssl; 648 649 SPLAY_HEAD(batchtree, batch) batch_queue; 650 SPLAY_HEAD(mdaproctree, mdaproc) mdaproc_queue; 651 SPLAY_HEAD(lkatree, lkasession) lka_sessions; 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}; 666 667struct s_session { 668 size_t sessions; 669 size_t sessions_active; 670 671 size_t ssmtp; 672 size_t ssmtp_active; 673 674 size_t starttls; 675 size_t starttls_active; 676 677 size_t aborted; 678}; 679 680struct stats { 681 int fd; 682 union u_stats { 683 struct s_parent parent; 684 struct s_queue queue; 685 struct s_runner runner; 686 struct s_session smtp; 687 struct s_session mta; 688 } u; 689}; 690 691struct sched { 692 int fd; 693 char mid[MAX_ID_SIZE]; 694 int ret; 695}; 696 697struct submit_status { 698 u_int64_t id; 699 int code; 700 union submit_path { 701 struct path path; 702 char msgid[MAX_ID_SIZE]; 703 char errormsg[MAX_LINE_SIZE]; 704 } u; 705 enum message_flags flags; 706 struct sockaddr_storage ss; 707 struct message msg; 708}; 709 710struct message_recipient { 711 u_int64_t id; 712 struct sockaddr_storage ss; 713 enum message_flags flags; 714 struct path path; 715 struct message msg; 716}; 717 718struct forward_req { 719 u_int64_t id; 720 u_int8_t status; 721 char pw_name[MAXLOGNAME]; 722}; 723 724struct mxreq { 725 u_int64_t id; 726 char hostname[MAXHOSTNAMELEN]; 727 struct rule rule; 728}; 729 730struct mxrep { 731 u_int64_t id; 732 int getaddrinfo_error; 733 struct mxhost mxhost; 734}; 735 736enum lkasession_flags { 737 F_ERROR = 0x1 738}; 739 740struct lkasession { 741 SPLAY_ENTRY(lkasession) nodes; 742 u_int64_t id; 743 744 struct path path; 745 struct aliaseslist aliaseslist; 746 u_int8_t iterations; 747 u_int32_t pending; 748 enum lkasession_flags flags; 749 struct message message; 750 struct submit_status ss; 751}; 752 753/* aliases.c */ 754int aliases_exist(struct smtpd *, char *); 755int aliases_get(struct smtpd *, struct aliaseslist *, char *); 756int aliases_virtual_exist(struct smtpd *, struct path *); 757int aliases_virtual_get(struct smtpd *, struct aliaseslist *, struct path *); 758int alias_parse(struct alias *, char *); 759 760 761/* log.c */ 762void log_init(int); 763void log_warn(const char *, ...) 764 __attribute__ ((format (printf, 1, 2))); 765void log_warnx(const char *, ...) 766 __attribute__ ((format (printf, 1, 2))); 767void log_info(const char *, ...) 768 __attribute__ ((format (printf, 1, 2))); 769void log_debug(const char *, ...) 770 __attribute__ ((format (printf, 1, 2))); 771__dead void fatal(const char *); 772__dead void fatalx(const char *); 773 774 775/* buffer.c */ 776struct buf *buf_open(size_t); 777struct buf *buf_dynamic(size_t, size_t); 778int buf_add(struct buf *, void *, size_t); 779void *buf_reserve(struct buf *, size_t); 780int buf_close(struct msgbuf *, struct buf *); 781void buf_free(struct buf *); 782void msgbuf_init(struct msgbuf *); 783void msgbuf_clear(struct msgbuf *); 784int msgbuf_write(struct msgbuf *); 785 786 787/* dns.c */ 788int getmxbyname(char *, char ***); 789 790 791/* forward.c */ 792int forwards_get(int, struct aliaseslist *); 793 794 795/* imsg.c */ 796void imsg_init(struct imsgbuf *, int, void (*)(int, short, void *)); 797ssize_t imsg_read(struct imsgbuf *); 798ssize_t imsg_get(struct imsgbuf *, struct imsg *); 799int imsg_compose(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t, 800 int, void *, u_int16_t); 801int imsg_composev(struct imsgbuf *, enum imsg_type, u_int32_t, 802 pid_t, int, const struct iovec *, int); 803int imsg_compose_fds(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t, 804 void *, u_int16_t, int, ...); 805struct buf *imsg_create(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t, 806 u_int16_t); 807int imsg_add(struct buf *, void *, u_int16_t); 808int imsg_append(struct imsgbuf *, struct buf *); 809int imsg_close(struct imsgbuf *, struct buf *); 810void imsg_free(struct imsg *); 811void imsg_event_add(struct imsgbuf *); /* needs to be provided externally */ 812int imsg_get_fd(struct imsgbuf *, struct imsg *); 813int imsg_flush(struct imsgbuf *); 814void imsg_clear(struct imsgbuf *); 815 816/* lka.c */ 817pid_t lka(struct smtpd *); 818int lkasession_cmp(struct lkasession *, struct lkasession *); 819SPLAY_PROTOTYPE(lkatree, lkasession, nodes, lkasession_cmp); 820 821/* mfa.c */ 822pid_t mfa(struct smtpd *); 823int msg_cmp(struct message *, struct message *); 824 825/* queue.c */ 826pid_t queue(struct smtpd *); 827u_int64_t queue_generate_id(void); 828int queue_remove_batch_message(struct smtpd *, struct batch *, 829 struct message *); 830int queue_load_envelope(struct message *, char *); 831int queue_update_envelope(struct message *); 832int queue_remove_envelope(struct message *); 833int batch_cmp(struct batch *, struct batch *); 834struct batch *batch_by_id(struct smtpd *, u_int64_t); 835struct message *message_by_id(struct smtpd *, struct batch *, u_int64_t); 836u_int16_t queue_hash(char *); 837 838/* queue_shared.c */ 839int queue_create_layout_message(char *, char *); 840void queue_delete_layout_message(char *, char *); 841int queue_record_layout_envelope(char *, struct message *); 842int queue_remove_layout_envelope(char *, struct message *); 843int queue_commit_layout_message(char *, struct message *); 844int queue_open_layout_messagefile(char *, struct message *); 845int enqueue_create_layout(char *); 846void enqueue_delete_message(char *); 847int enqueue_record_envelope(struct message *); 848int enqueue_remove_envelope(struct message *); 849int enqueue_commit_message(struct message *); 850int enqueue_open_messagefile(struct message *); 851int queue_create_incoming_layout(char *); 852void queue_delete_incoming_message(char *); 853int queue_record_incoming_envelope(struct message *); 854int queue_remove_incoming_envelope(struct message *); 855int queue_commit_incoming_message(struct message *); 856int queue_open_incoming_message_file(struct message *); 857int queue_open_message_file(char *msgid); 858void queue_message_update(struct message *); 859void queue_delete_message(char *); 860struct qwalk *qwalk_new(char *); 861int qwalk(struct qwalk *, char *); 862void qwalk_close(struct qwalk *); 863void show_queue(char *, int); 864 865u_int16_t queue_hash(char *); 866 867/* map.c */ 868char *map_dblookup(struct smtpd *, char *, char *); 869 870/* mda.c */ 871pid_t mda(struct smtpd *); 872int mdaproc_cmp(struct mdaproc *, struct mdaproc *); 873SPLAY_PROTOTYPE(mdaproctree, mdaproc, mdaproc_nodes, mdaproc_cmp); 874 875/* mta.c */ 876pid_t mta(struct smtpd *); 877 878/* control.c */ 879pid_t control(struct smtpd *); 880void session_socket_blockmode(int, enum blockmodes); 881 882/* runner.c */ 883pid_t runner(struct smtpd *); 884SPLAY_PROTOTYPE(batchtree, batch, b_nodes, batch_cmp); 885 886 887/* smtp.c */ 888pid_t smtp(struct smtpd *); 889void smtp_listener_setup(struct smtpd *, struct listener *); 890 891/* smtp_session.c */ 892void session_init(struct listener *, struct session *); 893int session_cmp(struct session *, struct session *); 894void session_pickup(struct session *, struct submit_status *); 895void session_destroy(struct session *); 896void session_respond(struct session *, char *, ...) 897 __attribute__ ((format (printf, 2, 3))); 898 899SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp); 900 901/* store.c */ 902int store_write_header(struct batch *, struct message *, FILE *, int); 903int store_write_message(struct batch *, struct message *); 904int store_write_daemon(struct batch *, struct message *); 905int store_message(struct batch *, struct message *, 906 int (*)(struct batch *, struct message *)); 907 908/* config.c */ 909#define PURGE_LISTENERS 0x01 910#define PURGE_MAPS 0x02 911#define PURGE_RULES 0x04 912#define PURGE_SSL 0x08 913#define PURGE_EVERYTHING 0xff 914void purge_config(struct smtpd *, u_int8_t); 915void unconfigure(struct smtpd *); 916void configure(struct smtpd *); 917void init_peers(struct smtpd *); 918void config_pipes(struct smtpd *, struct peer *, u_int); 919void config_peers(struct smtpd *, struct peer *, u_int); 920 921/* parse.y */ 922int parse_config(struct smtpd *, const char *, int); 923int cmdline_symset(char *); 924 925/* ssl.c */ 926void ssl_init(void); 927void ssl_transaction(struct session *); 928 929void ssl_session_init(struct session *); 930void ssl_session_destroy(struct session *); 931int ssl_load_certfile(struct smtpd *, const char *); 932void ssl_setup(struct smtpd *, struct listener *); 933int ssl_cmp(struct ssl *, struct ssl *); 934SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp); 935 936/* ssl_privsep.c */ 937int ssl_ctx_use_private_key(void *, char *, off_t); 938int ssl_ctx_use_certificate_chain(void *, char *, off_t); 939 940/* smtpd.c */ 941struct map *map_find(struct smtpd *, objid_t); 942struct map *map_findbyname(struct smtpd *, const char *); 943 944/* util.c */ 945typedef struct arglist arglist; 946struct arglist { 947 char **list; 948 u_int num; 949 u_int nalloc; 950}; 951void addargs(arglist *, char *, ...) 952 __attribute__((format(printf, 2, 3))); 953int bsnprintf(char *, size_t, const char *, ...) 954 __attribute__ ((format (printf, 3, 4))); 955int safe_fclose(FILE *); 956struct passwd *safe_getpwnam(const char *); 957struct passwd *safe_getpwuid(uid_t); 958int hostname_match(char *, char *); 959int recipient_to_path(struct path *, char *); 960int valid_localpart(char *); 961int valid_domainpart(char *); 962char *ss_to_text(struct sockaddr_storage *); 963int valid_message_id(char *); 964int valid_message_uid(char *); 965char *time_to_text(time_t); 966int secure_file(int, char *, struct passwd *); 967