1 /* GNU Mailutils -- a suite of utilities for electronic mail
2 Copyright (C) 2010-2021 Free Software Foundation, Inc.
3
4 This library is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as published by
6 the Free Software Foundation; either version 3, or (at your option)
7 any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public License
15 along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
16
17 #ifdef HAVE_CONFIG_H
18 # include <config.h>
19 #endif
20
21 #include <string.h>
22 #include <errno.h>
23 #include <stdio.h>
24 #include <mailutils/errno.h>
25 #include <mailutils/error.h>
26 #include <mailutils/nls.h>
27 #include <mailutils/stream.h>
28 #include <mailutils/sys/smtp.h>
29
30 static const char *smtp_prefix[] = {
31 "S: ", "C: "
32 };
33
34 int
_mu_smtp_trace_enable(mu_smtp_t smtp)35 _mu_smtp_trace_enable (mu_smtp_t smtp)
36 {
37 int rc = 0;
38 mu_stream_t dstr, xstr;
39
40 if (!smtp->carrier)
41 {
42 MU_SMTP_FSET (smtp, _MU_SMTP_TRACE);
43 return 0;
44 }
45
46 rc = mu_dbgstream_create (&dstr, MU_DIAG_DEBUG);
47 if (rc)
48 mu_error (_("cannot create debug stream; transcript disabled: %s"),
49 mu_strerror (rc));
50 else
51 {
52 rc = mu_xscript_stream_create (&xstr, smtp->carrier, dstr,
53 smtp_prefix);
54 if (rc)
55 mu_error (_("cannot create transcript stream: %s"),
56 mu_strerror (rc));
57 else
58 {
59 mu_stream_unref (smtp->carrier);
60 smtp->carrier = xstr;
61 MU_SMTP_FSET (smtp, _MU_SMTP_TRACE);
62 }
63 }
64
65 return rc;
66 }
67
68 int
_mu_smtp_trace_disable(mu_smtp_t smtp)69 _mu_smtp_trace_disable (mu_smtp_t smtp)
70 {
71 mu_stream_t xstr = smtp->carrier;
72 mu_stream_t stream[2];
73 int rc;
74
75 if (!xstr)
76 return 0;
77
78 rc = mu_stream_ioctl (xstr, MU_IOCTL_TRANSPORT, MU_IOCTL_OP_GET, stream);
79 if (rc)
80 return rc;
81
82 smtp->carrier = stream[0];
83 mu_stream_destroy (&xstr);
84 MU_SMTP_FCLR (smtp, _MU_SMTP_TRACE);
85 return 0;
86 }
87
88 int
mu_smtp_trace(mu_smtp_t smtp,int op)89 mu_smtp_trace (mu_smtp_t smtp, int op)
90 {
91 int trace_on = MU_SMTP_FISSET (smtp, _MU_SMTP_TRACE);
92
93 switch (op)
94 {
95 case MU_SMTP_TRACE_SET:
96 if (trace_on)
97 return MU_ERR_EXISTS;
98 return _mu_smtp_trace_enable (smtp);
99
100 case MU_SMTP_TRACE_CLR:
101 if (!trace_on)
102 return MU_ERR_NOENT;
103 return _mu_smtp_trace_disable (smtp);
104
105 case MU_SMTP_TRACE_QRY:
106 if (!trace_on)
107 return MU_ERR_NOENT;
108 return 0;
109 }
110 return EINVAL;
111 }
112
113 int
mu_smtp_trace_mask(mu_smtp_t smtp,int op,int lev)114 mu_smtp_trace_mask (mu_smtp_t smtp, int op, int lev)
115 {
116 switch (op)
117 {
118 case MU_SMTP_TRACE_SET:
119 smtp->flags |= MU_SMTP_XSCRIPT_MASK (lev);
120 break;
121
122 case MU_SMTP_TRACE_CLR:
123 smtp->flags &= ~MU_SMTP_XSCRIPT_MASK (lev);
124 break;
125
126 case MU_SMTP_TRACE_QRY:
127 if (smtp->flags & MU_SMTP_XSCRIPT_MASK (lev))
128 break;
129 return MU_ERR_NOENT;
130
131 default:
132 return EINVAL;
133 }
134 return 0;
135 }
136
137 int
_mu_smtp_xscript_level(mu_smtp_t smtp,int xlev)138 _mu_smtp_xscript_level (mu_smtp_t smtp, int xlev)
139 {
140 if (mu_stream_ioctl (smtp->carrier, MU_IOCTL_XSCRIPTSTREAM,
141 MU_IOCTL_XSCRIPTSTREAM_LEVEL, &xlev) == 0)
142 return xlev;
143 return MU_XSCRIPT_NORMAL;
144 }
145