smtpd.h revision 1.128
1/* $OpenBSD: smtpd.h,v 1.128 2009/06/06 18:31:42 pyr 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#define IMSG_SIZE_CHECK(p) do { \ 23 if (IMSG_DATA_SIZE(&imsg) != sizeof(*p)) \ 24 fatalx("bad length imsg received"); \ 25} while (0) 26#define IMSG_DATA_SIZE(imsg) ((imsg)->hdr.len - IMSG_HEADER_SIZE) 27 28#define CONF_FILE "/etc/mail/smtpd.conf" 29#define MAX_LISTEN 16 30#define PROC_COUNT 9 31#define MAX_NAME_SIZE 64 32 33#define MAX_HOPS_COUNT 100 34 35/* sizes include the tailing '\0' */ 36#define MAX_LINE_SIZE 1024 37#define MAX_LOCALPART_SIZE 65 38#define MAX_DOMAINPART_SIZE MAXHOSTNAMELEN 39#define MAX_ID_SIZE 64 40 41/* return and forward path size */ 42#define MAX_PATH_SIZE 256 43 44/*#define SMTPD_CONNECT_TIMEOUT (60)*/ 45#define SMTPD_CONNECT_TIMEOUT (10) 46#define SMTPD_QUEUE_INTERVAL (15 * 60) 47#define SMTPD_QUEUE_MAXINTERVAL (4 * 60 * 60) 48#define SMTPD_QUEUE_EXPIRY (4 * 24 * 60 * 60) 49#define SMTPD_USER "_smtpd" 50#define SMTPD_SOCKET "/var/run/smtpd.sock" 51#define SMTPD_BANNER "220 %s ESMTP OpenSMTPD" 52#define SMTPD_SESSION_TIMEOUT 300 53#define SMTPD_BACKLOG 5 54 55#define PATH_MAILLOCAL "/usr/libexec/mail.local" 56#define PATH_SMTPCTL "/usr/sbin/smtpctl" 57 58#define DIRHASH_BUCKETS 4096 59 60#define PATH_SPOOL "/var/spool/smtpd" 61 62#define PATH_ENQUEUE "/enqueue" 63#define PATH_INCOMING "/incoming" 64#define PATH_QUEUE "/queue" 65#define PATH_PURGE "/purge" 66 67#define PATH_MESSAGE "/message" 68#define PATH_ENVELOPES "/envelopes" 69 70#define PATH_RUNQUEUE "/runqueue" 71#define PATH_RUNQUEUEHIGH "/runqueue-high" 72#define PATH_RUNQUEUELOW "/runqueue-low" 73 74#define PATH_OFFLINE "/offline" 75 76/* number of MX records to lookup */ 77#define MAX_MX_COUNT 10 78 79/* max response delay under flood conditions */ 80#define MAX_RESPONSE_DELAY 60 81 82/* how many responses per state are undelayed */ 83#define FAST_RESPONSES 2 84 85/* rfc5321 limits */ 86#define SMTP_TEXTLINE_MAX 1000 87#define SMTP_CMDLINE_MAX 512 88#define SMTP_ANYLINE_MAX SMTP_TEXTLINE_MAX 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 117struct mxhost { 118 TAILQ_ENTRY(mxhost) entry; 119 struct sockaddr_storage ss; 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_CONF_START, 128 IMSG_CONF_SSL, 129 IMSG_CONF_SSL_CERT, 130 IMSG_CONF_SSL_KEY, 131 IMSG_CONF_LISTENER, 132 IMSG_CONF_MAP, 133 IMSG_CONF_MAP_CONTENT, 134 IMSG_CONF_RULE, 135 IMSG_CONF_RULE_SOURCE, 136 IMSG_CONF_CONDITION, 137 IMSG_CONF_OPTION, 138 IMSG_CONF_END, 139 IMSG_CONF_RELOAD, 140 IMSG_LKA_MAIL, 141 IMSG_LKA_RCPT, 142 IMSG_LKA_SECRET, 143 IMSG_MDA_MAILBOX_FILE, 144 IMSG_MDA_MESSAGE_FILE, 145 IMSG_MFA_RCPT, 146 IMSG_MFA_MAIL, 147 148 IMSG_QUEUE_CREATE_MESSAGE, 149 IMSG_QUEUE_SUBMIT_ENVELOPE, 150 IMSG_QUEUE_COMMIT_ENVELOPES, 151 IMSG_QUEUE_REMOVE_MESSAGE, 152 IMSG_QUEUE_COMMIT_MESSAGE, 153 IMSG_QUEUE_TEMPFAIL, 154 IMSG_QUEUE_STATS, 155 156 IMSG_QUEUE_REMOVE_SUBMISSION, 157 IMSG_QUEUE_MESSAGE_UPDATE, 158 IMSG_QUEUE_MESSAGE_FD, 159 IMSG_QUEUE_MESSAGE_FILE, 160 161 IMSG_RUNNER_UPDATE_ENVELOPE, 162 IMSG_RUNNER_STATS, 163 IMSG_RUNNER_SCHEDULE, 164 165 IMSG_BATCH_CREATE, 166 IMSG_BATCH_APPEND, 167 IMSG_BATCH_CLOSE, 168 169 IMSG_PARENT_ENQUEUE_OFFLINE, 170 IMSG_PARENT_FORWARD_OPEN, 171 IMSG_PARENT_MAILBOX_OPEN, 172 IMSG_PARENT_MESSAGE_OPEN, 173 IMSG_PARENT_MAILBOX_RENAME, 174 IMSG_PARENT_STATS, 175 176 IMSG_PARENT_AUTHENTICATE, 177 IMSG_PARENT_SEND_CONFIG, 178 179 IMSG_MDA_PAUSE, 180 IMSG_MTA_PAUSE, 181 IMSG_SMTP_PAUSE, 182 IMSG_SMTP_STATS, 183 184 IMSG_MDA_RESUME, 185 IMSG_MTA_RESUME, 186 IMSG_SMTP_RESUME, 187 188 IMSG_STATS, 189 190 IMSG_SMTP_ENQUEUE, 191 192 IMSG_DNS_A, 193 IMSG_DNS_A_END, 194 IMSG_DNS_MX, 195 IMSG_DNS_PTR 196}; 197 198enum blockmodes { 199 BM_NORMAL, 200 BM_NONBLOCK 201}; 202 203struct imsgev { 204 struct imsgbuf ibuf; 205 void (*handler)(int, short, void *); 206 struct event ev; 207 void *data; 208 short events; 209}; 210 211struct ctl_conn { 212 TAILQ_ENTRY(ctl_conn) entry; 213 u_int8_t flags; 214#define CTL_CONN_NOTIFY 0x01 215 struct imsgev iev; 216}; 217TAILQ_HEAD(ctl_connlist, ctl_conn); 218 219typedef u_int32_t objid_t; 220 221struct ctl_id { 222 objid_t id; 223 char name[MAX_NAME_SIZE]; 224}; 225 226enum smtp_proc_type { 227 PROC_PARENT = 0, 228 PROC_SMTP, 229 PROC_MFA, 230 PROC_LKA, 231 PROC_QUEUE, 232 PROC_MDA, 233 PROC_MTA, 234 PROC_CONTROL, 235 PROC_RUNNER, 236} smtpd_process; 237 238struct peer { 239 enum smtp_proc_type id; 240 void (*cb)(int, short, void *); 241}; 242 243enum map_type { 244 T_SINGLE, 245 T_LIST, 246 T_HASH 247}; 248 249enum map_src { 250 S_NONE, 251 S_DYN, 252 S_DNS, 253 S_FILE, 254 S_DB, 255 S_EXT 256}; 257 258enum mapel_type { 259 ME_STRING, 260 ME_NET, 261 ME_NETMASK 262}; 263 264struct mapel { 265 TAILQ_ENTRY(mapel) me_entry; 266 union mapel_data { 267 char med_string[MAX_LINE_SIZE]; 268 struct netaddr med_addr; 269 } me_key; 270 union mapel_data me_val; 271}; 272 273struct map { 274 TAILQ_ENTRY(map) m_entry; 275#define F_USED 0x01 276#define F_DYNAMIC 0x02 277 u_int8_t m_flags; 278 char m_name[MAX_LINE_SIZE]; 279 objid_t m_id; 280 enum map_type m_type; 281 enum mapel_type m_eltype; 282 enum map_src m_src; 283 char m_config[MAXPATHLEN]; 284 TAILQ_HEAD(mapel_list, mapel) m_contents; 285}; 286 287enum cond_type { 288 C_ALL, 289 C_NET, 290 C_DOM 291}; 292 293struct cond { 294 TAILQ_ENTRY(cond) c_entry; 295 objid_t c_map; 296 enum cond_type c_type; 297 struct map *c_match; 298}; 299 300enum opt_type { 301 O_RWUSER, /* rewrite user */ 302 O_RWDOMAIN, /* rewrite domain */ 303}; 304 305struct opt { 306 TAILQ_ENTRY(opt) o_entry; 307 enum opt_type o_type; 308}; 309 310enum action_type { 311 A_INVALID, 312 A_RELAY, 313 A_RELAYVIA, 314 A_MAILDIR, 315 A_MBOX, 316 A_FILENAME, 317 A_EXT 318}; 319#define IS_MAILBOX(x) ((x) == A_MAILDIR || (x) == A_MBOX || (x) == A_FILENAME) 320#define IS_RELAY(x) ((x) == A_RELAY || (x) == A_RELAYVIA) 321#define IS_EXT(x) ((x) == A_EXT) 322 323struct rule { 324 TAILQ_ENTRY(rule) r_entry; 325 int r_accept; 326 struct map *r_sources; 327 TAILQ_HEAD(condlist, cond) r_conditions; 328 enum action_type r_action; 329 union rule_dest { 330 char path[MAXPATHLEN]; 331 struct relayhost relayhost; 332#define MAXCOMMANDLEN 256 333 char command[MAXCOMMANDLEN]; 334 } r_value; 335 TAILQ_HEAD(optlist, opt) r_options; 336}; 337 338enum path_flags { 339 F_PATH_ALIAS = 0x1, 340 F_PATH_VIRTUAL = 0x2, 341 F_PATH_EXPANDED = 0x4, 342 F_PATH_NOFORWARD = 0x8, 343 F_PATH_FORWARDED = 0x10, 344 F_PATH_ACCOUNT = 0x20, 345 F_PATH_AUTHENTICATED = 0x40, 346}; 347 348struct path { 349 TAILQ_ENTRY(path) entry; 350 struct rule rule; 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_DAEMON_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}; 407 408struct message { 409 TAILQ_ENTRY(message) entry; 410 411 enum message_type type; 412 413 u_int64_t id; 414 u_int64_t session_id; 415 u_int64_t batch_id; 416 417 char message_id[MAX_ID_SIZE]; 418 char message_uid[MAX_ID_SIZE]; 419 420 char session_helo[MAXHOSTNAMELEN]; 421 char session_hostname[MAXHOSTNAMELEN]; 422 char session_errorline[MAX_LINE_SIZE]; 423 struct sockaddr_storage session_ss; 424 struct path session_rcpt; 425 426 struct path sender; 427 struct path recipient; 428 429 time_t creation; 430 time_t lasttry; 431 u_int8_t retry; 432 enum message_flags flags; 433 enum message_status status; 434}; 435 436enum batch_status { 437 S_BATCH_PERMFAILURE = 0x1, 438 S_BATCH_TEMPFAILURE = 0x2, 439 S_BATCH_REJECTED = 0x4, 440 S_BATCH_ACCEPTED = 0x8, 441 S_BATCH_RETRY = 0x10, 442 S_BATCH_EDNS = 0x20, 443 S_BATCH_ECONNECT = 0x40 444}; 445 446enum batch_type { 447 T_MDA_BATCH = 0x1, 448 T_MTA_BATCH = 0x2, 449 T_DAEMON_BATCH = 0x4 450}; 451 452enum child_type { 453 CHILD_INVALID, 454 CHILD_DAEMON, 455 CHILD_MDA, 456 CHILD_ENQUEUE_OFFLINE 457}; 458 459struct child { 460 SPLAY_ENTRY(child) entry; 461 462 pid_t pid; 463 enum child_type type; 464 enum smtp_proc_type title; 465}; 466 467struct batch { 468 SPLAY_ENTRY(batch) b_nodes; 469 470 u_int64_t id; 471 enum batch_type type; 472 struct rule rule; 473 474 struct smtpd *env; 475 476 char message_id[MAX_ID_SIZE]; 477 char hostname[MAXHOSTNAMELEN]; 478 char errorline[MAX_LINE_SIZE]; 479 480 struct session *sessionp; 481 482 struct message message; 483 struct message *messagep; 484 FILE *messagefp; 485 TAILQ_HEAD(, message) messages; 486 487 enum batch_status status; 488}; 489 490enum session_state { 491 S_INIT = 0, 492 S_GREETED, 493 S_TLS, 494 S_AUTH_INIT, 495 S_AUTH_USERNAME, 496 S_AUTH_PASSWORD, 497 S_AUTH_FINALIZE, 498 S_HELO, 499 S_MAIL_MFA, 500 S_MAIL_QUEUE, 501 S_MAIL, 502 S_RCPT_MFA, 503 S_RCPT, 504 S_DATA, 505 S_DATA_QUEUE, 506 S_DATACONTENT, 507 S_DONE, 508 S_QUIT 509}; 510#define STATE_COUNT 18 511 512struct ssl { 513 SPLAY_ENTRY(ssl) ssl_nodes; 514 char ssl_name[PATH_MAX]; 515 char *ssl_cert; 516 off_t ssl_cert_len; 517 char *ssl_key; 518 off_t ssl_key_len; 519 u_int8_t flags; 520}; 521 522struct listener { 523 u_int8_t flags; 524 int fd; 525 struct sockaddr_storage ss; 526 in_port_t port; 527 struct timeval timeout; 528 struct event ev; 529 struct smtpd *env; 530 char ssl_cert_name[PATH_MAX]; 531 struct ssl *ssl; 532 void *ssl_ctx; 533 TAILQ_ENTRY(listener) entry; 534}; 535 536struct auth { 537 u_int64_t id; 538 char user[MAXLOGNAME]; 539 char pass[MAX_LINE_SIZE]; 540 int success; 541}; 542 543enum session_flags { 544 F_EHLO = 0x1, 545 F_QUIT = 0x2, 546 F_8BITMIME = 0x4, 547 F_SECURE = 0x8, 548 F_AUTHENTICATED = 0x10, 549 F_PEERHASTLS = 0x20, 550 F_PEERHASAUTH = 0x40, 551 F_WRITEONLY = 0x80 552}; 553 554struct session { 555 SPLAY_ENTRY(session) s_nodes; 556 u_int64_t s_id; 557 558 enum session_flags s_flags; 559 enum session_state s_state; 560 int s_fd; 561 struct sockaddr_storage s_ss; 562 char s_hostname[MAXHOSTNAMELEN]; 563 struct event s_ev; 564 struct bufferevent *s_bev; 565 struct listener *s_l; 566 struct smtpd *s_env; 567 void *s_ssl; 568 u_char *s_buf; 569 int s_buflen; 570 struct timeval s_tv; 571 struct message s_msg; 572 short s_nresp[STATE_COUNT]; 573 size_t rcptcount; 574 long s_datalen; 575 576 struct auth s_auth; 577 578 char credentials[MAX_LINE_SIZE]; 579 580 struct batch *batch; 581 TAILQ_HEAD(mxhostlist, mxhost) mxhosts; 582 583 FILE *datafp; 584 int mboxfd; 585 int messagefd; 586}; 587 588struct smtpd { 589 char sc_conffile[MAXPATHLEN]; 590 591#define SMTPD_OPT_VERBOSE 0x00000001 592#define SMTPD_OPT_NOACTION 0x00000002 593 u_int32_t sc_opts; 594#define SMTPD_CONFIGURING 0x00000001 595#define SMTPD_EXITING 0x00000002 596#define SMTPD_MDA_PAUSED 0x00000004 597#define SMTPD_MTA_PAUSED 0x00000008 598#define SMTPD_SMTP_PAUSED 0x00000010 599 u_int32_t sc_flags; 600 struct timeval sc_qintval; 601 u_int32_t sc_maxconn; 602 struct event sc_ev; 603 int *sc_pipes[PROC_COUNT] 604 [PROC_COUNT]; 605 struct imsgev *sc_ievs[PROC_COUNT]; 606 int sc_instances[PROC_COUNT]; 607 int sc_instance; 608 char *sc_title[PROC_COUNT]; 609 struct passwd *sc_pw; 610 char sc_hostname[MAXHOSTNAMELEN]; 611 TAILQ_HEAD(listenerlist, listener) *sc_listeners; 612 TAILQ_HEAD(maplist, map) *sc_maps, *sc_maps_reload; 613 TAILQ_HEAD(rulelist, rule) *sc_rules, *sc_rules_reload; 614 SPLAY_HEAD(sessiontree, session) sc_sessions; 615 SPLAY_HEAD(msgtree, message) sc_messages; 616 SPLAY_HEAD(ssltree, ssl) *sc_ssl; 617 618 SPLAY_HEAD(batchtree, batch) batch_queue; 619 SPLAY_HEAD(childtree, child) children; 620 SPLAY_HEAD(lkatree, lkasession) lka_sessions; 621 622 struct stats *stats; 623}; 624 625struct s_parent { 626 time_t start; 627}; 628 629struct s_queue { 630 size_t inserts_local; 631 size_t inserts_remote; 632}; 633 634struct s_runner { 635 size_t active; 636}; 637 638struct s_session { 639 size_t sessions; 640 size_t sessions_active; 641 642 size_t smtps; 643 size_t smtps_active; 644 645 size_t starttls; 646 size_t starttls_active; 647 648 size_t read_error; 649 size_t read_timeout; 650 size_t read_eof; 651 size_t write_error; 652 size_t write_timeout; 653 size_t write_eof; 654 size_t toofast; 655 size_t tempfail; 656 size_t linetoolong; 657 size_t delays; 658}; 659 660struct stats { 661 struct s_parent parent; 662 struct s_queue queue; 663 struct s_runner runner; 664 struct s_session mta; 665 struct s_session smtp; 666}; 667 668struct sched { 669 int fd; 670 char mid[MAX_ID_SIZE]; 671 int ret; 672}; 673 674struct reload { 675 int fd; 676 int ret; 677}; 678 679struct submit_status { 680 u_int64_t id; 681 int code; 682 union submit_path { 683 struct path path; 684 char msgid[MAX_ID_SIZE]; 685 char errormsg[MAX_LINE_SIZE]; 686 } u; 687 enum message_flags flags; 688 struct sockaddr_storage ss; 689 struct message msg; 690}; 691 692struct forward_req { 693 u_int64_t id; 694 u_int8_t status; 695 char pw_name[MAXLOGNAME]; 696}; 697 698struct dns { 699 u_int64_t id; 700 char host[MAXHOSTNAMELEN]; 701 int port; 702 int error; 703 struct sockaddr_storage ss; 704 struct smtpd *env; 705 struct dns *next; 706}; 707 708struct secret { 709 u_int64_t id; 710 char host[MAXHOSTNAMELEN]; 711 char secret[MAX_LINE_SIZE]; 712}; 713 714enum lkasession_flags { 715 F_ERROR = 0x1 716}; 717 718struct lkasession { 719 SPLAY_ENTRY(lkasession) nodes; 720 u_int64_t id; 721 722 struct path path; 723 struct aliaseslist aliaseslist; 724 u_int8_t iterations; 725 u_int32_t pending; 726 enum lkasession_flags flags; 727 struct message message; 728 struct submit_status ss; 729}; 730 731/* aliases.c */ 732int aliases_exist(struct smtpd *, char *); 733int aliases_get(struct smtpd *, struct aliaseslist *, char *); 734int aliases_virtual_exist(struct smtpd *, struct path *); 735int aliases_virtual_get(struct smtpd *, struct aliaseslist *, struct path *); 736int alias_parse(struct alias *, char *); 737 738 739/* log.c */ 740void log_init(int); 741void log_warn(const char *, ...) 742 __attribute__ ((format (printf, 1, 2))); 743void log_warnx(const char *, ...) 744 __attribute__ ((format (printf, 1, 2))); 745void log_info(const char *, ...) 746 __attribute__ ((format (printf, 1, 2))); 747void log_debug(const char *, ...) 748 __attribute__ ((format (printf, 1, 2))); 749__dead void fatal(const char *); 750__dead void fatalx(const char *); 751 752 753/* dns.c */ 754void dns_query_a(struct smtpd *, char *, int, u_int64_t); 755void dns_query_mx(struct smtpd *, char *, int, u_int64_t); 756void dns_query_ptr(struct smtpd *, struct sockaddr_storage *, 757 u_int64_t); 758void dns_async(struct smtpd *, struct imsgev *, int, 759 struct dns *); 760 761 762/* forward.c */ 763int forwards_get(int, struct aliaseslist *); 764 765/* smtpd.c */ 766int child_cmp(struct child *, struct child *); 767SPLAY_PROTOTYPE(childtree, child, entry, child_cmp); 768void imsg_event_add(struct imsgev *); 769int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t, pid_t, 770 int, void *, u_int16_t); 771 772/* lka.c */ 773pid_t lka(struct smtpd *); 774int lkasession_cmp(struct lkasession *, struct lkasession *); 775SPLAY_PROTOTYPE(lkatree, lkasession, nodes, lkasession_cmp); 776 777/* mfa.c */ 778pid_t mfa(struct smtpd *); 779int msg_cmp(struct message *, struct message *); 780 781/* queue.c */ 782pid_t queue(struct smtpd *); 783u_int64_t queue_generate_id(void); 784int queue_remove_batch_message(struct smtpd *, struct batch *, 785 struct message *); 786int queue_load_envelope(struct message *, char *); 787int queue_update_envelope(struct message *); 788int queue_remove_envelope(struct message *); 789int batch_cmp(struct batch *, struct batch *); 790struct batch *batch_by_id(struct smtpd *, u_int64_t); 791struct message *message_by_id(struct smtpd *, struct batch *, u_int64_t); 792u_int16_t queue_hash(char *); 793 794/* queue_shared.c */ 795int queue_create_layout_message(char *, char *); 796void queue_delete_layout_message(char *, char *); 797int queue_record_layout_envelope(char *, struct message *); 798int queue_remove_layout_envelope(char *, struct message *); 799int queue_commit_layout_message(char *, struct message *); 800int queue_open_layout_messagefile(char *, struct message *); 801int enqueue_create_layout(char *); 802void enqueue_delete_message(char *); 803int enqueue_record_envelope(struct message *); 804int enqueue_remove_envelope(struct message *); 805int enqueue_commit_message(struct message *); 806int enqueue_open_messagefile(struct message *); 807int queue_create_incoming_layout(char *); 808void queue_delete_incoming_message(char *); 809int queue_record_incoming_envelope(struct message *); 810int queue_remove_incoming_envelope(struct message *); 811int queue_commit_incoming_message(struct message *); 812int queue_open_incoming_message_file(struct message *); 813int queue_open_message_file(char *msgid); 814void queue_message_update(struct message *); 815void queue_delete_message(char *); 816struct qwalk *qwalk_new(char *); 817int qwalk(struct qwalk *, char *); 818void qwalk_close(struct qwalk *); 819void show_queue(char *, int); 820 821u_int16_t queue_hash(char *); 822 823/* map.c */ 824char *map_dblookup(struct smtpd *, char *, char *); 825 826/* mda.c */ 827pid_t mda(struct smtpd *); 828 829/* mta.c */ 830pid_t mta(struct smtpd *); 831 832/* control.c */ 833pid_t control(struct smtpd *); 834void session_socket_blockmode(int, enum blockmodes); 835 836/* enqueue.c */ 837int enqueue(int, char **); 838int enqueue_offline(int, char **); 839 840/* runner.c */ 841pid_t runner(struct smtpd *); 842SPLAY_PROTOTYPE(batchtree, batch, b_nodes, batch_cmp); 843 844 845/* smtp.c */ 846pid_t smtp(struct smtpd *); 847 848/* smtp_session.c */ 849void session_init(struct listener *, struct session *); 850int session_cmp(struct session *, struct session *); 851void session_pickup(struct session *, struct submit_status *); 852void session_destroy(struct session *); 853void session_respond(struct session *, char *, ...) 854 __attribute__ ((format (printf, 2, 3))); 855void session_bufferevent_new(struct session *); 856 857SPLAY_PROTOTYPE(sessiontree, session, s_nodes, session_cmp); 858 859/* store.c */ 860int store_write_header(struct batch *, struct message *, FILE *, int); 861int store_write_message(struct batch *, struct message *); 862int store_write_daemon(struct batch *, struct message *); 863int store_message(struct batch *, struct message *, 864 int (*)(struct batch *, struct message *)); 865 866/* config.c */ 867#define PURGE_LISTENERS 0x01 868#define PURGE_MAPS 0x02 869#define PURGE_RULES 0x04 870#define PURGE_SSL 0x08 871#define PURGE_EVERYTHING 0xff 872void purge_config(struct smtpd *, u_int8_t); 873void unconfigure(struct smtpd *); 874void configure(struct smtpd *); 875void init_pipes(struct smtpd *); 876void config_pipes(struct smtpd *, struct peer *, u_int); 877void config_peers(struct smtpd *, struct peer *, u_int); 878 879/* parse.y */ 880int parse_config(struct smtpd *, const char *, int); 881int cmdline_symset(char *); 882 883/* ssl.c */ 884void ssl_init(void); 885void ssl_transaction(struct session *); 886 887void ssl_session_init(struct session *); 888void ssl_session_destroy(struct session *); 889int ssl_load_certfile(struct smtpd *, const char *, u_int8_t); 890void ssl_setup(struct smtpd *, struct listener *); 891int ssl_cmp(struct ssl *, struct ssl *); 892SPLAY_PROTOTYPE(ssltree, ssl, ssl_nodes, ssl_cmp); 893 894/* ssl_privsep.c */ 895int ssl_ctx_use_private_key(void *, char *, off_t); 896int ssl_ctx_use_certificate_chain(void *, char *, off_t); 897 898/* map.c */ 899struct map *map_find(struct smtpd *, objid_t); 900struct map *map_findbyname(struct smtpd *, const char *); 901 902/* util.c */ 903typedef struct arglist arglist; 904struct arglist { 905 char **list; 906 u_int num; 907 u_int nalloc; 908}; 909void addargs(arglist *, char *, ...) 910 __attribute__((format(printf, 2, 3))); 911int bsnprintf(char *, size_t, const char *, ...) 912 __attribute__ ((format (printf, 3, 4))); 913int safe_fclose(FILE *); 914int hostname_match(char *, char *); 915int recipient_to_path(struct path *, char *); 916int valid_localpart(char *); 917int valid_domainpart(char *); 918char *ss_to_text(struct sockaddr_storage *); 919int valid_message_id(char *); 920int valid_message_uid(char *); 921char *time_to_text(time_t); 922int secure_file(int, char *, struct passwd *); 923void lowercase(char *, char *, size_t); 924