}
void smtp_client_connection_accept_extra_capability(
- struct smtp_client_connection *conn, const char *cap_name)
+ struct smtp_client_connection *conn,
+ const struct smtp_client_capability_extra *cap)
{
- cap_name = p_strdup(conn->pool, cap_name);
+ struct smtp_client_capability_extra cap_new = {
+ .name = p_strdup(conn->pool, cap->name),
+ };
if (!array_is_created(&conn->extra_capabilities))
p_array_init(&conn->extra_capabilities, conn->pool, 8);
- array_push_back(&conn->extra_capabilities, &cap_name);
+ array_push_back(&conn->extra_capabilities, &cap_new);
}
const struct smtp_capability_extra *
return smtp_client_connection_authenticate(conn);
}
-static bool
-smtp_client_connection_has_extra_capability(struct smtp_client_connection *conn,
- const char *cap_name)
+static const struct smtp_client_capability_extra *
+smtp_client_connection_find_extra_capability(
+ struct smtp_client_connection *conn, const char *cap_name)
{
- const char *const *cap_idx;
+ const struct smtp_client_capability_extra *cap;
if (!array_is_created(&conn->extra_capabilities))
- return FALSE;
- array_foreach(&conn->extra_capabilities, cap_idx) {
- if (strcasecmp(*cap_idx, cap_name) == 0)
- return TRUE;
+ return NULL;
+ array_foreach(&conn->extra_capabilities, cap) {
+ if (strcasecmp(cap->name, cap_name) == 0)
+ return cap;
}
- return FALSE;
+ return NULL;
}
static void
struct smtp_client_connection *conn, const char *cap_name,
const char *const *params)
{
+ const struct smtp_client_capability_extra *ccap_extra;
struct smtp_capability_extra cap_extra;
pool_t pool = conn->cap_pool;
- if (!smtp_client_connection_has_extra_capability(conn, cap_name))
+ ccap_extra = smtp_client_connection_find_extra_capability(
+ conn, cap_name);
+ if (ccap_extra == NULL)
return;
if (!array_is_created(&conn->caps.extra))
p_array_init(&conn->caps.extra, pool, 4);
i_zero(&cap_extra);
- cap_extra.name = p_strdup(pool, cap_name);
+ cap_extra.name = p_strdup(pool, ccap_extra->name);
cap_extra.params = p_strarray_dup(pool, params);
array_push_back(&conn->caps.extra, &cap_extra);
p_array_init(&conn->extra_capabilities, pool,
str_array_length(set->extra_capabilities) + 8);
for (extp = set->extra_capabilities; *extp != NULL; extp++) {
- const char *ext = p_strdup(pool, *extp);
- array_push_back(&conn->extra_capabilities, &ext);
+ struct smtp_client_capability_extra cap = {
+ .name = p_strdup(pool, *extp),
+ };
+
+ array_push_back(&conn->extra_capabilities, &cap);
}
}
struct smtp_reply;
struct smtp_client;
+struct smtp_client_capability_extra;
struct smtp_client_settings;
struct smtp_client_command;
uoff_t smtp_client_connection_get_size_capability(
struct smtp_client_connection *conn);
void smtp_client_connection_accept_extra_capability(
- struct smtp_client_connection *conn, const char *cap_name);
+ struct smtp_client_connection *conn,
+ const struct smtp_client_capability_extra *cap);
const struct smtp_capability_extra *
smtp_client_connection_get_extra_capability(struct smtp_client_connection *conn,
const char *name);
lmtp_proxy_get_connection(struct lmtp_proxy *proxy,
const struct lmtp_proxy_rcpt_settings *set)
{
+ static const struct smtp_client_capability_extra cap_rcpt_forward = {
+ .name = LMTP_RCPT_FORWARD_CAPABILITY,
+ };
struct smtp_client_settings lmtp_set;
struct smtp_server_transaction *trans = proxy->trans;
struct lmtp_proxy_connection *const *conns, *conn;
conn->set.host, conn->set.port,
ssl_mode, &lmtp_set);
}
- smtp_client_connection_accept_extra_capability(
- conn->lmtp_conn, LMTP_RCPT_FORWARD_CAPABILITY);
+ smtp_client_connection_accept_extra_capability(conn->lmtp_conn,
+ &cap_rcpt_forward);
smtp_client_connection_connect(conn->lmtp_conn, NULL, NULL);
conn->lmtp_trans = smtp_client_transaction_create(