smtpd.h revision 1.615
1/* $OpenBSD: smtpd.h,v 1.615 2018/12/28 15:09:28 eric Exp $ */ 2 3/* 4 * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org> 5 * Copyright (c) 2008 Pierre-Yves Ritschard <pyr@openbsd.org> 6 * Copyright (c) 2012 Eric Faurot <eric@openbsd.org> 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21#ifndef nitems 22#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) 23#endif 24 25#include <netinet/in.h> 26#include <netdb.h> 27#include <event.h> 28 29#include "smtpd-defines.h" 30#include "smtpd-api.h" 31#include "ioev.h" 32 33#define CHECK_IMSG_DATA_SIZE(imsg, expected_sz) do { \ 34 if ((imsg)->hdr.len - IMSG_HEADER_SIZE != (expected_sz)) \ 35 fatalx("smtpd: imsg %d: data size expected %zd got %zd",\ 36 (imsg)->hdr.type, \ 37 (expected_sz), (imsg)->hdr.len - IMSG_HEADER_SIZE); \ 38} while (0) 39 40#define CONF_FILE "/etc/mail/smtpd.conf" 41#define MAILNAME_FILE "/etc/mail/mailname" 42#define CA_FILE "/etc/ssl/cert.pem" 43 44#define PROC_COUNT 7 45 46#define MAX_HOPS_COUNT 100 47#define DEFAULT_MAX_BODY_SIZE (35*1024*1024) 48 49#define EXPAND_BUFFER 1024 50 51#define SMTPD_QUEUE_EXPIRY (4 * 24 * 60 * 60) 52#define SMTPD_SOCKET "/var/run/smtpd.sock" 53#define SMTPD_NAME "OpenSMTPD" 54#define SMTPD_VERSION "6.4.0" 55#define SMTPD_SESSION_TIMEOUT 300 56#define SMTPD_BACKLOG 5 57 58#define PATH_SMTPCTL "/usr/sbin/smtpctl" 59 60#define PATH_OFFLINE "/offline" 61#define PATH_PURGE "/purge" 62#define PATH_TEMPORARY "/temporary" 63 64#define PATH_LIBEXEC "/usr/local/libexec/smtpd" 65 66 67/* 68 * RFC 5322 defines these characters as valid, some of them are 69 * potentially dangerous and need to be escaped. 70 */ 71#define MAILADDR_ALLOWED "!#$%&'*/?^`{|}~+-=_" 72#define MAILADDR_ESCAPE "!#$%&'*/?^`{|}~" 73 74 75#define F_STARTTLS 0x01 76#define F_SMTPS 0x02 77#define F_SSL (F_STARTTLS | F_SMTPS) 78#define F_AUTH 0x08 79#define F_STARTTLS_REQUIRE 0x20 80#define F_AUTH_REQUIRE 0x40 81#define F_MASK_SOURCE 0x100 82#define F_TLS_VERIFY 0x200 83#define F_EXT_DSN 0x400 84#define F_RECEIVEDAUTH 0x800 85#define F_MASQUERADE 0x1000 86#define F_FILTERED 0x2000 87 88#define RELAY_TLS_OPPORTUNISTIC 0 89#define RELAY_TLS_STARTTLS 1 90#define RELAY_TLS_SMTPS 2 91#define RELAY_TLS_NO 3 92 93#define RELAY_AUTH 0x08 94#define RELAY_LMTP 0x80 95#define RELAY_TLS_VERIFY 0x200 96 97#define MTA_EXT_DSN 0x400 98 99 100#define P_NEWALIASES 0 101#define P_MAKEMAP 1 102 103#define CERT_ERROR -1 104#define CERT_OK 0 105#define CERT_NOCA 1 106#define CERT_NOCERT 2 107#define CERT_INVALID 3 108 109struct userinfo { 110 char username[SMTPD_VUSERNAME_SIZE]; 111 char directory[PATH_MAX]; 112 uid_t uid; 113 gid_t gid; 114}; 115 116struct netaddr { 117 struct sockaddr_storage ss; 118 int bits; 119}; 120 121struct relayhost { 122 uint16_t flags; 123 int tls; 124 char hostname[HOST_NAME_MAX+1]; 125 uint16_t port; 126 char authlabel[PATH_MAX]; 127}; 128 129struct credentials { 130 char username[LINE_MAX]; 131 char password[LINE_MAX]; 132}; 133 134struct destination { 135 char name[HOST_NAME_MAX+1]; 136}; 137 138struct source { 139 struct sockaddr_storage addr; 140}; 141 142struct addrname { 143 struct sockaddr_storage addr; 144 char name[HOST_NAME_MAX+1]; 145}; 146 147union lookup { 148 struct expand *expand; 149 struct credentials creds; 150 struct netaddr netaddr; 151 struct source source; 152 struct destination domain; 153 struct userinfo userinfo; 154 struct mailaddr mailaddr; 155 struct addrname addrname; 156 struct maddrmap *maddrmap; 157 char relayhost[LINE_MAX]; 158}; 159 160/* 161 * Bump IMSG_VERSION whenever a change is made to enum imsg_type. 162 * This will ensure that we can never use a wrong version of smtpctl with smtpd. 163 */ 164#define IMSG_VERSION 16 165 166enum imsg_type { 167 IMSG_NONE, 168 169 IMSG_CTL_OK, 170 IMSG_CTL_FAIL, 171 172 IMSG_CTL_GET_DIGEST, 173 IMSG_CTL_GET_STATS, 174 IMSG_CTL_LIST_MESSAGES, 175 IMSG_CTL_LIST_ENVELOPES, 176 IMSG_CTL_MTA_SHOW_HOSTS, 177 IMSG_CTL_MTA_SHOW_RELAYS, 178 IMSG_CTL_MTA_SHOW_ROUTES, 179 IMSG_CTL_MTA_SHOW_HOSTSTATS, 180 IMSG_CTL_MTA_BLOCK, 181 IMSG_CTL_MTA_UNBLOCK, 182 IMSG_CTL_MTA_SHOW_BLOCK, 183 IMSG_CTL_PAUSE_EVP, 184 IMSG_CTL_PAUSE_MDA, 185 IMSG_CTL_PAUSE_MTA, 186 IMSG_CTL_PAUSE_SMTP, 187 IMSG_CTL_PROFILE, 188 IMSG_CTL_PROFILE_DISABLE, 189 IMSG_CTL_PROFILE_ENABLE, 190 IMSG_CTL_RESUME_EVP, 191 IMSG_CTL_RESUME_MDA, 192 IMSG_CTL_RESUME_MTA, 193 IMSG_CTL_RESUME_SMTP, 194 IMSG_CTL_RESUME_ROUTE, 195 IMSG_CTL_REMOVE, 196 IMSG_CTL_SCHEDULE, 197 IMSG_CTL_SHOW_STATUS, 198 IMSG_CTL_TRACE_DISABLE, 199 IMSG_CTL_TRACE_ENABLE, 200 IMSG_CTL_UPDATE_TABLE, 201 IMSG_CTL_VERBOSE, 202 IMSG_CTL_DISCOVER_EVPID, 203 IMSG_CTL_DISCOVER_MSGID, 204 205 IMSG_CTL_SMTP_SESSION, 206 207 IMSG_GETADDRINFO, 208 IMSG_GETADDRINFO_END, 209 IMSG_GETNAMEINFO, 210 211 IMSG_CERT_INIT, 212 IMSG_CERT_CERTIFICATE, 213 IMSG_CERT_VERIFY, 214 215 IMSG_SETUP_KEY, 216 IMSG_SETUP_PEER, 217 IMSG_SETUP_DONE, 218 219 IMSG_CONF_START, 220 IMSG_CONF_END, 221 222 IMSG_STAT_INCREMENT, 223 IMSG_STAT_DECREMENT, 224 IMSG_STAT_SET, 225 226 IMSG_LKA_AUTHENTICATE, 227 IMSG_LKA_OPEN_FORWARD, 228 IMSG_LKA_ENVELOPE_SUBMIT, 229 IMSG_LKA_ENVELOPE_COMMIT, 230 231 IMSG_QUEUE_DELIVER, 232 IMSG_QUEUE_DELIVERY_OK, 233 IMSG_QUEUE_DELIVERY_TEMPFAIL, 234 IMSG_QUEUE_DELIVERY_PERMFAIL, 235 IMSG_QUEUE_DELIVERY_LOOP, 236 IMSG_QUEUE_DISCOVER_EVPID, 237 IMSG_QUEUE_DISCOVER_MSGID, 238 IMSG_QUEUE_ENVELOPE_ACK, 239 IMSG_QUEUE_ENVELOPE_COMMIT, 240 IMSG_QUEUE_ENVELOPE_REMOVE, 241 IMSG_QUEUE_ENVELOPE_SCHEDULE, 242 IMSG_QUEUE_ENVELOPE_SUBMIT, 243 IMSG_QUEUE_HOLDQ_HOLD, 244 IMSG_QUEUE_HOLDQ_RELEASE, 245 IMSG_QUEUE_MESSAGE_COMMIT, 246 IMSG_QUEUE_MESSAGE_ROLLBACK, 247 IMSG_QUEUE_SMTP_SESSION, 248 IMSG_QUEUE_TRANSFER, 249 250 IMSG_MDA_DELIVERY_OK, 251 IMSG_MDA_DELIVERY_TEMPFAIL, 252 IMSG_MDA_DELIVERY_PERMFAIL, 253 IMSG_MDA_DELIVERY_LOOP, 254 IMSG_MDA_DELIVERY_HOLD, 255 IMSG_MDA_DONE, 256 IMSG_MDA_FORK, 257 IMSG_MDA_HOLDQ_RELEASE, 258 IMSG_MDA_LOOKUP_USERINFO, 259 IMSG_MDA_KILL, 260 IMSG_MDA_OPEN_MESSAGE, 261 262 IMSG_MTA_DELIVERY_OK, 263 IMSG_MTA_DELIVERY_TEMPFAIL, 264 IMSG_MTA_DELIVERY_PERMFAIL, 265 IMSG_MTA_DELIVERY_LOOP, 266 IMSG_MTA_DELIVERY_HOLD, 267 IMSG_MTA_DNS_HOST, 268 IMSG_MTA_DNS_HOST_END, 269 IMSG_MTA_DNS_MX, 270 IMSG_MTA_DNS_MX_PREFERENCE, 271 IMSG_MTA_HOLDQ_RELEASE, 272 IMSG_MTA_LOOKUP_CREDENTIALS, 273 IMSG_MTA_LOOKUP_SOURCE, 274 IMSG_MTA_LOOKUP_HELO, 275 IMSG_MTA_LOOKUP_SMARTHOST, 276 IMSG_MTA_OPEN_MESSAGE, 277 IMSG_MTA_SCHEDULE, 278 279 IMSG_SCHED_ENVELOPE_BOUNCE, 280 IMSG_SCHED_ENVELOPE_DELIVER, 281 IMSG_SCHED_ENVELOPE_EXPIRE, 282 IMSG_SCHED_ENVELOPE_INJECT, 283 IMSG_SCHED_ENVELOPE_REMOVE, 284 IMSG_SCHED_ENVELOPE_TRANSFER, 285 286 IMSG_SMTP_AUTHENTICATE, 287 IMSG_SMTP_MESSAGE_COMMIT, 288 IMSG_SMTP_MESSAGE_CREATE, 289 IMSG_SMTP_MESSAGE_ROLLBACK, 290 IMSG_SMTP_MESSAGE_OPEN, 291 IMSG_SMTP_CHECK_SENDER, 292 IMSG_SMTP_EXPAND_RCPT, 293 IMSG_SMTP_LOOKUP_HELO, 294 295 IMSG_SMTP_REQ_CONNECT, 296 IMSG_SMTP_REQ_HELO, 297 IMSG_SMTP_REQ_MAIL, 298 IMSG_SMTP_REQ_RCPT, 299 IMSG_SMTP_REQ_DATA, 300 IMSG_SMTP_REQ_EOM, 301 IMSG_SMTP_EVENT_RSET, 302 IMSG_SMTP_EVENT_COMMIT, 303 IMSG_SMTP_EVENT_ROLLBACK, 304 IMSG_SMTP_EVENT_DISCONNECT, 305 306 IMSG_LKA_PROCESSOR_FORK, 307 308 IMSG_REPORT_SMTP_LINK_CONNECT, 309 IMSG_REPORT_SMTP_LINK_DISCONNECT, 310 IMSG_REPORT_SMTP_LINK_IDENTIFY, 311 IMSG_REPORT_SMTP_LINK_TLS, 312 IMSG_REPORT_SMTP_TX_BEGIN, 313 IMSG_REPORT_SMTP_TX_MAIL, 314 IMSG_REPORT_SMTP_TX_RCPT, 315 IMSG_REPORT_SMTP_TX_ENVELOPE, 316 IMSG_REPORT_SMTP_TX_DATA, 317 IMSG_REPORT_SMTP_TX_COMMIT, 318 IMSG_REPORT_SMTP_TX_ROLLBACK, 319 IMSG_REPORT_SMTP_PROTOCOL_CLIENT, 320 IMSG_REPORT_SMTP_PROTOCOL_SERVER, 321 IMSG_REPORT_SMTP_FILTER_RESPONSE, 322 323 IMSG_FILTER_SMTP_BEGIN, 324 IMSG_FILTER_SMTP_END, 325 IMSG_FILTER_SMTP_PROTOCOL, 326 IMSG_FILTER_SMTP_DATA_BEGIN, 327 IMSG_FILTER_SMTP_DATA_END, 328 329 IMSG_CA_PRIVENC, 330 IMSG_CA_PRIVDEC 331}; 332 333enum smtp_proc_type { 334 PROC_PARENT = 0, 335 PROC_LKA, 336 PROC_QUEUE, 337 PROC_CONTROL, 338 PROC_SCHEDULER, 339 PROC_PONY, 340 PROC_CA, 341 PROC_PROCESSOR, 342 PROC_CLIENT, 343}; 344 345enum table_type { 346 T_NONE = 0, 347 T_DYNAMIC = 0x01, /* table with external source */ 348 T_LIST = 0x02, /* table holding a list */ 349 T_HASH = 0x04, /* table holding a hash table */ 350}; 351 352struct table { 353 char t_name[LINE_MAX]; 354 enum table_type t_type; 355 char t_config[PATH_MAX]; 356 357 void *t_handle; 358 struct table_backend *t_backend; 359}; 360 361struct table_backend { 362 const char *name; 363 const unsigned int services; 364 int (*config)(struct table *); 365 int (*add)(struct table *, const char *, const char *); 366 void (*dump)(struct table *); 367 int (*open)(struct table *); 368 int (*update)(struct table *); 369 void (*close)(struct table *); 370 int (*lookup)(struct table *, enum table_service, const char *, char **); 371 int (*fetch)(struct table *, enum table_service, char **); 372}; 373 374 375enum bounce_type { 376 B_FAILED, 377 B_DELAYED, 378 B_DELIVERED 379}; 380 381enum dsn_ret { 382 DSN_RETFULL = 1, 383 DSN_RETHDRS 384}; 385 386struct delivery_bounce { 387 enum bounce_type type; 388 time_t delay; 389 time_t ttl; 390 enum dsn_ret dsn_ret; 391 int mta_without_dsn; 392}; 393 394enum expand_type { 395 EXPAND_INVALID, 396 EXPAND_USERNAME, 397 EXPAND_FILENAME, 398 EXPAND_FILTER, 399 EXPAND_INCLUDE, 400 EXPAND_ADDRESS, 401 EXPAND_ERROR, 402}; 403 404enum filter_phase { 405 FILTER_CONNECT, 406 FILTER_HELO, 407 FILTER_EHLO, 408 FILTER_STARTTLS, 409 FILTER_AUTH, 410 FILTER_MAIL_FROM, 411 FILTER_RCPT_TO, 412 FILTER_DATA, 413 FILTER_DATA_LINE, 414 FILTER_RSET, 415 FILTER_QUIT, 416 FILTER_NOOP, 417 FILTER_HELP, 418 FILTER_WIZ, 419 FILTER_COMMIT, 420 FILTER_PHASES_COUNT /* must be last */ 421}; 422 423struct expandnode { 424 RB_ENTRY(expandnode) entry; 425 TAILQ_ENTRY(expandnode) tq_entry; 426 enum expand_type type; 427 int sameuser; 428 int realuser; 429 int forwarded; 430 struct rule *rule; 431 struct expandnode *parent; 432 unsigned int depth; 433 union { 434 /* 435 * user field handles both expansion user and system user 436 * so we MUST make it large enough to fit a mailaddr user 437 */ 438 char user[SMTPD_MAXLOCALPARTSIZE]; 439 char buffer[EXPAND_BUFFER]; 440 struct mailaddr mailaddr; 441 } u; 442 char subaddress[SMTPD_SUBADDRESS_SIZE]; 443}; 444 445struct expand { 446 RB_HEAD(expandtree, expandnode) tree; 447 TAILQ_HEAD(xnodes, expandnode) *queue; 448 size_t nb_nodes; 449 struct rule *rule; 450 struct expandnode *parent; 451}; 452 453struct maddrnode { 454 TAILQ_ENTRY(maddrnode) entries; 455 struct mailaddr mailaddr; 456}; 457 458struct maddrmap { 459 TAILQ_HEAD(xmaddr, maddrnode) queue; 460}; 461 462#define DSN_SUCCESS 0x01 463#define DSN_FAILURE 0x02 464#define DSN_DELAY 0x04 465#define DSN_NEVER 0x08 466 467#define DSN_ENVID_LEN 100 468 469#define SMTPD_ENVELOPE_VERSION 3 470struct envelope { 471 TAILQ_ENTRY(envelope) entry; 472 473 char dispatcher[HOST_NAME_MAX+1]; 474 475 char tag[SMTPD_TAG_SIZE]; 476 477 uint32_t version; 478 uint64_t id; 479 enum envelope_flags flags; 480 481 char smtpname[HOST_NAME_MAX+1]; 482 char helo[HOST_NAME_MAX+1]; 483 char hostname[HOST_NAME_MAX+1]; 484 char errorline[LINE_MAX]; 485 struct sockaddr_storage ss; 486 487 struct mailaddr sender; 488 struct mailaddr rcpt; 489 struct mailaddr dest; 490 491 char mda_user[SMTPD_VUSERNAME_SIZE]; 492 char mda_subaddress[SMTPD_SUBADDRESS_SIZE]; 493 char mda_exec[LINE_MAX]; 494 495 enum delivery_type type; 496 union { 497 struct delivery_bounce bounce; 498 } agent; 499 500 uint16_t retry; 501 time_t creation; 502 time_t ttl; 503 time_t lasttry; 504 time_t nexttry; 505 time_t lastbounce; 506 507 struct mailaddr dsn_orcpt; 508 char dsn_envid[DSN_ENVID_LEN+1]; 509 uint8_t dsn_notify; 510 enum dsn_ret dsn_ret; 511 512 uint8_t esc_class; 513 uint8_t esc_code; 514}; 515 516struct listener { 517 uint16_t flags; 518 int fd; 519 struct sockaddr_storage ss; 520 in_port_t port; 521 struct timeval timeout; 522 struct event ev; 523 char filter_name[PATH_MAX]; 524 char pki_name[PATH_MAX]; 525 char ca_name[PATH_MAX]; 526 char tag[SMTPD_TAG_SIZE]; 527 char authtable[LINE_MAX]; 528 char hostname[HOST_NAME_MAX+1]; 529 char hostnametable[PATH_MAX]; 530 char sendertable[PATH_MAX]; 531 532 TAILQ_ENTRY(listener) entry; 533 534 int local; /* there must be a better way */ 535}; 536 537struct smtpd { 538 char sc_conffile[PATH_MAX]; 539 size_t sc_maxsize; 540 541#define SMTPD_OPT_VERBOSE 0x00000001 542#define SMTPD_OPT_NOACTION 0x00000002 543 uint32_t sc_opts; 544 545#define SMTPD_EXITING 0x00000001 /* unused */ 546#define SMTPD_MDA_PAUSED 0x00000002 547#define SMTPD_MTA_PAUSED 0x00000004 548#define SMTPD_SMTP_PAUSED 0x00000008 549#define SMTPD_MDA_BUSY 0x00000010 550#define SMTPD_MTA_BUSY 0x00000020 551#define SMTPD_BOUNCE_BUSY 0x00000040 552#define SMTPD_SMTP_DISABLED 0x00000080 553 uint32_t sc_flags; 554 555#define QUEUE_COMPRESSION 0x00000001 556#define QUEUE_ENCRYPTION 0x00000002 557#define QUEUE_EVPCACHE 0x00000004 558 uint32_t sc_queue_flags; 559 char *sc_queue_key; 560 size_t sc_queue_evpcache_size; 561 562 size_t sc_session_max_rcpt; 563 size_t sc_session_max_mails; 564 565 struct dict *sc_mda_wrappers; 566 size_t sc_mda_max_session; 567 size_t sc_mda_max_user_session; 568 size_t sc_mda_task_hiwat; 569 size_t sc_mda_task_lowat; 570 size_t sc_mda_task_release; 571 572 size_t sc_mta_max_deferred; 573 574 size_t sc_scheduler_max_inflight; 575 size_t sc_scheduler_max_evp_batch_size; 576 size_t sc_scheduler_max_msg_batch_size; 577 size_t sc_scheduler_max_schedule; 578 579 struct dict *sc_processors_dict; 580 581 int sc_ttl; 582#define MAX_BOUNCE_WARN 4 583 time_t sc_bounce_warn[MAX_BOUNCE_WARN]; 584 char sc_hostname[HOST_NAME_MAX+1]; 585 struct stat_backend *sc_stat; 586 struct compress_backend *sc_comp; 587 588 time_t sc_uptime; 589 590 /* This is a listener for a local socket used by smtp_enqueue(). */ 591 struct listener *sc_sock_listener; 592 593 TAILQ_HEAD(listenerlist, listener) *sc_listeners; 594 595 TAILQ_HEAD(rulelist, rule) *sc_rules; 596 597 598 struct dict *sc_filters_dict; 599 struct dict *sc_dispatchers; 600 struct dispatcher *sc_dispatcher_bounce; 601 602 struct dict *sc_ca_dict; 603 struct dict *sc_pki_dict; 604 struct dict *sc_ssl_dict; 605 606 struct dict *sc_tables_dict; /* keyed lookup */ 607 608 struct dict *sc_limits_dict; 609 610 char *sc_tls_ciphers; 611 612 char *sc_subaddressing_delim; 613}; 614 615#define TRACE_DEBUG 0x0001 616#define TRACE_IMSG 0x0002 617#define TRACE_IO 0x0004 618#define TRACE_SMTP 0x0008 619#define TRACE_FILTERS 0x0010 620#define TRACE_MTA 0x0020 621#define TRACE_BOUNCE 0x0040 622#define TRACE_SCHEDULER 0x0080 623#define TRACE_LOOKUP 0x0100 624#define TRACE_STAT 0x0200 625#define TRACE_RULES 0x0400 626#define TRACE_MPROC 0x0800 627#define TRACE_EXPAND 0x1000 628#define TRACE_TABLES 0x2000 629#define TRACE_QUEUE 0x4000 630 631#define PROFILE_TOSTAT 0x0001 632#define PROFILE_IMSG 0x0002 633#define PROFILE_QUEUE 0x0004 634 635struct forward_req { 636 uint64_t id; 637 uint8_t status; 638 639 char user[SMTPD_VUSERNAME_SIZE]; 640 uid_t uid; 641 gid_t gid; 642 char directory[PATH_MAX]; 643}; 644 645struct deliver { 646 char dispatcher[EXPAND_BUFFER]; 647 648 struct mailaddr sender; 649 struct mailaddr rcpt; 650 struct mailaddr dest; 651 652 char mda_subaddress[SMTPD_SUBADDRESS_SIZE]; 653 char mda_exec[LINE_MAX]; 654 655 struct userinfo userinfo; 656}; 657 658struct mta_host { 659 SPLAY_ENTRY(mta_host) entry; 660 struct sockaddr *sa; 661 char *ptrname; 662 int refcount; 663 size_t nconn; 664 time_t lastconn; 665 time_t lastptrquery; 666 667#define HOST_IGNORE 0x01 668 int flags; 669}; 670 671struct mta_mx { 672 TAILQ_ENTRY(mta_mx) entry; 673 struct mta_host *host; 674 int preference; 675}; 676 677struct mta_domain { 678 SPLAY_ENTRY(mta_domain) entry; 679 char *name; 680 int as_host; 681 TAILQ_HEAD(, mta_mx) mxs; 682 int mxstatus; 683 int refcount; 684 size_t nconn; 685 time_t lastconn; 686 time_t lastmxquery; 687}; 688 689struct mta_source { 690 SPLAY_ENTRY(mta_source) entry; 691 struct sockaddr *sa; 692 int refcount; 693 size_t nconn; 694 time_t lastconn; 695}; 696 697struct mta_connector { 698 struct mta_source *source; 699 struct mta_relay *relay; 700 701#define CONNECTOR_ERROR_FAMILY 0x0001 702#define CONNECTOR_ERROR_SOURCE 0x0002 703#define CONNECTOR_ERROR_MX 0x0004 704#define CONNECTOR_ERROR_ROUTE_NET 0x0008 705#define CONNECTOR_ERROR_ROUTE_SMTP 0x0010 706#define CONNECTOR_ERROR_ROUTE 0x0018 707#define CONNECTOR_ERROR_BLOCKED 0x0020 708#define CONNECTOR_ERROR 0x00ff 709 710#define CONNECTOR_LIMIT_HOST 0x0100 711#define CONNECTOR_LIMIT_ROUTE 0x0200 712#define CONNECTOR_LIMIT_SOURCE 0x0400 713#define CONNECTOR_LIMIT_RELAY 0x0800 714#define CONNECTOR_LIMIT_CONN 0x1000 715#define CONNECTOR_LIMIT_DOMAIN 0x2000 716#define CONNECTOR_LIMIT 0xff00 717 718#define CONNECTOR_NEW 0x10000 719#define CONNECTOR_WAIT 0x20000 720 int flags; 721 722 int refcount; 723 size_t nconn; 724 time_t lastconn; 725}; 726 727struct mta_route { 728 SPLAY_ENTRY(mta_route) entry; 729 uint64_t id; 730 struct mta_source *src; 731 struct mta_host *dst; 732#define ROUTE_NEW 0x01 733#define ROUTE_RUNQ 0x02 734#define ROUTE_KEEPALIVE 0x04 735#define ROUTE_DISABLED 0xf0 736#define ROUTE_DISABLED_NET 0x10 737#define ROUTE_DISABLED_SMTP 0x20 738 int flags; 739 int nerror; 740 int penalty; 741 int refcount; 742 size_t nconn; 743 time_t lastconn; 744 time_t lastdisc; 745 time_t lastpenalty; 746}; 747 748struct mta_limits { 749 size_t maxconn_per_host; 750 size_t maxconn_per_route; 751 size_t maxconn_per_source; 752 size_t maxconn_per_connector; 753 size_t maxconn_per_relay; 754 size_t maxconn_per_domain; 755 756 time_t conndelay_host; 757 time_t conndelay_route; 758 time_t conndelay_source; 759 time_t conndelay_connector; 760 time_t conndelay_relay; 761 time_t conndelay_domain; 762 763 time_t discdelay_route; 764 765 size_t max_mail_per_session; 766 time_t sessdelay_transaction; 767 time_t sessdelay_keepalive; 768 769 size_t max_failures_per_session; 770 771 int family; 772 773 int task_hiwat; 774 int task_lowat; 775 int task_release; 776}; 777 778struct mta_relay { 779 SPLAY_ENTRY(mta_relay) entry; 780 uint64_t id; 781 782 struct dispatcher *dispatcher; 783 struct mta_domain *domain; 784 struct mta_limits *limits; 785 int tls; 786 int flags; 787 char *backupname; 788 int backuppref; 789 char *sourcetable; 790 uint16_t port; 791 char *pki_name; 792 char *ca_name; 793 char *authtable; 794 char *authlabel; 795 char *helotable; 796 char *heloname; 797 char *secret; 798 799 int state; 800 size_t ntask; 801 TAILQ_HEAD(, mta_task) tasks; 802 803 struct tree connectors; 804 size_t sourceloop; 805 time_t lastsource; 806 time_t nextsource; 807 808 int fail; 809 char *failstr; 810 811#define RELAY_WAIT_MX 0x01 812#define RELAY_WAIT_PREFERENCE 0x02 813#define RELAY_WAIT_SECRET 0x04 814#define RELAY_WAIT_LIMITS 0x08 815#define RELAY_WAIT_SOURCE 0x10 816#define RELAY_WAIT_CONNECTOR 0x20 817#define RELAY_WAIT_SMARTHOST 0x40 818#define RELAY_WAITMASK 0x7f 819 int status; 820 821 int refcount; 822 size_t nconn; 823 size_t nconn_ready; 824 time_t lastconn; 825}; 826 827struct mta_envelope { 828 TAILQ_ENTRY(mta_envelope) entry; 829 uint64_t id; 830 uint64_t session; 831 time_t creation; 832 char *smtpname; 833 char *dest; 834 char *rcpt; 835 struct mta_task *task; 836 int delivery; 837 838 int ext; 839 char *dsn_orcpt; 840 char dsn_envid[DSN_ENVID_LEN+1]; 841 uint8_t dsn_notify; 842 enum dsn_ret dsn_ret; 843 844 char status[LINE_MAX]; 845}; 846 847struct mta_task { 848 TAILQ_ENTRY(mta_task) entry; 849 struct mta_relay *relay; 850 uint32_t msgid; 851 TAILQ_HEAD(, mta_envelope) envelopes; 852 char *sender; 853}; 854 855struct passwd; 856 857struct queue_backend { 858 int (*init)(struct passwd *, int, const char *); 859}; 860 861struct compress_backend { 862 size_t (*compress_chunk)(void *, size_t, void *, size_t); 863 size_t (*uncompress_chunk)(void *, size_t, void *, size_t); 864 int (*compress_file)(FILE *, FILE *); 865 int (*uncompress_file)(FILE *, FILE *); 866}; 867 868/* auth structures */ 869enum auth_type { 870 AUTH_BSD, 871 AUTH_PWD, 872}; 873 874struct auth_backend { 875 int (*authenticate)(char *, char *); 876}; 877 878struct scheduler_backend { 879 int (*init)(const char *); 880 881 int (*insert)(struct scheduler_info *); 882 size_t (*commit)(uint32_t); 883 size_t (*rollback)(uint32_t); 884 885 int (*update)(struct scheduler_info *); 886 int (*delete)(uint64_t); 887 int (*hold)(uint64_t, uint64_t); 888 int (*release)(int, uint64_t, int); 889 890 int (*batch)(int, int*, size_t*, uint64_t*, int*); 891 892 size_t (*messages)(uint32_t, uint32_t *, size_t); 893 size_t (*envelopes)(uint64_t, struct evpstate *, size_t); 894 int (*schedule)(uint64_t); 895 int (*remove)(uint64_t); 896 int (*suspend)(uint64_t); 897 int (*resume)(uint64_t); 898 int (*query)(uint64_t); 899}; 900 901enum stat_type { 902 STAT_COUNTER, 903 STAT_TIMESTAMP, 904 STAT_TIMEVAL, 905 STAT_TIMESPEC, 906}; 907 908struct stat_value { 909 enum stat_type type; 910 union stat_v { 911 size_t counter; 912 time_t timestamp; 913 struct timeval tv; 914 struct timespec ts; 915 } u; 916}; 917 918#define STAT_KEY_SIZE 1024 919struct stat_kv { 920 void *iter; 921 char key[STAT_KEY_SIZE]; 922 struct stat_value val; 923}; 924 925struct stat_backend { 926 void (*init)(void); 927 void (*close)(void); 928 void (*increment)(const char *, size_t); 929 void (*decrement)(const char *, size_t); 930 void (*set)(const char *, const struct stat_value *); 931 int (*iter)(void **, char **, struct stat_value *); 932}; 933 934struct stat_digest { 935 time_t startup; 936 time_t timestamp; 937 938 size_t clt_connect; 939 size_t clt_disconnect; 940 941 size_t evp_enqueued; 942 size_t evp_dequeued; 943 944 size_t evp_expired; 945 size_t evp_removed; 946 size_t evp_bounce; 947 948 size_t dlv_ok; 949 size_t dlv_permfail; 950 size_t dlv_tempfail; 951 size_t dlv_loop; 952}; 953 954 955struct mproc { 956 pid_t pid; 957 char *name; 958 int proc; 959 void (*handler)(struct mproc *, struct imsg *); 960 struct imsgbuf imsgbuf; 961 962 char *m_buf; 963 size_t m_alloc; 964 size_t m_pos; 965 uint32_t m_type; 966 uint32_t m_peerid; 967 pid_t m_pid; 968 int m_fd; 969 970 int enable; 971 short events; 972 struct event ev; 973 void *data; 974}; 975 976struct msg { 977 const uint8_t *pos; 978 const uint8_t *end; 979}; 980 981extern enum smtp_proc_type smtpd_process; 982 983extern int tracing; 984extern int foreground_log; 985extern int profiling; 986 987extern struct mproc *p_control; 988extern struct mproc *p_parent; 989extern struct mproc *p_lka; 990extern struct mproc *p_queue; 991extern struct mproc *p_scheduler; 992extern struct mproc *p_pony; 993extern struct mproc *p_ca; 994 995extern struct smtpd *env; 996extern void (*imsg_callback)(struct mproc *, struct imsg *); 997 998struct imsgproc { 999 pid_t pid; 1000 struct event ev; 1001 struct imsgbuf *ibuf; 1002 char *path; 1003 char *name; 1004 void (*cb)(struct imsg *, void *); 1005 void *cb_arg; 1006}; 1007 1008/* inter-process structures */ 1009 1010struct bounce_req_msg { 1011 uint64_t evpid; 1012 time_t timestamp; 1013 struct delivery_bounce bounce; 1014}; 1015 1016enum dns_error { 1017 DNS_OK = 0, 1018 DNS_RETRY, 1019 DNS_EINVAL, 1020 DNS_ENONAME, 1021 DNS_ENOTFOUND, 1022}; 1023 1024enum lka_resp_status { 1025 LKA_OK, 1026 LKA_TEMPFAIL, 1027 LKA_PERMFAIL 1028}; 1029 1030struct processor { 1031 const char *command; 1032 const char *user; 1033 const char *group; 1034 const char *chroot; 1035}; 1036 1037enum filter_type { 1038 FILTER_TYPE_BUILTIN, 1039 FILTER_TYPE_PROC, 1040 FILTER_TYPE_CHAIN, 1041}; 1042 1043struct filter_config { 1044 char *name; 1045 enum filter_type filter_type; 1046 enum filter_phase phase; 1047 char *reject; 1048 char *disconnect; 1049 char *rewrite; 1050 char *proc; 1051 1052 const char **chain; 1053 size_t chain_size; 1054 struct dict chain_procs; 1055 1056 int8_t not_fcrdns; 1057 int8_t fcrdns; 1058 1059 int8_t not_rdns; 1060 int8_t rdns; 1061 1062 int8_t not_rdns_table; 1063 struct table *rdns_table; 1064 1065 int8_t not_rdns_regex; 1066 struct table *rdns_regex; 1067 1068 int8_t not_src_table; 1069 struct table *src_table; 1070 1071 int8_t not_src_regex; 1072 struct table *src_regex; 1073 1074 int8_t not_helo_table; 1075 struct table *helo_table; 1076 1077 int8_t not_helo_regex; 1078 struct table *helo_regex; 1079 1080 int8_t not_mail_from_table; 1081 struct table *mail_from_table; 1082 1083 int8_t not_mail_from_regex; 1084 struct table *mail_from_regex; 1085 1086 int8_t not_rcpt_to_table; 1087 struct table *rcpt_to_table; 1088 1089 int8_t not_rcpt_to_regex; 1090 struct table *rcpt_to_regex; 1091 1092}; 1093 1094enum filter_status { 1095 FILTER_PROCEED, 1096 FILTER_REWRITE, 1097 FILTER_REJECT, 1098 FILTER_DISCONNECT, 1099}; 1100 1101enum ca_resp_status { 1102 CA_OK, 1103 CA_FAIL 1104}; 1105 1106enum mda_resp_status { 1107 MDA_OK, 1108 MDA_TEMPFAIL, 1109 MDA_PERMFAIL 1110}; 1111 1112struct msg_walkinfo { 1113 struct event ev; 1114 uint32_t msgid; 1115 uint32_t peerid; 1116 size_t n_evp; 1117 void *data; 1118 int done; 1119}; 1120 1121 1122enum dispatcher_type { 1123 DISPATCHER_LOCAL, 1124 DISPATCHER_REMOTE, 1125 DISPATCHER_BOUNCE, 1126}; 1127 1128struct dispatcher_local { 1129 uint8_t requires_root; /* only for MBOX */ 1130 1131 uint8_t expand_only; 1132 uint8_t forward_only; 1133 1134 char *mda_wrapper; 1135 char *command; 1136 1137 char *table_alias; 1138 char *table_virtual; 1139 char *table_userbase; 1140 1141 char *user; 1142}; 1143 1144struct dispatcher_remote { 1145 char *helo; 1146 char *helo_source; 1147 1148 char *source; 1149 1150 char *ca; 1151 char *pki; 1152 1153 char *mail_from; 1154 1155 char *smarthost; 1156 char *auth; 1157 int tls_required; 1158 int tls_noverify; 1159 1160 int backup; 1161 char *backupmx; 1162}; 1163 1164struct dispatcher_bounce { 1165}; 1166 1167struct dispatcher { 1168 enum dispatcher_type type; 1169 union dispatcher_agent { 1170 struct dispatcher_local local; 1171 struct dispatcher_remote remote; 1172 struct dispatcher_bounce bounce; 1173 } u; 1174 1175 time_t ttl; 1176}; 1177 1178struct rule { 1179 TAILQ_ENTRY(rule) r_entry; 1180 1181 uint8_t reject; 1182 1183 int8_t flag_tag; 1184 int8_t flag_from; 1185 int8_t flag_for; 1186 int8_t flag_from_rdns; 1187 int8_t flag_from_socket; 1188 1189 int8_t flag_tag_regex; 1190 int8_t flag_from_regex; 1191 int8_t flag_for_regex; 1192 1193 int8_t flag_smtp_helo; 1194 int8_t flag_smtp_starttls; 1195 int8_t flag_smtp_auth; 1196 int8_t flag_smtp_mail_from; 1197 int8_t flag_smtp_rcpt_to; 1198 1199 int8_t flag_smtp_helo_regex; 1200 int8_t flag_smtp_starttls_regex; 1201 int8_t flag_smtp_auth_regex; 1202 int8_t flag_smtp_mail_from_regex; 1203 int8_t flag_smtp_rcpt_to_regex; 1204 1205 1206 char *table_tag; 1207 char *table_from; 1208 char *table_for; 1209 1210 char *table_smtp_helo; 1211 char *table_smtp_auth; 1212 char *table_smtp_mail_from; 1213 char *table_smtp_rcpt_to; 1214 1215 char *dispatcher; 1216}; 1217 1218 1219/* aliases.c */ 1220int aliases_get(struct expand *, const char *); 1221int aliases_virtual_get(struct expand *, const struct mailaddr *); 1222int alias_parse(struct expandnode *, const char *); 1223 1224 1225/* auth.c */ 1226struct auth_backend *auth_backend_lookup(enum auth_type); 1227 1228 1229/* bounce.c */ 1230void bounce_add(uint64_t); 1231void bounce_fd(int); 1232 1233 1234/* ca.c */ 1235int ca(void); 1236int ca_X509_verify(void *, void *, const char *, const char *, const char **); 1237void ca_imsg(struct mproc *, struct imsg *); 1238void ca_init(void); 1239void ca_engine_init(void); 1240 1241 1242/* cert.c */ 1243int cert_init(const char *, int, 1244 void (*)(void *, int, const char *, const void *, size_t), void *); 1245int cert_verify(const void *, const char *, int, void (*)(void *, int), void *); 1246void cert_dispatch_request(struct mproc *, struct imsg *); 1247void cert_dispatch_result(struct mproc *, struct imsg *); 1248 1249 1250/* compress_backend.c */ 1251struct compress_backend *compress_backend_lookup(const char *); 1252size_t compress_chunk(void *, size_t, void *, size_t); 1253size_t uncompress_chunk(void *, size_t, void *, size_t); 1254int compress_file(FILE *, FILE *); 1255int uncompress_file(FILE *, FILE *); 1256 1257/* config.c */ 1258#define PURGE_LISTENERS 0x01 1259#define PURGE_TABLES 0x02 1260#define PURGE_RULES 0x04 1261#define PURGE_PKI 0x08 1262#define PURGE_PKI_KEYS 0x10 1263#define PURGE_DISPATCHERS 0x20 1264#define PURGE_EVERYTHING 0xff 1265struct smtpd *config_default(void); 1266void purge_config(uint8_t); 1267void config_process(enum smtp_proc_type); 1268void config_peer(enum smtp_proc_type); 1269 1270 1271/* control.c */ 1272int control(void); 1273int control_create_socket(void); 1274 1275 1276/* crypto.c */ 1277int crypto_setup(const char *, size_t); 1278int crypto_encrypt_file(FILE *, FILE *); 1279int crypto_decrypt_file(FILE *, FILE *); 1280size_t crypto_encrypt_buffer(const char *, size_t, char *, size_t); 1281size_t crypto_decrypt_buffer(const char *, size_t, char *, size_t); 1282 1283 1284/* dns.c */ 1285void dns_imsg(struct mproc *, struct imsg *); 1286 1287 1288/* enqueue.c */ 1289int enqueue(int, char **, FILE *); 1290 1291 1292/* envelope.c */ 1293void envelope_set_errormsg(struct envelope *, char *, ...); 1294void envelope_set_esc_class(struct envelope *, enum enhanced_status_class); 1295void envelope_set_esc_code(struct envelope *, enum enhanced_status_code); 1296int envelope_load_buffer(struct envelope *, const char *, size_t); 1297int envelope_dump_buffer(const struct envelope *, char *, size_t); 1298 1299 1300/* expand.c */ 1301int expand_cmp(struct expandnode *, struct expandnode *); 1302void expand_insert(struct expand *, struct expandnode *); 1303struct expandnode *expand_lookup(struct expand *, struct expandnode *); 1304void expand_clear(struct expand *); 1305void expand_free(struct expand *); 1306int expand_line(struct expand *, const char *, int); 1307int expand_to_text(struct expand *, char *, size_t); 1308RB_PROTOTYPE(expandtree, expandnode, nodes, expand_cmp); 1309 1310 1311/* forward.c */ 1312int forwards_get(int, struct expand *); 1313 1314 1315/* imsgproc.c */ 1316void imsgproc_init(void); 1317struct imsgproc *imsgproc_fork(const char *, const char *, 1318 void (*)(struct imsg *, void *), void *); 1319void imsgproc_set_read(struct imsgproc *); 1320void imsgproc_set_write(struct imsgproc *); 1321void imsgproc_set_read_write(struct imsgproc *); 1322void imsgproc_reset_callback(struct imsgproc *, void (*)(struct imsg *, void *), void *); 1323 1324 1325/* limit.c */ 1326void limit_mta_set_defaults(struct mta_limits *); 1327int limit_mta_set(struct mta_limits *, const char*, int64_t); 1328 1329 1330/* lka.c */ 1331int lka(void); 1332 1333 1334/* lka_proc.c */ 1335int lka_proc_ready(void); 1336void lka_proc_forked(const char *, int); 1337struct io *lka_proc_get_io(const char *); 1338 1339 1340/* lka_report.c */ 1341void lka_report_init(void); 1342void lka_report_register_hook(const char *, const char *); 1343void lka_report_smtp_link_connect(const char *, struct timeval *, uint64_t, const char *, int, 1344 const struct sockaddr_storage *, const struct sockaddr_storage *); 1345void lka_report_smtp_link_disconnect(const char *, struct timeval *, uint64_t); 1346void lka_report_smtp_link_identify(const char *, struct timeval *, uint64_t, const char *); 1347void lka_report_smtp_link_tls(const char *, struct timeval *, uint64_t, const char *); 1348void lka_report_smtp_tx_begin(const char *, struct timeval *, uint64_t, uint32_t); 1349void lka_report_smtp_tx_mail(const char *, struct timeval *, uint64_t, uint32_t, const char *, int); 1350void lka_report_smtp_tx_rcpt(const char *, struct timeval *, uint64_t, uint32_t, const char *, int); 1351void lka_report_smtp_tx_envelope(const char *, struct timeval *, uint64_t, uint32_t, uint64_t); 1352void lka_report_smtp_tx_commit(const char *, struct timeval *, uint64_t, uint32_t, size_t); 1353void lka_report_smtp_tx_data(const char *, struct timeval *, uint64_t, uint32_t, int); 1354void lka_report_smtp_tx_rollback(const char *, struct timeval *, uint64_t, uint32_t); 1355void lka_report_smtp_protocol_client(const char *, struct timeval *, uint64_t, const char *); 1356void lka_report_smtp_protocol_server(const char *, struct timeval *, uint64_t, const char *); 1357void lka_report_smtp_filter_response(const char *, struct timeval *, uint64_t, 1358 int, int, const char *); 1359 1360 1361/* lka_filter.c */ 1362void lka_filter_init(void); 1363void lka_filter_register_hook(const char *, const char *); 1364void lka_filter_ready(void); 1365int lka_filter_proc_in_session(uint64_t, const char *); 1366void lka_filter_begin(uint64_t, const char *, const struct sockaddr_storage *, const struct sockaddr_storage *, const char *, int); 1367void lka_filter_end(uint64_t); 1368void lka_filter_protocol(uint64_t, enum filter_phase, const char *); 1369void lka_filter_data_begin(uint64_t); 1370void lka_filter_data_end(uint64_t); 1371int lka_filter_response(uint64_t, const char *, const char *); 1372 1373 1374/* lka_session.c */ 1375void lka_session(uint64_t, struct envelope *); 1376void lka_session_forward_reply(struct forward_req *, int); 1377 1378 1379/* log.c */ 1380void vlog(int, const char *, va_list); 1381void logit(int, const char *, ...) __attribute__((format (printf, 2, 3))); 1382 1383 1384/* mda.c */ 1385void mda_postfork(void); 1386void mda_postprivdrop(void); 1387void mda_imsg(struct mproc *, struct imsg *); 1388 1389 1390/* mda_unpriv.c */ 1391void mda_unpriv(struct dispatcher *, struct deliver *, const char *, const char *); 1392 1393 1394/* mda_variables.c */ 1395ssize_t mda_expand_format(char *, size_t, const struct deliver *, 1396 const struct userinfo *, const char *); 1397 1398 1399/* makemap.c */ 1400int makemap(int, int, char **); 1401 1402 1403/* mailaddr.c */ 1404int mailaddr_line(struct maddrmap *, const char *); 1405void maddrmap_init(struct maddrmap *); 1406void maddrmap_insert(struct maddrmap *, struct maddrnode *); 1407void maddrmap_free(struct maddrmap *); 1408 1409 1410/* mproc.c */ 1411int mproc_fork(struct mproc *, const char*, char **); 1412void mproc_init(struct mproc *, int); 1413void mproc_clear(struct mproc *); 1414void mproc_enable(struct mproc *); 1415void mproc_disable(struct mproc *); 1416void mproc_event_add(struct mproc *); 1417void m_compose(struct mproc *, uint32_t, uint32_t, pid_t, int, void *, size_t); 1418void m_composev(struct mproc *, uint32_t, uint32_t, pid_t, int, 1419 const struct iovec *, int); 1420void m_forward(struct mproc *, struct imsg *); 1421void m_create(struct mproc *, uint32_t, uint32_t, pid_t, int); 1422void m_add(struct mproc *, const void *, size_t); 1423void m_add_int(struct mproc *, int); 1424void m_add_u32(struct mproc *, uint32_t); 1425void m_add_size(struct mproc *, size_t); 1426void m_add_time(struct mproc *, time_t); 1427void m_add_timeval(struct mproc *, struct timeval *tv); 1428void m_add_string(struct mproc *, const char *); 1429void m_add_data(struct mproc *, const void *, size_t); 1430void m_add_evpid(struct mproc *, uint64_t); 1431void m_add_msgid(struct mproc *, uint32_t); 1432void m_add_id(struct mproc *, uint64_t); 1433void m_add_sockaddr(struct mproc *, const struct sockaddr *); 1434void m_add_mailaddr(struct mproc *, const struct mailaddr *); 1435void m_add_envelope(struct mproc *, const struct envelope *); 1436void m_add_params(struct mproc *, struct dict *); 1437void m_close(struct mproc *); 1438void m_flush(struct mproc *); 1439 1440void m_msg(struct msg *, struct imsg *); 1441int m_is_eom(struct msg *); 1442void m_end(struct msg *); 1443void m_get_int(struct msg *, int *); 1444void m_get_size(struct msg *, size_t *); 1445void m_get_u32(struct msg *, uint32_t *); 1446void m_get_time(struct msg *, time_t *); 1447void m_get_timeval(struct msg *, struct timeval *); 1448void m_get_string(struct msg *, const char **); 1449void m_get_data(struct msg *, const void **, size_t *); 1450void m_get_evpid(struct msg *, uint64_t *); 1451void m_get_msgid(struct msg *, uint32_t *); 1452void m_get_id(struct msg *, uint64_t *); 1453void m_get_sockaddr(struct msg *, struct sockaddr *); 1454void m_get_mailaddr(struct msg *, struct mailaddr *); 1455void m_get_envelope(struct msg *, struct envelope *); 1456void m_get_params(struct msg *, struct dict *); 1457void m_clear_params(struct dict *); 1458 1459 1460/* mta.c */ 1461void mta_postfork(void); 1462void mta_postprivdrop(void); 1463void mta_imsg(struct mproc *, struct imsg *); 1464void mta_route_ok(struct mta_relay *, struct mta_route *); 1465void mta_route_error(struct mta_relay *, struct mta_route *); 1466void mta_route_down(struct mta_relay *, struct mta_route *); 1467void mta_route_collect(struct mta_relay *, struct mta_route *); 1468void mta_source_error(struct mta_relay *, struct mta_route *, const char *); 1469void mta_delivery_log(struct mta_envelope *, const char *, const char *, int, const char *); 1470void mta_delivery_notify(struct mta_envelope *); 1471struct mta_task *mta_route_next_task(struct mta_relay *, struct mta_route *); 1472const char *mta_host_to_text(struct mta_host *); 1473const char *mta_relay_to_text(struct mta_relay *); 1474 1475 1476/* mta_session.c */ 1477void mta_session(struct mta_relay *, struct mta_route *); 1478void mta_session_imsg(struct mproc *, struct imsg *); 1479 1480 1481/* parse.y */ 1482int parse_config(struct smtpd *, const char *, int); 1483int cmdline_symset(char *); 1484 1485 1486/* queue.c */ 1487int queue(void); 1488 1489 1490/* queue_backend.c */ 1491uint32_t queue_generate_msgid(void); 1492uint64_t queue_generate_evpid(uint32_t); 1493int queue_init(const char *, int); 1494int queue_close(void); 1495int queue_message_create(uint32_t *); 1496int queue_message_delete(uint32_t); 1497int queue_message_commit(uint32_t); 1498int queue_message_fd_r(uint32_t); 1499int queue_message_fd_rw(uint32_t); 1500int queue_envelope_create(struct envelope *); 1501int queue_envelope_delete(uint64_t); 1502int queue_envelope_load(uint64_t, struct envelope *); 1503int queue_envelope_update(struct envelope *); 1504int queue_envelope_walk(struct envelope *); 1505int queue_message_walk(struct envelope *, uint32_t, int *, void **); 1506 1507 1508/* report_smtp.c */ 1509void report_smtp_link_connect(const char *, uint64_t, const char *, int, 1510 const struct sockaddr_storage *, const struct sockaddr_storage *); 1511void report_smtp_link_disconnect(const char *, uint64_t); 1512void report_smtp_link_identify(const char *, uint64_t, const char *); 1513void report_smtp_link_tls(const char *, uint64_t, const char *); 1514void report_smtp_tx_begin(const char *, uint64_t, uint32_t); 1515void report_smtp_tx_mail(const char *, uint64_t, uint32_t, const char *, int); 1516void report_smtp_tx_rcpt(const char *, uint64_t, uint32_t, const char *, int); 1517void report_smtp_tx_envelope(const char *, uint64_t, uint32_t, uint64_t); 1518void report_smtp_tx_data(const char *, uint64_t, uint32_t, int); 1519void report_smtp_tx_commit(const char *, uint64_t, uint32_t, size_t); 1520void report_smtp_tx_rollback(const char *, uint64_t, uint32_t); 1521void report_smtp_protocol_client(const char *, uint64_t, const char *); 1522void report_smtp_protocol_server(const char *, uint64_t, const char *); 1523void report_smtp_filter_response(const char *, uint64_t, int, int, const char *); 1524 1525 1526/* ruleset.c */ 1527struct rule *ruleset_match(const struct envelope *); 1528 1529 1530/* scheduler.c */ 1531int scheduler(void); 1532 1533 1534/* scheduler_bakend.c */ 1535struct scheduler_backend *scheduler_backend_lookup(const char *); 1536void scheduler_info(struct scheduler_info *, struct envelope *); 1537 1538 1539/* pony.c */ 1540int pony(void); 1541void pony_imsg(struct mproc *, struct imsg *); 1542 1543 1544/* resolver.c */ 1545void resolver_getaddrinfo(const char *, const char *, const struct addrinfo *, 1546 void(*)(void *, int, struct addrinfo*), void *); 1547void resolver_getnameinfo(const struct sockaddr *, int, 1548 void(*)(void *, int, const char *, const char *), void *); 1549void resolver_dispatch_request(struct mproc *, struct imsg *); 1550void resolver_dispatch_result(struct mproc *, struct imsg *); 1551 1552 1553/* smtp.c */ 1554void smtp_postfork(void); 1555void smtp_postprivdrop(void); 1556void smtp_imsg(struct mproc *, struct imsg *); 1557void smtp_configure(void); 1558void smtp_collect(void); 1559 1560 1561/* smtp_session.c */ 1562int smtp_session(struct listener *, int, const struct sockaddr_storage *, 1563 const char *, struct io *); 1564void smtp_session_imsg(struct mproc *, struct imsg *); 1565 1566 1567/* smtpf_session.c */ 1568int smtpf_session(struct listener *, int, const struct sockaddr_storage *, 1569 const char *); 1570void smtpf_session_imsg(struct mproc *, struct imsg *); 1571 1572 1573/* smtpd.c */ 1574void imsg_dispatch(struct mproc *, struct imsg *); 1575const char *proc_name(enum smtp_proc_type); 1576const char *proc_title(enum smtp_proc_type); 1577const char *imsg_to_str(int); 1578void log_imsg(int, int, struct imsg *); 1579int fork_proc_backend(const char *, const char *, const char *); 1580 1581 1582/* ssl_smtpd.c */ 1583void *ssl_mta_init(void *, char *, off_t, const char *); 1584void *ssl_smtp_init(void *, int); 1585 1586 1587/* stat_backend.c */ 1588struct stat_backend *stat_backend_lookup(const char *); 1589void stat_increment(const char *, size_t); 1590void stat_decrement(const char *, size_t); 1591void stat_set(const char *, const struct stat_value *); 1592struct stat_value *stat_counter(size_t); 1593struct stat_value *stat_timestamp(time_t); 1594struct stat_value *stat_timeval(struct timeval *); 1595struct stat_value *stat_timespec(struct timespec *); 1596 1597 1598/* table.c */ 1599struct table *table_find(struct smtpd *, const char *); 1600struct table *table_create(struct smtpd *, const char *, const char *, 1601 const char *); 1602int table_config(struct table *); 1603int table_open(struct table *); 1604int table_update(struct table *); 1605void table_close(struct table *); 1606void table_dump(struct table *); 1607int table_check_use(struct table *, uint32_t, uint32_t); 1608int table_check_type(struct table *, uint32_t); 1609int table_check_service(struct table *, uint32_t); 1610int table_match(struct table *, enum table_service, const char *); 1611int table_lookup(struct table *, enum table_service, const char *, 1612 union lookup *); 1613int table_fetch(struct table *, enum table_service, union lookup *); 1614void table_destroy(struct smtpd *, struct table *); 1615void table_add(struct table *, const char *, const char *); 1616int table_domain_match(const char *, const char *); 1617int table_netaddr_match(const char *, const char *); 1618int table_mailaddr_match(const char *, const char *); 1619int table_regex_match(const char *, const char *); 1620void table_open_all(struct smtpd *); 1621void table_dump_all(struct smtpd *); 1622void table_close_all(struct smtpd *); 1623 1624 1625/* to.c */ 1626int email_to_mailaddr(struct mailaddr *, char *); 1627int text_to_netaddr(struct netaddr *, const char *); 1628int text_to_mailaddr(struct mailaddr *, const char *); 1629int text_to_relayhost(struct relayhost *, const char *); 1630int text_to_userinfo(struct userinfo *, const char *); 1631int text_to_credentials(struct credentials *, const char *); 1632int text_to_expandnode(struct expandnode *, const char *); 1633uint64_t text_to_evpid(const char *); 1634uint32_t text_to_msgid(const char *); 1635const char *sa_to_text(const struct sockaddr *); 1636const char *ss_to_text(const struct sockaddr_storage *); 1637const char *time_to_text(time_t); 1638const char *duration_to_text(time_t); 1639const char *rule_to_text(struct rule *); 1640const char *sockaddr_to_text(struct sockaddr *); 1641const char *mailaddr_to_text(const struct mailaddr *); 1642const char *expandnode_to_text(struct expandnode *); 1643 1644 1645/* util.c */ 1646typedef struct arglist arglist; 1647struct arglist { 1648 char **list; 1649 uint num; 1650 uint nalloc; 1651}; 1652void addargs(arglist *, char *, ...) 1653 __attribute__((format(printf, 2, 3))); 1654int bsnprintf(char *, size_t, const char *, ...) 1655 __attribute__((format (printf, 3, 4))); 1656int mkdirs(char *, mode_t); 1657int safe_fclose(FILE *); 1658int hostname_match(const char *, const char *); 1659int mailaddr_match(const struct mailaddr *, const struct mailaddr *); 1660int valid_localpart(const char *); 1661int valid_domainpart(const char *); 1662int valid_smtp_response(const char *); 1663int secure_file(int, char *, char *, uid_t, int); 1664int lowercase(char *, const char *, size_t); 1665void xlowercase(char *, const char *, size_t); 1666int uppercase(char *, const char *, size_t); 1667uint64_t generate_uid(void); 1668int availdesc(void); 1669int ckdir(const char *, mode_t, uid_t, gid_t, int); 1670int rmtree(char *, int); 1671int mvpurge(char *, char *); 1672int mktmpfile(void); 1673const char *parse_smtp_response(char *, size_t, char **, int *); 1674int xasprintf(char **, const char *, ...); 1675void *xmalloc(size_t); 1676void *xcalloc(size_t, size_t); 1677char *xstrdup(const char *); 1678void *xmemdup(const void *, size_t); 1679char *strip(char *); 1680int io_xprint(struct io *, const char *); 1681int io_xprintf(struct io *, const char *, ...); 1682void log_envelope(const struct envelope *, const char *, const char *, 1683 const char *); 1684int session_socket_error(int); 1685int getmailname(char *, size_t); 1686int base64_encode(unsigned char const *, size_t, char *, size_t); 1687int base64_decode(char const *, unsigned char *, size_t); 1688 1689void log_trace_verbose(int); 1690void log_trace(int, const char *, ...) 1691 __attribute__((format (printf, 2, 3))); 1692 1693/* waitq.c */ 1694int waitq_wait(void *, void (*)(void *, void *, void *), void *); 1695void waitq_run(void *, void *); 1696 1697 1698/* runq.c */ 1699struct runq; 1700 1701int runq_init(struct runq **, void (*)(struct runq *, void *)); 1702int runq_schedule(struct runq *, time_t, void (*)(struct runq *, void *), void *); 1703int runq_delay(struct runq *, unsigned int, void (*)(struct runq *, void *), void *); 1704int runq_cancel(struct runq *, void (*)(struct runq *, void *), void *); 1705int runq_pending(struct runq *, void (*)(struct runq *, void *), void *, time_t *); 1706int runq_next(struct runq *, void (**)(struct runq *, void *), void **, time_t *); 1707