Expand PMF_FN_* macros.
[netbsd-mini2440.git] / external / ibm-public / postfix / dist / src / global / scache.h
blob60b93c326281d9ae6ee9445d7be4bcf27ca339c6
1 /* $NetBSD$ */
3 #ifndef _SCACHE_H_INCLUDED_
4 #define _SCACHE_H_INCLUDED_
6 /*++
7 /* NAME
8 /* scache 3h
9 /* SUMMARY
10 /* generic session cache API
11 /* SYNOPSIS
12 /* #include <scache.h>
13 /* DESCRIPTION
14 /* .nf
17 * Utility library.
19 #include <vstring.h>
21 typedef struct SCACHE SCACHE;
22 typedef struct SCACHE_SIZE SCACHE_SIZE;
25 * In order to cache a session, we specify:
27 * - TTL for this session.
29 * - File descriptor.
31 * - Transport name and physical endpoint. The transport name must be included,
32 * because fall-back destinations can be transport-dependent, and routing
33 * for a given destination may be context dependent.
35 * In the case of SMTP, the physical endpoint is the numerical IP address and
36 * TCP port.
38 * - Application-specific endpoint properties.
40 * In the case of SMTP, the properties specify the ESMTP features advertised by
41 * the server.
43 * Note: with message delivery transports that have only one endpoint per
44 * logical destination, the above is the only information that needs to be
45 * maintained in a connection cache.
47 typedef void (*SCACHE_SAVE_ENDP_FN) (SCACHE *, int, const char *, const char *, int);
48 typedef int (*SCACHE_FIND_ENDP_FN) (SCACHE *, const char *, VSTRING *);
51 * The following information is stored in order to make a binding from
52 * logical destination to physical destination. One logical destination can
53 * have multiple physical destinations (and one physical destination can
54 * have multiple sessions).
56 * - TTL for this binding.
58 * - Transport name and logical destination.
60 * In the case of SMTP: the next-hop (NOT: fall-back) destination domain and
61 * destination network port. It is not useful to create a link for an
62 * address literal (but it is not harmful either: it just wastes a few
63 * bits). This information specifies the destination domain in [] if no MX
64 * lookup is done.
66 * - Application-specific properties.
68 * In case the of SMTP, the properties specify a) whether a physical endpoint
69 * is best mx host with respect to a logical or fall-back destination (this
70 * information is needed by the loop detection code in smtp_proto.c).
72 * - Transport name and physical endpoint (see above).
74 * Note 1: there is no need to store the binding's MX preference or equivalent
75 * with respect to the logical destination; a client should store only the
76 * first successful session for a given delivery request (otherwise the
77 * client would keep talking to a less preferred server after the cached
78 * connection for a more preferred server expires). After a failed delivery,
79 * the client should not attempt to cache follow-up sessions with less
80 * preferred endpoints under the same logical destination.
82 * Note 2: logical to physical bindings exist independently from cached
83 * sessions. The two types of information have independent TTLs; creation
84 * and destruction proceed independently. Thus, a logical to physical
85 * binding can refer to an endpoint for which all cached connections are
86 * occupied or expired.
88 typedef void (*SCACHE_SAVE_DEST_FN) (SCACHE *, int, const char *, const char *, const char *);
89 typedef int (*SCACHE_FIND_DEST_FN) (SCACHE *, const char *, VSTRING *, VSTRING *);
92 * Session cache statistics. These are the actual numbers at a specific
93 * point in time.
95 struct SCACHE_SIZE {
96 int dest_count; /* Nr of destination names */
97 int endp_count; /* Nr of endpoint adresses */
98 int sess_count; /* Nr of cached sessions */
102 * Generic session cache object. Actual session cache objects are derived
103 * types with some additional, cache dependent, private information.
105 struct SCACHE {
106 SCACHE_SAVE_ENDP_FN save_endp;
107 SCACHE_FIND_ENDP_FN find_endp;
108 SCACHE_SAVE_DEST_FN save_dest;
109 SCACHE_FIND_DEST_FN find_dest;
110 void (*size) (struct SCACHE *, SCACHE_SIZE *);
111 void (*free) (struct SCACHE *);
114 extern SCACHE *scache_single_create(void);
115 extern SCACHE *scache_clnt_create(const char *, int, int, int);
116 extern SCACHE *scache_multi_create(void);
118 #define scache_save_endp(scache, ttl, endp_label, endp_prop, fd) \
119 (scache)->save_endp((scache), (ttl), (endp_label), (endp_prop), (fd))
120 #define scache_find_endp(scache, endp_label, endp_prop) \
121 (scache)->find_endp((scache), (endp_label), (endp_prop))
122 #define scache_save_dest(scache, ttl, dest_label, dest_prop, endp_label) \
123 (scache)->save_dest((scache), (ttl), (dest_label), (dest_prop), (endp_label))
124 #define scache_find_dest(scache, dest_label, dest_prop, endp_prop) \
125 (scache)->find_dest((scache), (dest_label), (dest_prop), (endp_prop))
126 #define scache_size(scache, stats) (scache)->size((scache), (stats))
127 #define scache_free(scache) (scache)->free(scache)
130 * Cache types.
132 #define SCACHE_TYPE_SINGLE 1 /* single-instance cache */
133 #define SCACHE_TYPE_CLIENT 2 /* session cache client */
134 #define SCACHE_TYPE_MULTI 3 /* multi-instance cache */
137 * Client-server protocol.
139 #define SCACHE_REQ_FIND_ENDP "find_endp"
140 #define SCACHE_REQ_SAVE_ENDP "save_endp"
141 #define SCACHE_REQ_FIND_DEST "find_dest"
142 #define SCACHE_REQ_SAVE_DEST "save_dest"
145 * Session cache server status codes.
147 #define SCACHE_STAT_OK 0 /* request completed successfully */
148 #define SCACHE_STAT_BAD 1 /* malformed request */
149 #define SCACHE_STAT_FAIL 2 /* request completed unsuccessfully */
151 /* LICENSE
152 /* .ad
153 /* .fi
154 /* The Secure Mailer license must be distributed with this software.
155 /* AUTHOR(S)
156 /* Wietse Venema
157 /* IBM T.J. Watson Research
158 /* P.O. Box 704
159 /* Yorktown Heights, NY 10598, USA
160 /*--*/
162 #endif