#include "smtp-params.h"
#include "smtp-client-private.h"
-static const char *
-smtp_client_command_get_label(struct smtp_client_command *cmd);
-
/*
* Logging
*/
if (conn->set.debug) {
va_start(args, format);
- i_debug("%s-client: conn %s: command %s: %s",
- smtp_protocol_name(conn->protocol),
- smpt_client_connection_label(conn),
- smtp_client_command_get_label(cmd),
- t_strdup_vprintf(format, args));
+ e_debug(cmd->event, "%s", t_strdup_vprintf(format, args));
va_end(args);
}
}
smtp_client_command_error(struct smtp_client_command *cmd,
const char *format, ...)
{
- struct smtp_client_connection *conn = cmd->conn;
va_list args;
va_start(args, format);
- i_error("%s-client: conn %s: command %s: %s",
- smtp_protocol_name(conn->protocol),
- smpt_client_connection_label(conn),
- smtp_client_command_get_label(cmd),
- t_strdup_vprintf(format, args));
+ e_error(cmd->event, "%s", t_strdup_vprintf(format, args));
va_end(args);
}
return smtp_client_command_get_name(cmd);
}
+static void
+smtp_client_command_update_event(struct smtp_client_command *cmd)
+{
+ event_add_str(cmd->event, "name", smtp_client_command_get_name(cmd));
+ event_set_append_log_prefix(cmd->event,
+ t_strdup_printf("command %s: ",
+ smtp_client_command_get_label(cmd)));
+}
+
static struct smtp_client_command *
smtp_client_command_create(struct smtp_client_connection *conn,
enum smtp_client_command_flags flags,
cmd->replies_expected = 1;
cmd->callback = callback;
cmd->context = context;
+ cmd->event = event_create(conn->event);
+ smtp_client_command_update_event(cmd);
return cmd;
}
i_assert(cmd->state >= SMTP_CLIENT_COMMAND_STATE_FINISHED);
i_stream_unref(&cmd->stream);
+ event_unref(&cmd->event);
pool_unref(&cmd->pool);
*_cmd = NULL;
}
i_assert(after == NULL || cmd->conn == after->conn);
+ smtp_client_command_update_event(cmd);
cmd->state = SMTP_CLIENT_COMMAND_STATE_SUBMITTED;
if (smtp_client_command_name_equals(cmd, "EHLO"))
* Logging
*/
-const char *
-smpt_client_connection_label(struct smtp_client_connection *conn)
-{
- if (conn->label == NULL) {
- if (conn->path == NULL) {
- conn->label = i_strdup_printf("%s:%u [%u]",
- conn->host, conn->port, conn->id);
- } else {
- conn->label = i_strdup_printf("unix:%s [%u]",
- conn->path, conn->id);
- }
- }
- return conn->label;
-}
-
static inline void ATTR_FORMAT(2, 3)
smtp_client_connection_debug(struct smtp_client_connection *conn,
const char *format, ...)
if (conn->set.debug) {
va_start(args, format);
- i_debug("%s-client: conn %s: %s",
- smtp_protocol_name(conn->protocol),
- smpt_client_connection_label(conn),
- t_strdup_vprintf(format, args));
+ e_debug(conn->event, "%s", t_strdup_vprintf(format, args));
va_end(args);
}
}
va_list args;
va_start(args, format);
-
- i_warning("%s-client: conn %s: %s",
- smtp_protocol_name(conn->protocol),
- smpt_client_connection_label(conn),
- t_strdup_vprintf(format, args));
+ e_warning(conn->event, "%s", t_strdup_vprintf(format, args));
va_end(args);
}
va_list args;
va_start(args, format);
- i_error("%s-client: conn %s: %s",
- smtp_protocol_name(conn->protocol),
- smpt_client_connection_label(conn),
- t_strdup_vprintf(format, args));
+ e_error(conn->event, "%s", t_strdup_vprintf(format, args));
va_end(args);
}
conn->cap_pool = pool_alloconly_create
("smtp client connection capabilities", 128);
+ if (set != NULL && set->event != NULL)
+ conn->event = event_create(set->event);
+ else
+ conn->event = event_create(client->event);
+ event_set_forced_debug(conn->event, (set != NULL && set->debug));
+
+ event_set_append_log_prefix(conn->event,
+ t_strdup_printf("%s-client: conn %s [%u]: ",
+ smtp_protocol_name(conn->protocol),
+ name, conn->id));
+
+ conn->conn.event_parent = conn->event;
connection_init(conn->client->conn_list, &conn->conn);
return conn;
connection_deinit(&conn->conn);
+ event_unref(&conn->event);
i_free(conn->ips);
- i_free(conn->label);
pool_unref(&conn->cap_pool);
pool_unref(&conn->pool);
}
struct smtp_client_command {
pool_t pool;
int refcount;
+ struct event *event;
struct smtp_client_command *prev, *next;
struct smtp_client_transaction {
pool_t pool;
int refcount;
+ struct event *event;
struct smtp_client_transaction *prev, *next;
struct connection conn;
pool_t pool;
int refcount;
+ struct event *event;
struct smtp_client *client;
unsigned int id;
- char *label;
enum smtp_protocol protocol;
const char *path, *host;
struct smtp_client_settings set;
+ struct event *event;
struct ioloop *ioloop;
struct ssl_iostream_context *ssl_ctx;
struct connection_list *smtp_client_connection_list_init(void);
-const char *
-smpt_client_connection_label(struct smtp_client_connection *conn);
-
void smtp_client_connection_send_xclient(struct smtp_client_connection *conn);
void smtp_client_connection_fail(struct smtp_client_connection *conn,
if (conn->set.debug) {
va_start(args, format);
- i_debug("%s-client: conn %s: transaction: %s",
- smtp_protocol_name(conn->protocol),
- smpt_client_connection_label(conn),
- t_strdup_vprintf(format, args));
+ e_debug(trans->event, "%s", t_strdup_vprintf(format, args));
va_end(args);
}
}
*
*/
+static void
+smtp_client_transaction_update_event(struct smtp_client_transaction *trans)
+{
+ event_set_append_log_prefix(trans->event, "transaction: ");
+}
+
#undef smtp_client_transaction_create_empty
struct smtp_client_transaction *
smtp_client_transaction_create_empty(
trans->callback = callback;
trans->context = context;
+ trans->event = event_create(conn->event);
+ smtp_client_transaction_update_event(trans);
+
trans->conn = conn;
smtp_client_connection_ref(conn);
}
i_assert(trans->state >= SMTP_CLIENT_TRANSACTION_STATE_FINISHED);
+ event_unref(&trans->event);
pool_unref(&trans->pool);
smtp_client_connection_unref(&conn);
smtp_client_transaction_fail_reply(trans, &reply);
}
+void smtp_client_transaction_set_event(struct smtp_client_transaction *trans,
+ struct event *event)
+{
+ event_unref(&trans->event);
+ trans->event = event_create(event);
+ event_set_forced_debug(trans->event, trans->conn->set.debug);
+ smtp_client_transaction_update_event(trans);
+}
+
static void
smtp_client_transaction_timeout(struct smtp_client_transaction *trans)
{
void smtp_client_transaction_fail(struct smtp_client_transaction *trans,
unsigned int status, const char *error);
+void smtp_client_transaction_set_event(struct smtp_client_transaction *trans,
+ struct event *event);
void smtp_client_transaction_set_timeout(struct smtp_client_transaction *trans,
unsigned int timeout_msecs);
#define SMTP_DEFAULT_PORT 80
#define SSMTP_DEFAULT_PORT 465
+static struct event_category event_category_smtp_client = {
+ .name = "smtp-client"
+};
+
/*
* Client
*/
client->conn_list = smtp_client_connection_list_init();
+ /* There is no event log prefix added here, since the client itself does
+ not log anything and the prefix is protocol-dependent. */
+ client->event = event_create(set->event);
+ event_add_category(client->event, &event_category_smtp_client);
+ event_set_forced_debug(client->event, set->debug);
+
return client;
}
if (client->ssl_ctx != NULL)
ssl_iostream_context_unref(&client->ssl_ctx);
+ event_unref(&client->event);
pool_unref(&client->pool);
*_client = NULL;
}
size_t socket_send_buffer_size;
size_t socket_recv_buffer_size;
+ /* Event to use for the smtp client. For specific transactions this can
+ be overridden with smtp_client_transaction_set_event(). */
+ struct event *event;
+
/* enable logging debug messages */
bool debug;
/* peer is trusted, so e.g. attempt sending XCLIENT data */