Expand PMF_FN_* macros.
[netbsd-mini2440.git] / external / ibm-public / postfix / dist / src / global / dsn.h
blob719da0671d61e953eefac521ffaccadb5f7d5721
1 /* $NetBSD$ */
3 #ifndef _DSN_H_INCLUDED_
4 #define _DSN_H_INCLUDED_
6 /*++
7 /* NAME
8 /* dsn 3h
9 /* SUMMARY
10 /* RFC-compliant delivery status information
11 /* SYNOPSIS
12 /* #include <dsn.h>
13 /* DESCRIPTION
14 /* .nf
17 * External interface.
19 typedef struct {
20 const char *status; /* RFC 3463 status */
21 const char *action; /* Null / RFC 3464 action */
22 const char *reason; /* descriptive reason */
23 const char *dtype; /* Null / RFC 3464 diagnostic type */
24 const char *dtext; /* Null / RFC 3464 diagnostic code */
25 const char *mtype; /* Null / RFC 3464 MTA type */
26 const char *mname; /* Null / RFC 3464 remote MTA */
27 } DSN;
29 extern DSN *dsn_create(const char *, const char *, const char *, const char *,
30 const char *, const char *, const char *);
31 extern void dsn_free(DSN *);
33 #define DSN_ASSIGN(dsn, _status, _action, _reason, _dtype, _dtext, _mtype, _mname) \
34 (((dsn)->status = (_status)), \
35 ((dsn)->action = (_action)), \
36 ((dsn)->reason = (_reason)), \
37 ((dsn)->dtype = (_dtype)), \
38 ((dsn)->dtext = (_dtext)), \
39 ((dsn)->mtype = (_mtype)), \
40 ((dsn)->mname = (_mname)), \
41 (dsn))
43 #define DSN_SIMPLE(dsn, _status, _reason) \
44 (((dsn)->status = (_status)), \
45 ((dsn)->action = DSN_NO_ACTION), \
46 ((dsn)->reason = (_reason)), \
47 ((dsn)->dtype = DSN_NO_DTYPE), \
48 ((dsn)->dtext = DSN_NO_DTEXT), \
49 ((dsn)->mtype = DSN_NO_MTYPE), \
50 ((dsn)->mname = DSN_NO_MNAME), \
51 (dsn))
53 #define DSN_NO_ACTION ""
54 #define DSN_NO_DTYPE ""
55 #define DSN_NO_DTEXT ""
56 #define DSN_NO_MTYPE ""
57 #define DSN_NO_MNAME ""
60 * Early implementations represented unavailable information with null
61 * pointers. This resulted in code that is hard to maintain. We now use
62 * empty strings instead. This does not waste precious memory as long as we
63 * can represent empty strings efficiently by collapsing them.
65 * The only restriction left is that the status and reason are never null or
66 * empty; this is enforced by dsn_create() which is invoked by DSN_COPY().
67 * This complicates the server reply parsing code in the smtp(8) and lmtp(8)
68 * clients. they must never supply empty strings for these required fields.
70 #define DSN_COPY(dsn) \
71 dsn_create((dsn)->status, (dsn)->action, (dsn)->reason, \
72 (dsn)->dtype, (dsn)->dtext, \
73 (dsn)->mtype, (dsn)->mname)
75 /* LICENSE
76 /* .ad
77 /* .fi
78 /* The Secure Mailer license must be distributed with this software.
79 /* AUTHOR(S)
80 /* Wietse Venema
81 /* IBM T.J. Watson Research
82 /* P.O. Box 704
83 /* Yorktown Heights, NY 10598, USA
84 /*--*/
86 #endif