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