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