smtpd.h revision 1.147
1/* $OpenBSD: smtpd.h,v 1.147 2009/10/12 22:34:37 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 65 42#define MAX_DOMAINPART_SIZE MAXHOSTNAMELEN 43#define MAX_ID_SIZE 64 44 45/* return and forward path size */ 46#define MAX_PATH_SIZE 256 47 48#define SMTPD_QUEUE_INTERVAL (15 * 60) 49#define SMTPD_QUEUE_MAXINTERVAL (4 * 60 * 60) 50#define SMTPD_QUEUE_EXPIRY (4 * 24 * 60 * 60) 51#define SMTPD_USER "_smtpd" 52#define SMTPD_SOCKET "/var/run/smtpd.sock" 53#define SMTPD_BANNER "220 %s ESMTP OpenSMTPD" 54#define SMTPD_SESSION_TIMEOUT 300 55#define SMTPD_BACKLOG 5 56 57#define PATH_MAILLOCAL "/usr/libexec/mail.local" 58#define PATH_SMTPCTL "/usr/sbin/smtpctl" 59 60#define DIRHASH_BUCKETS 4096 61 62#define PATH_SPOOL "/var/spool/smtpd" 63 64#define PATH_ENQUEUE "/enqueue" 65#define PATH_INCOMING "/incoming" 66#define PATH_QUEUE "/queue" 67#define PATH_PURGE "/purge" 68 69#define PATH_MESSAGE "/message" 70#define PATH_ENVELOPES "/envelopes" 71 72#define PATH_RUNQUEUE "/runqueue" 73#define PATH_RUNQUEUEHIGH "/runqueue-high" 74#define PATH_RUNQUEUELOW "/runqueue-low" 75 76#define PATH_OFFLINE "/offline" 77#define PATH_BOUNCE "/bounce" 78 79/* number of MX records to lookup */ 80#define MAX_MX_COUNT 10 81 82/* max response delay under flood conditions */ 83#define MAX_RESPONSE_DELAY 60 84 85/* how many responses per state are undelayed */ 86#define FAST_RESPONSES 2 87 88/* max len of any smtp line */ 89#define SMTP_LINE_MAX 16384 90 91#define F_STARTTLS 0x01 92#define F_SMTPS 0x02 93#define F_AUTH 0x04 94#define F_SSL (F_SMTPS|F_STARTTLS) 95 96#define F_SCERT 0x01 97#define F_CCERT 0x02 98 99#define ADVERTISE_TLS(s) \ 100 ((s)->s_l->flags & F_STARTTLS && !((s)->s_flags & F_SECURE)) 101 102#define ADVERTISE_AUTH(s) \ 103 ((s)->s_l->flags & F_AUTH && (s)->s_flags & F_SECURE && \ 104 !((s)->s_flags & F_AUTHENTICATED)) 105 106struct netaddr { 107 struct sockaddr_storage ss; 108 int bits; 109}; 110 111struct relayhost { 112 u_int8_t flags; 113 char hostname[MAXHOSTNAMELEN]; 114 u_int16_t port; 115 char cert[PATH_MAX]; 116}; 117 118enum imsg_type { 119 IMSG_NONE, 120 IMSG_CTL_OK, /* answer to smtpctl requests */ 121 IMSG_CTL_FAIL, 122 IMSG_CTL_SHUTDOWN, 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_FINALIZE, 141 IMSG_MFA_RCPT, 142 IMSG_MFA_MAIL, 143 144 IMSG_QUEUE_CREATE_MESSAGE, 145 IMSG_QUEUE_SUBMIT_ENVELOPE, 146 IMSG_QUEUE_COMMIT_ENVELOPES, 147 IMSG_QUEUE_REMOVE_MESSAGE, 148 IMSG_QUEUE_COMMIT_MESSAGE, 149 IMSG_QUEUE_TEMPFAIL, 150 IMSG_QUEUE_STATS, 151 152 IMSG_QUEUE_REMOVE_SUBMISSION, 153 IMSG_QUEUE_MESSAGE_UPDATE, 154 IMSG_QUEUE_MESSAGE_FD, 155 IMSG_QUEUE_MESSAGE_FILE, 156 157 IMSG_RUNNER_UPDATE_ENVELOPE, 158 IMSG_RUNNER_STATS, 159 IMSG_RUNNER_SCHEDULE, 160 161 IMSG_BATCH_CREATE, 162 IMSG_BATCH_APPEND, 163 IMSG_BATCH_CLOSE, 164 165 IMSG_PARENT_ENQUEUE_OFFLINE, 166 IMSG_PARENT_FORWARD_OPEN, 167 IMSG_PARENT_MAILBOX_OPEN, 168 IMSG_PARENT_MESSAGE_OPEN, 169 IMSG_PARENT_MAILDIR_RENAME, 170 IMSG_PARENT_MAILDIR_FAIL, 171 IMSG_PARENT_STATS, 172 173 IMSG_PARENT_AUTHENTICATE, 174 IMSG_PARENT_SEND_CONFIG, 175 176 IMSG_MDA_PAUSE, 177 IMSG_MTA_PAUSE, 178 IMSG_SMTP_PAUSE, 179 IMSG_SMTP_STATS, 180 181 IMSG_MDA_RESUME, 182 IMSG_MTA_RESUME, 183 IMSG_SMTP_RESUME, 184 185 IMSG_STATS, 186 187 IMSG_SMTP_ENQUEUE, 188 189 IMSG_DNS_A, 190 IMSG_DNS_A_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 short events; 206}; 207 208struct ctl_conn { 209 TAILQ_ENTRY(ctl_conn) entry; 210 u_int8_t flags; 211#define CTL_CONN_NOTIFY 0x01 212 struct imsgev iev; 213}; 214TAILQ_HEAD(ctl_connlist, ctl_conn); 215 216typedef u_int32_t objid_t; 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_FILE, 251 S_DB, 252 S_EXT 253}; 254 255enum mapel_type { 256 ME_STRING, 257 ME_NET, 258 ME_NETMASK 259}; 260 261struct mapel { 262 TAILQ_ENTRY(mapel) me_entry; 263 union mapel_data { 264 char med_string[MAX_LINE_SIZE]; 265 struct netaddr med_addr; 266 } me_key; 267 union mapel_data me_val; 268}; 269 270struct map { 271 TAILQ_ENTRY(map) m_entry; 272#define F_USED 0x01 273#define F_DYNAMIC 0x02 274 u_int8_t m_flags; 275 char m_name[MAX_LINE_SIZE]; 276 objid_t m_id; 277 enum map_type m_type; 278 enum mapel_type m_eltype; 279 enum map_src m_src; 280 char m_config[MAXPATHLEN]; 281 TAILQ_HEAD(mapel_list, mapel) m_contents; 282}; 283 284enum cond_type { 285 C_ALL, 286 C_NET, 287 C_DOM, 288 C_VDOM 289}; 290 291struct cond { 292 TAILQ_ENTRY(cond) c_entry; 293 objid_t c_map; 294 enum cond_type c_type; 295 struct map *c_match; 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 int r_accept; 325 struct map *r_sources; 326 TAILQ_HEAD(condlist, cond) r_conditions; 327 enum action_type r_action; 328 union rule_dest { 329 char path[MAXPATHLEN]; 330 struct relayhost relayhost; 331#define MAXCOMMANDLEN 256 332 char command[MAXCOMMANDLEN]; 333 } r_value; 334 TAILQ_HEAD(optlist, opt) r_options; 335}; 336 337enum path_flags { 338 F_PATH_ALIAS = 0x1, 339 F_PATH_VIRTUAL = 0x2, 340 F_PATH_EXPANDED = 0x4, 341 F_PATH_NOFORWARD = 0x8, 342 F_PATH_FORWARDED = 0x10, 343 F_PATH_ACCOUNT = 0x20, 344 F_PATH_AUTHENTICATED = 0x40, 345}; 346 347struct path { 348 TAILQ_ENTRY(path) entry; 349 struct rule rule; 350 struct cond *cond; 351 enum path_flags flags; 352 u_int8_t forwardcnt; 353 char user[MAX_LOCALPART_SIZE]; 354 char domain[MAX_DOMAINPART_SIZE]; 355 char pw_name[MAXLOGNAME]; 356 union path_data { 357 char filename[MAXPATHLEN]; 358 char filter[MAXPATHLEN]; 359 } u; 360}; 361 362enum alias_type { 363 ALIAS_USERNAME, 364 ALIAS_FILENAME, 365 ALIAS_FILTER, 366 ALIAS_INCLUDE, 367 ALIAS_ADDRESS 368}; 369 370struct alias { 371 TAILQ_ENTRY(alias) entry; 372 enum alias_type type; 373 union alias_data { 374 char username[MAXLOGNAME]; 375 char filename[MAXPATHLEN]; 376 char filter[MAXPATHLEN]; 377 struct path path; 378 } u; 379}; 380TAILQ_HEAD(aliaseslist, alias); 381 382enum message_type { 383 T_MDA_MESSAGE = 0x1, 384 T_MTA_MESSAGE = 0x2, 385 T_BOUNCE_MESSAGE = 0x4 386}; 387 388enum message_status { 389 S_MESSAGE_LOCKFAILURE = 0x1, 390 S_MESSAGE_PERMFAILURE = 0x2, 391 S_MESSAGE_TEMPFAILURE = 0x4, 392 S_MESSAGE_REJECTED = 0x8, 393 S_MESSAGE_ACCEPTED = 0x10, 394 S_MESSAGE_RETRY = 0x20, 395 S_MESSAGE_EDNS = 0x40, 396 S_MESSAGE_ECONNECT = 0x80 397}; 398 399enum message_flags { 400 F_MESSAGE_RESOLVED = 0x1, 401 F_MESSAGE_SCHEDULED = 0x2, 402 F_MESSAGE_PROCESSING = 0x4, 403 F_MESSAGE_AUTHENTICATED = 0x8, 404 F_MESSAGE_ENQUEUED = 0x10, 405 F_MESSAGE_FORCESCHEDULE = 0x20, 406 F_MESSAGE_BOUNCE = 0x40 407}; 408 409struct message { 410 TAILQ_ENTRY(message) entry; 411 412 enum message_type type; 413 414 u_int64_t id; 415 u_int64_t session_id; 416 u_int64_t batch_id; 417 418 char message_id[MAX_ID_SIZE]; 419 char message_uid[MAX_ID_SIZE]; 420 421 char session_helo[MAXHOSTNAMELEN]; 422 char session_hostname[MAXHOSTNAMELEN]; 423 char session_errorline[MAX_LINE_SIZE]; 424 struct sockaddr_storage session_ss; 425 struct path session_rcpt; 426 427 struct path sender; 428 struct path recipient; 429 430 time_t creation; 431 time_t lasttry; 432 u_int8_t retry; 433 enum message_flags flags; 434 enum message_status status; 435}; 436 437enum batch_type { 438 T_MDA_BATCH = 0x1, 439 T_MTA_BATCH = 0x2, 440 T_BOUNCE_BATCH = 0x4 441}; 442 443struct batch { 444 SPLAY_ENTRY(batch) b_nodes; 445 446 u_int64_t id; 447 enum batch_type type; 448 struct rule rule; 449 450 struct smtpd *env; 451 452 char message_id[MAX_ID_SIZE]; 453 char hostname[MAXHOSTNAMELEN]; 454 455 struct message message; 456 TAILQ_HEAD(, message) messages; 457 458 FILE *mboxfp; 459 FILE *datafp; 460 int cleanup_parent; 461}; 462 463enum child_type { 464 CHILD_INVALID, 465 CHILD_DAEMON, 466 CHILD_MDA, 467 CHILD_ENQUEUE_OFFLINE 468}; 469 470struct child { 471 SPLAY_ENTRY(child) entry; 472 473 pid_t pid; 474 enum child_type type; 475 enum smtp_proc_type title; 476 struct batch mda_batch; 477}; 478 479enum session_state { 480 S_INVALID = 0, 481 S_INIT, 482 S_GREETED, 483 S_TLS, 484 S_AUTH_INIT, 485 S_AUTH_USERNAME, 486 S_AUTH_PASSWORD, 487 S_AUTH_FINALIZE, 488 S_HELO, 489 S_MAIL_MFA, 490 S_MAIL_QUEUE, 491 S_MAIL, 492 S_RCPT_MFA, 493 S_RCPT, 494 S_DATA, 495 S_DATA_QUEUE, 496 S_DATACONTENT, 497 S_DONE, 498 S_QUIT 499}; 500#define STATE_COUNT 18 501 502struct ssl { 503 SPLAY_ENTRY(ssl) ssl_nodes; 504 char ssl_name[PATH_MAX]; 505 char *ssl_cert; 506 off_t ssl_cert_len; 507 char *ssl_key; 508 off_t ssl_key_len; 509 u_int8_t flags; 510}; 511 512struct listener { 513 u_int8_t flags; 514 int fd; 515 struct sockaddr_storage ss; 516 in_port_t port; 517 struct timeval timeout; 518 struct event ev; 519 struct smtpd *env; 520 char ssl_cert_name[PATH_MAX]; 521 struct ssl *ssl; 522 void *ssl_ctx; 523 TAILQ_ENTRY(listener) entry; 524}; 525 526struct auth { 527 u_int64_t id; 528 char user[MAXLOGNAME]; 529 char pass[MAX_LINE_SIZE]; 530 int success; 531}; 532 533enum session_flags { 534 F_EHLO = 0x1, 535 F_QUIT = 0x2, 536 F_8BITMIME = 0x4, 537 F_SECURE = 0x8, 538 F_AUTHENTICATED = 0x10, 539 F_PEERHASTLS = 0x20, 540 F_PEERHASAUTH = 0x40, 541 F_WRITEONLY = 0x80 542}; 543 544struct session { 545 SPLAY_ENTRY(session) s_nodes; 546 u_int64_t s_id; 547 548 enum session_flags s_flags; 549 enum session_state s_state; 550 int s_fd; 551 struct sockaddr_storage s_ss; 552 char s_hostname[MAXHOSTNAMELEN]; 553 struct event s_ev; 554 struct bufferevent *s_bev; 555 struct listener *s_l; 556 struct smtpd *s_env; 557 void *s_ssl; 558 u_char *s_buf; 559 int s_buflen; 560 struct timeval s_tv; 561 struct message s_msg; 562 short s_nresp[STATE_COUNT]; 563 size_t rcptcount; 564 long s_datalen; 565 566 struct auth s_auth; 567 struct batch *batch; 568 569 FILE *datafp; 570 int mboxfd; 571 int messagefd; 572}; 573 574struct smtpd { 575 char sc_conffile[MAXPATHLEN]; 576 577#define SMTPD_OPT_VERBOSE 0x00000001 578#define SMTPD_OPT_NOACTION 0x00000002 579 u_int32_t sc_opts; 580#define SMTPD_CONFIGURING 0x00000001 581#define SMTPD_EXITING 0x00000002 582#define SMTPD_MDA_PAUSED 0x00000004 583#define SMTPD_MTA_PAUSED 0x00000008 584#define SMTPD_SMTP_PAUSED 0x00000010 585 u_int32_t sc_flags; 586 struct timeval sc_qintval; 587 u_int32_t sc_maxconn; 588 struct event sc_ev; 589 int *sc_pipes[PROC_COUNT] 590 [PROC_COUNT]; 591 struct imsgev *sc_ievs[PROC_COUNT]; 592 int sc_instances[PROC_COUNT]; 593 int sc_instance; 594 char *sc_title[PROC_COUNT]; 595 struct passwd *sc_pw; 596 char sc_hostname[MAXHOSTNAMELEN]; 597 TAILQ_HEAD(listenerlist, listener) *sc_listeners; 598 TAILQ_HEAD(maplist, map) *sc_maps, *sc_maps_reload; 599 TAILQ_HEAD(rulelist, rule) *sc_rules, *sc_rules_reload; 600 SPLAY_HEAD(sessiontree, session) sc_sessions; 601 SPLAY_HEAD(msgtree, message) sc_messages; 602 SPLAY_HEAD(ssltree, ssl) *sc_ssl; 603 604 SPLAY_HEAD(batchtree, batch) batch_queue; 605 SPLAY_HEAD(childtree, child) children; 606 SPLAY_HEAD(lkatree, lkasession) lka_sessions; 607 SPLAY_HEAD(mtatree, mta_session) mta_sessions; 608 609 struct stats *stats; 610}; 611 612struct s_parent { 613 time_t start; 614}; 615 616struct s_queue { 617 size_t inserts_local; 618 size_t inserts_remote; 619}; 620 621struct s_runner { 622 size_t active; 623}; 624 625struct s_session { 626 size_t sessions; 627 size_t sessions_active; 628 629 size_t smtps; 630 size_t smtps_active; 631 632 size_t starttls; 633 size_t starttls_active; 634 635 size_t read_error; 636 size_t read_timeout; 637 size_t read_eof; 638 size_t write_error; 639 size_t write_timeout; 640 size_t write_eof; 641 size_t toofast; 642 size_t tempfail; 643 size_t linetoolong; 644 size_t delays; 645}; 646 647struct s_mda { 648 size_t write_error; 649}; 650 651struct stats { 652 struct s_parent parent; 653 struct s_queue queue; 654 struct s_runner runner; 655 struct s_session mta; 656 struct s_mda mda; 657 struct s_session smtp; 658}; 659 660struct sched { 661 int fd; 662 char mid[MAX_ID_SIZE]; 663 int ret; 664}; 665 666struct reload { 667 int fd; 668 int ret; 669}; 670 671struct submit_status { 672 u_int64_t id; 673 int code; 674 union submit_path { 675 struct path path; 676 char msgid[MAX_ID_SIZE]; 677 char errormsg[MAX_LINE_SIZE]; 678 } u; 679 enum message_flags flags; 680 struct sockaddr_storage ss; 681 struct message msg; 682}; 683 684struct forward_req { 685 u_int64_t id; 686 u_int8_t status; 687 char pw_name[MAXLOGNAME]; 688}; 689 690struct dns { 691 u_int64_t id; 692 char host[MAXHOSTNAMELEN]; 693 int port; 694 int error; 695 struct sockaddr_storage ss; 696 struct smtpd *env; 697 struct dns *next; 698}; 699 700struct secret { 701 u_int64_t id; 702 char host[MAXHOSTNAMELEN]; 703 char secret[MAX_LINE_SIZE]; 704}; 705 706struct rulematch { 707 u_int64_t id; 708 struct submit_status ss; 709}; 710 711enum lkasession_flags { 712 F_ERROR = 0x1 713}; 714 715struct lkasession { 716 SPLAY_ENTRY(lkasession) nodes; 717 u_int64_t id; 718 719 struct path path; 720 struct aliaseslist aliaseslist; 721 u_int8_t iterations; 722 u_int32_t pending; 723 enum lkasession_flags flags; 724 struct message message; 725 struct submit_status ss; 726}; 727 728enum mta_state { 729 MTA_INVALID_STATE, 730 MTA_INIT, 731 MTA_SECRET, 732 MTA_DATA, 733 MTA_MX, 734 MTA_CONNECT, 735 MTA_PROTOCOL, 736 MTA_DONE 737}; 738 739/* mta session flags */ 740#define MTA_FORCE_ANYSSL 0x1 741#define MTA_FORCE_SMTPS 0x2 742#define MTA_ALLOW_PLAIN 0x4 743#define MTA_USE_AUTH 0x8 744 745struct mta_relay { 746 TAILQ_ENTRY(mta_relay) entry; 747 struct sockaddr_storage sa; 748 int used; 749}; 750 751struct mta_session { 752 SPLAY_ENTRY(mta_session) entry; 753 u_int64_t id; 754 struct smtpd *env; 755 enum mta_state state; 756 char *host; 757 int port; 758 int flags; 759 TAILQ_HEAD(,message) recipients; 760 TAILQ_HEAD(,mta_relay) relays; 761 char *secret; 762 int datafd; 763 struct event ev; 764 char *cert; 765 void *smtp_state; 766}; 767 768/* aliases.c */ 769int aliases_exist(struct smtpd *, char *); 770int aliases_get(struct smtpd *, struct aliaseslist *, char *); 771int aliases_vdomain_exists(struct smtpd *, struct map *, char *); 772int aliases_virtual_exist(struct smtpd *, struct map *, struct path *); 773int aliases_virtual_get(struct smtpd *, struct map *, struct aliaseslist *, struct path *); 774int alias_parse(struct alias *, char *); 775 776/* authenticate.c */ 777int authenticate_user(char *, char *); 778 779/* bounce.c */ 780void bounce_process(struct smtpd *, struct message *); 781int bounce_session(struct smtpd *, int, struct message *); 782int bounce_session_switch(struct smtpd *, FILE *, enum session_state *, char *, 783 struct message *); 784 785/* log.c */ 786void log_init(int); 787void log_warn(const char *, ...) 788 __attribute__ ((format (printf, 1, 2))); 789void log_warnx(const char *, ...) 790 __attribute__ ((format (printf, 1, 2))); 791void log_info(const char *, ...) 792 __attribute__ ((format (printf, 1, 2))); 793void log_debug(const char *, ...) 794 __attribute__ ((format (printf, 1, 2))); 795__dead void fatal(const char *); 796__dead void fatalx(const char *); 797 798 799/* dns.c */ 800void dns_query_a(struct smtpd *, char *, int, u_int64_t); 801void dns_query_mx(struct smtpd *, char *, int, u_int64_t); 802void dns_query_ptr(struct smtpd *, struct sockaddr_storage *, 803 u_int64_t); 804void dns_async(struct smtpd *, struct imsgev *, int, 805 struct dns *); 806 807 808/* forward.c */ 809int forwards_get(int, struct aliaseslist *); 810 811/* smtpd.c */ 812int child_cmp(struct child *, struct child *); 813SPLAY_PROTOTYPE(childtree, child, entry, child_cmp); 814void imsg_event_add(struct imsgev *); 815int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t, 816 int, void *, u_int16_t); 817 818/* lka.c */ 819pid_t lka(struct smtpd *); 820int lkasession_cmp(struct lkasession *, struct lkasession *); 821SPLAY_PROTOTYPE(lkatree, lkasession, nodes, lkasession_cmp); 822 823/* mfa.c */ 824pid_t mfa(struct smtpd *); 825int msg_cmp(struct message *, struct message *); 826 827/* queue.c */ 828pid_t queue(struct smtpd *); 829u_int64_t queue_generate_id(void); 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); 835u_int16_t queue_hash(char *); 836 837/* queue_shared.c */ 838int queue_create_layout_message(char *, char *); 839void queue_delete_layout_message(char *, char *); 840int queue_record_layout_envelope(char *, struct message *); 841int queue_remove_layout_envelope(char *, struct message *); 842int queue_commit_layout_message(char *, struct message *); 843int queue_open_layout_messagefile(char *, struct message *); 844int enqueue_create_layout(char *); 845void enqueue_delete_message(char *); 846int enqueue_record_envelope(struct message *); 847int enqueue_remove_envelope(struct message *); 848int enqueue_commit_message(struct message *); 849int enqueue_open_messagefile(struct message *); 850int bounce_create_layout(char *, struct message *); 851void bounce_delete_message(char *); 852int bounce_record_envelope(struct message *); 853int bounce_remove_envelope(struct message *); 854int bounce_commit_message(struct message *); 855int bounce_record_message(struct message *); 856int queue_create_incoming_layout(char *); 857void queue_delete_incoming_message(char *); 858int queue_record_incoming_envelope(struct message *); 859int queue_remove_incoming_envelope(struct message *); 860int queue_commit_incoming_message(struct message *); 861int queue_open_incoming_message_file(struct message *); 862int queue_open_message_file(char *msgid); 863void queue_message_update(struct message *); 864void queue_delete_message(char *); 865struct qwalk *qwalk_new(char *); 866int qwalk(struct qwalk *, char *); 867void qwalk_close(struct qwalk *); 868void show_queue(char *, int); 869 870u_int16_t queue_hash(char *); 871 872/* map.c */ 873char *map_dblookup(struct smtpd *, char *, char *); 874 875/* mda.c */ 876pid_t mda(struct smtpd *); 877 878/* mta.c */ 879pid_t mta(struct smtpd *); 880int mta_session_cmp(struct mta_session *, struct mta_session *); 881SPLAY_PROTOTYPE(mtatree, mta_session, entry, mta_session_cmp); 882 883/* control.c */ 884pid_t control(struct smtpd *); 885void session_socket_blockmode(int, enum blockmodes); 886void session_socket_no_linger(int); 887int session_socket_error(int); 888 889/* enqueue.c */ 890int enqueue(int, char **); 891int enqueue_offline(int, char **); 892 893/* runner.c */ 894pid_t runner(struct smtpd *); 895void message_reset_flags(struct message *); 896SPLAY_PROTOTYPE(batchtree, batch, b_nodes, batch_cmp); 897 898/* smtp.c */ 899pid_t smtp(struct smtpd *); 900 901/* smtp_session.c */ 902void session_init(struct listener *, struct session *); 903int session_cmp(struct session *, struct session *); 904void session_pickup(struct session *, struct submit_status *); 905void session_destroy(struct session *); 906void session_respond(struct session *, char *, ...) 907 __attribute__ ((format (printf, 2, 3))); 908void session_bufferevent_new(struct session *); 909 910SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp); 911 912/* config.c */ 913#define PURGE_LISTENERS 0x01 914#define PURGE_MAPS 0x02 915#define PURGE_RULES 0x04 916#define PURGE_SSL 0x08 917#define PURGE_EVERYTHING 0xff 918void purge_config(struct smtpd *, u_int8_t); 919void unconfigure(struct smtpd *); 920void configure(struct smtpd *); 921void init_pipes(struct smtpd *); 922void config_pipes(struct smtpd *, struct peer *, u_int); 923void config_peers(struct smtpd *, struct peer *, u_int); 924 925/* parse.y */ 926int parse_config(struct smtpd *, const char *, int); 927int cmdline_symset(char *); 928 929/* ssl.c */ 930void ssl_init(void); 931void ssl_transaction(struct session *); 932 933void ssl_session_init(struct session *); 934void ssl_session_destroy(struct session *); 935int ssl_load_certfile(struct smtpd *, const char *, u_int8_t); 936void ssl_setup(struct smtpd *, struct listener *); 937int ssl_cmp(struct ssl *, struct ssl *); 938SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp); 939 940/* ssl_privsep.c */ 941int ssl_ctx_use_private_key(void *, char *, off_t); 942int ssl_ctx_use_certificate_chain(void *, char *, off_t); 943 944/* map.c */ 945struct map *map_find(struct smtpd *, objid_t); 946struct map *map_findbyname(struct smtpd *, const char *); 947 948/* util.c */ 949typedef struct arglist arglist; 950struct arglist { 951 char **list; 952 u_int num; 953 u_int nalloc; 954}; 955void addargs(arglist *, char *, ...) 956 __attribute__((format(printf, 2, 3))); 957int bsnprintf(char *, size_t, const char *, ...) 958 __attribute__ ((format (printf, 3, 4))); 959int safe_fclose(FILE *); 960int hostname_match(char *, char *); 961int recipient_to_path(struct path *, char *); 962int valid_localpart(char *); 963int valid_domainpart(char *); 964char *ss_to_text(struct sockaddr_storage *); 965int valid_message_id(char *); 966int valid_message_uid(char *); 967char *time_to_text(time_t); 968int secure_file(int, char *, struct passwd *, int); 969void lowercase(char *, char *, size_t); 970void message_set_errormsg(struct message *, char *, ...); 971char *message_get_errormsg(struct message *); 972void sa_set_port(struct sockaddr *, int); 973