xref: /netbsd-src/external/ibm-public/postfix/dist/src/global/trace.c (revision 413d532bcc3f62d122e56d92e13ac64825a40baf)
1 /*	$NetBSD: trace.c,v 1.1.1.1 2009/06/23 10:08:48 tron Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	trace 3
6 /* SUMMARY
7 /*	user requested delivery tracing
8 /* SYNOPSIS
9 /*	#include <trace.h>
10 /*
11 /*	int	trace_append(flags, id, stats, rcpt, relay, dsn)
12 /*	int	flags;
13 /*	const char *id;
14 /*	MSG_STATS *stats;
15 /*	RECIPIENT *rcpt;
16 /*	const char *relay;
17 /*	DSN	*dsn;
18 /*
19 /*	int     trace_flush(flags, queue, id, encoding, sender,
20 /*				dsn_envid, dsn_ret)
21 /*	int     flags;
22 /*	const char *queue;
23 /*	const char *id;
24 /*	const char *encoding;
25 /*	const char *sender;
26 /*	const char *dsn_envid;
27 /*	int	dsn_ret;
28 /* DESCRIPTION
29 /*	trace_append() updates the message delivery record that is
30 /*	mailed back to the originator. In case of a trace-only
31 /*	message, the recipient status is also written to the
32 /*	mailer logfile.
33 /*
34 /*	trace_flush() returns the specified message to the specified
35 /*	sender, including the message delivery record log that was built
36 /*	with vtrace_append().
37 /*
38 /*	Arguments:
39 /* .IP flags
40 /*	The bitwise OR of zero or more of the following (specify
41 /*	BOUNCE_FLAG_NONE to request no special processing):
42 /* .RS
43 /* .IP BOUNCE_FLAG_CLEAN
44 /*	Delete the logfile in case of an error (as in: pretend
45 /*	that we never even tried to deliver this message).
46 /* .RE
47 /* .IP queue
48 /*	The message queue name of the original message file.
49 /* .IP id
50 /*	The message queue id.
51 /* .IP encoding
52 /*	The body content encoding: MAIL_ATTR_ENC_{7BIT,8BIT,NONE}.
53 /* .IP sender
54 /*	The sender envelope address.
55 /* .IP dsn_envid
56 /*	Optional DSN envelope ID.
57 /* .IP dsn_ret
58 /*	Optional DSN return full/headers option.
59 /* .IP stats
60 /*	Time stamps from different message delivery stages
61 /*	and session reuse count.
62 /* .IP rcpt
63 /*	Recipient information. See recipient_list(3).
64 /* .IP relay
65 /*	The host we sent the mail to.
66 /* .IP dsn
67 /*	Delivery status information. See dsn(3).
68 /* DIAGNOSTICS
69 /*	A non-zero result means the operation failed.
70 /*
71 /*	Fatal: out of memory.
72 /* BUGS
73 /*	Should be replaced by routines with an attribute-value based
74 /*	interface instead of an interface that uses a rigid argument list.
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 /*--*/
85 
86 /* System library. */
87 
88 #include <sys_defs.h>
89 #include <stdio.h>
90 #include <string.h>
91 
92 /* Utility library. */
93 
94 #include <msg.h>
95 #include <vstring.h>
96 
97 /* Global library. */
98 
99 #include <mail_params.h>
100 #include <mail_proto.h>
101 #include <log_adhoc.h>
102 #include <rcpt_print.h>
103 #include <dsn_print.h>
104 #include <trace.h>
105 
106 /* trace_append - append to message delivery record */
107 
108 int     trace_append(int flags, const char *id, MSG_STATS *stats,
109 		             RECIPIENT *rcpt, const char *relay,
110 		             DSN *dsn)
111 {
112     VSTRING *why = vstring_alloc(100);
113     DSN     my_dsn = *dsn;
114     int     req_stat;
115 
116     /*
117      * User-requested address verification, verbose delivery, or DSN SUCCESS
118      * notification.
119      */
120     if (strcmp(relay, NO_RELAY_AGENT) != 0)
121 	vstring_sprintf(why, "delivery via %s: ", relay);
122     vstring_strcat(why, my_dsn.reason);
123     my_dsn.reason = vstring_str(why);
124 
125     if (mail_command_client(MAIL_CLASS_PRIVATE, var_trace_service,
126 			    ATTR_TYPE_INT, MAIL_ATTR_NREQ, BOUNCE_CMD_APPEND,
127 			    ATTR_TYPE_INT, MAIL_ATTR_FLAGS, flags,
128 			    ATTR_TYPE_STR, MAIL_ATTR_QUEUEID, id,
129 			    ATTR_TYPE_FUNC, rcpt_print, (void *) rcpt,
130 			    ATTR_TYPE_FUNC, dsn_print, (void *) &my_dsn,
131 			    ATTR_TYPE_END) != 0) {
132 	msg_warn("%s: %s service failure", id, var_trace_service);
133 	req_stat = -1;
134     } else {
135 	if (flags & DEL_REQ_FLAG_USR_VRFY)
136 	    log_adhoc(id, stats, rcpt, relay, dsn, my_dsn.action);
137 	req_stat = 0;
138     }
139     vstring_free(why);
140     return (req_stat);
141 }
142 
143 /* trace_flush - deliver delivery record to the sender */
144 
145 int     trace_flush(int flags, const char *queue, const char *id,
146 		            const char *encoding, const char *sender,
147 		            const char *dsn_envid, int dsn_ret)
148 {
149     if (mail_command_client(MAIL_CLASS_PRIVATE, var_trace_service,
150 			    ATTR_TYPE_INT, MAIL_ATTR_NREQ, BOUNCE_CMD_TRACE,
151 			    ATTR_TYPE_INT, MAIL_ATTR_FLAGS, flags,
152 			    ATTR_TYPE_STR, MAIL_ATTR_QUEUE, queue,
153 			    ATTR_TYPE_STR, MAIL_ATTR_QUEUEID, id,
154 			    ATTR_TYPE_STR, MAIL_ATTR_ENCODING, encoding,
155 			    ATTR_TYPE_STR, MAIL_ATTR_SENDER, sender,
156 			    ATTR_TYPE_STR, MAIL_ATTR_DSN_ENVID, dsn_envid,
157 			    ATTR_TYPE_INT, MAIL_ATTR_DSN_RET, dsn_ret,
158 			    ATTR_TYPE_END) == 0) {
159 	return (0);
160     } else {
161 	return (-1);
162     }
163 }
164