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