Coverage Report

Created: 2026-10-28 07:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dovecot/src/lib-smtp/smtp-common.h
Line
Count
Source
1
#ifndef SMTP_COMMON_H
2
#define SMTP_COMMON_H
3
4
#include "net.h"
5
6
/*
7
 * Limits
8
 */
9
10
#define SMTP_BASE_LINE_LENGTH_LIMIT (512 - 2)
11
12
/*
13
 * SMTP protocols
14
 */
15
16
enum smtp_protocol {
17
  SMTP_PROTOCOL_SMTP = 0,
18
  SMTP_PROTOCOL_LMTP
19
};
20
21
static inline const char *
22
smtp_protocol_name(enum smtp_protocol proto)
23
12.3k
{
24
12.3k
  switch (proto) {
25
12.3k
  case SMTP_PROTOCOL_SMTP:
26
12.3k
    return "smtp";
27
0
  case SMTP_PROTOCOL_LMTP:
28
0
    return "lmtp";
29
0
  default:
30
0
    break;
31
12.3k
  }
32
0
  i_unreached();
33
12.3k
}
Unexecuted instantiation: fuzz-smtp-server.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-data.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-reply.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-command.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-recipient.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-transaction.c:smtp_protocol_name
smtp-server-connection.c:smtp_protocol_name
Line
Count
Source
23
6.16k
{
24
6.16k
  switch (proto) {
25
6.16k
  case SMTP_PROTOCOL_SMTP:
26
6.16k
    return "smtp";
27
0
  case SMTP_PROTOCOL_LMTP:
28
0
    return "lmtp";
29
0
  default:
30
0
    break;
31
6.16k
  }
32
0
  i_unreached();
33
6.16k
}
smtp-server.c:smtp_protocol_name
Line
Count
Source
23
6.16k
{
24
6.16k
  switch (proto) {
25
6.16k
  case SMTP_PROTOCOL_SMTP:
26
6.16k
    return "smtp";
27
0
  case SMTP_PROTOCOL_LMTP:
28
0
    return "lmtp";
29
0
  default:
30
0
    break;
31
6.16k
  }
32
0
  i_unreached();
33
6.16k
}
Unexecuted instantiation: smtp-common.c:smtp_protocol_name
Unexecuted instantiation: smtp-params.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-helo.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-starttls.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-auth.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-mail.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-rcpt.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-rset.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-noop.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-quit.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-vrfy.c:smtp_protocol_name
Unexecuted instantiation: smtp-server-cmd-xclient.c:smtp_protocol_name
34
35
/* SMTP capabilities */
36
37
enum smtp_capability {
38
  SMTP_CAPABILITY_NONE                = 0,
39
40
  SMTP_CAPABILITY_AUTH                = BIT(0),
41
  SMTP_CAPABILITY_STARTTLS            = BIT(1),
42
  SMTP_CAPABILITY_PIPELINING          = BIT(2),
43
  SMTP_CAPABILITY_SIZE                = BIT(3),
44
  SMTP_CAPABILITY_ENHANCEDSTATUSCODES = BIT(4),
45
  SMTP_CAPABILITY_8BITMIME            = BIT(5),
46
  SMTP_CAPABILITY_CHUNKING            = BIT(6),
47
  SMTP_CAPABILITY_BINARYMIME          = BIT(7),
48
  SMTP_CAPABILITY_BURL                = BIT(8),
49
  SMTP_CAPABILITY_DSN                 = BIT(9),
50
  SMTP_CAPABILITY_VRFY                = BIT(10),
51
  SMTP_CAPABILITY_ETRN                = BIT(11),
52
  SMTP_CAPABILITY_XCLIENT             = BIT(12),
53
#ifdef EXPERIMENTAL_MAIL_UTF8
54
  SMTP_CAPABILITY_SMTPUTF8            = BIT(13),
55
#endif
56
  SMTP_CAPABILITY__ORCPT              = BIT(24),
57
};
58
59
#ifndef EXPERIMENTAL_MAIL_UTF8
60
#  define SMTP_CAPABILITY_SMTPUTF8  0
61
#endif
62
63
struct smtp_capability_name {
64
  const char *name;
65
  enum smtp_capability capability;
66
};
67
68
struct smtp_capability_extra {
69
  const char *name;
70
  const char *const *params;
71
};
72
73
extern const struct smtp_capability_name smtp_capability_names[];
74
75
enum smtp_capability smtp_capability_find_by_name(const char *cap_name);
76
77
/*
78
 * SMTP proxy data
79
 */
80
81
enum smtp_proxy_protocol {
82
  SMTP_PROXY_PROTOCOL_UNKNOWN = 0,
83
  SMTP_PROXY_PROTOCOL_SMTP,
84
  SMTP_PROXY_PROTOCOL_ESMTP,
85
  SMTP_PROXY_PROTOCOL_LMTP
86
};
87
88
struct smtp_proxy_data_field {
89
  const char *name;
90
  const char *value;
91
};
92
ARRAY_DEFINE_TYPE(smtp_proxy_data_field, struct smtp_proxy_data_field);
93
94
struct smtp_proxy_data {
95
  /* PROTO */
96
  enum smtp_proxy_protocol proto;
97
  /* ADDR */
98
  struct ip_addr source_ip;
99
  /* PORT */
100
  in_port_t source_port;
101
  /* DESTADDR */
102
  struct ip_addr dest_ip;
103
  /* DESTPORT */
104
  in_port_t dest_port;
105
  /* HELO, LOGIN */
106
  const char *helo, *login;
107
  /* SESSION */
108
  const char *session;
109
  /* CLIENT-TRANSPORT */
110
  const char *client_transport;
111
  /* DESTNAME */
112
  const char *local_name;
113
114
  /* TTL: send as this -1, so the default 0 means "don't send it" */
115
  unsigned int ttl_plus_1;
116
  /* TIMEOUT: remote is notified that the connection is going to be closed
117
     after this many seconds, so it should try to keep lock waits and such
118
     lower than this. */
119
  unsigned int timeout_secs;
120
121
  /* additional fields */
122
  const struct smtp_proxy_data_field *extra_fields;
123
  unsigned int extra_fields_count;
124
};
125
126
void smtp_proxy_data_merge(pool_t pool, struct smtp_proxy_data *dst,
127
         const struct smtp_proxy_data *src);
128
129
#endif