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