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