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