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