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