]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-client - Add support for event API.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Thu, 29 Nov 2018 21:55:08 +0000 (22:55 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Fri, 28 Jun 2019 07:09:24 +0000 (10:09 +0300)
src/lib-smtp/smtp-client-command.c
src/lib-smtp/smtp-client-connection.c
src/lib-smtp/smtp-client-private.h
src/lib-smtp/smtp-client-transaction.c
src/lib-smtp/smtp-client-transaction.h
src/lib-smtp/smtp-client.c
src/lib-smtp/smtp-client.h

index d3b15793f3e298d0724207a63366a965489b407f..3c18347fbdb23f8afc2cc33bcc69e61992998fcf 100644 (file)
@@ -14,9 +14,6 @@
 #include "smtp-params.h"
 #include "smtp-client-private.h"
 
-static const char *
-smtp_client_command_get_label(struct smtp_client_command *cmd);
-
 /*
  * Logging
  */
@@ -30,11 +27,7 @@ smtp_client_command_debug(struct smtp_client_command *cmd,
 
        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);
        }
 }
@@ -43,15 +36,10 @@ static inline void ATTR_FORMAT(2, 3)
 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);
 }
 
@@ -96,6 +84,15 @@ smtp_client_command_get_label(struct smtp_client_command *cmd)
        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,
@@ -113,6 +110,8 @@ smtp_client_command_create(struct smtp_client_connection *conn,
        cmd->replies_expected = 1;
        cmd->callback = callback;
        cmd->context = context;
+       cmd->event = event_create(conn->event);
+       smtp_client_command_update_event(cmd);
        return cmd;
 }
 
@@ -159,6 +158,7 @@ void smtp_client_command_unref(struct smtp_client_command **_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;
 }
@@ -802,6 +802,7 @@ smtp_client_command_submit_after(struct smtp_client_command *cmd,
 
        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"))
index a8129a1b845b73c53a72a8c7e1c6979a6a8e8550..299646765da114cc3a4550bb376f83f024220940 100644 (file)
@@ -87,21 +87,6 @@ smtp_client_connection_get_extra_capability(struct smtp_client_connection *conn,
  * 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, ...)
@@ -110,10 +95,7 @@ smtp_client_connection_debug(struct smtp_client_connection *conn,
 
        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);
        }
 }
@@ -125,11 +107,7 @@ smtp_client_connection_warning(struct smtp_client_connection *conn,
        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);
 }
 
@@ -140,10 +118,7 @@ smtp_client_connection_error(struct smtp_client_connection *conn,
        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);
 }
 
@@ -1933,6 +1908,18 @@ smtp_client_connection_do_create(struct smtp_client *client, const char *name,
        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;
@@ -2034,8 +2021,8 @@ void smtp_client_connection_unref(struct smtp_client_connection **_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);
 }
index b7021f1879dc33a4e743c1b199bded96496f21b0..8798c81a0b5374bcc70590e0062fb7b0c0d58461 100644 (file)
@@ -16,6 +16,7 @@
 struct smtp_client_command {
        pool_t pool;
        int refcount;
+       struct event *event;
 
        struct smtp_client_command *prev, *next;
 
@@ -95,6 +96,7 @@ struct smtp_client_transaction_rcpt {
 struct smtp_client_transaction {
        pool_t pool;
        int refcount;
+       struct event *event;
 
        struct smtp_client_transaction *prev, *next;
 
@@ -145,10 +147,10 @@ struct smtp_client_connection {
        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;
@@ -225,6 +227,7 @@ struct smtp_client {
 
        struct smtp_client_settings set;
 
+       struct event *event;
        struct ioloop *ioloop;
        struct ssl_iostream_context *ssl_ctx;
 
@@ -272,9 +275,6 @@ void smtp_client_transaction_switch_ioloop(
 
 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,
index f3cb974b8de3d52ed25f9fed53ab953adc451bf4..69a00800d6e5d62466aec3b6e9c8d56cf990f78d 100644 (file)
@@ -256,10 +256,7 @@ smtp_client_transaction_debug(struct smtp_client_transaction *trans,
 
        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);
        }
 }
@@ -268,6 +265,12 @@ smtp_client_transaction_debug(struct smtp_client_transaction *trans,
  *
  */
 
+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(
@@ -289,6 +292,9 @@ 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);
 
@@ -429,6 +435,7 @@ void smtp_client_transaction_unref(struct smtp_client_transaction **_trans)
        }
 
        i_assert(trans->state >= SMTP_CLIENT_TRANSACTION_STATE_FINISHED);
+       event_unref(&trans->event);
        pool_unref(&trans->pool);
 
        smtp_client_connection_unref(&conn);
@@ -600,6 +607,15 @@ void smtp_client_transaction_fail(struct smtp_client_transaction *trans,
        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)
 {
index f28d982c50581d2292d61981d95ae6486ca16e5e..428bb9ce0b3a028493035f88155d74e72c362c2b 100644 (file)
@@ -73,6 +73,8 @@ void smtp_client_transaction_fail_reply(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);
 
index f1e5abb72e127c0b694cf84e99b82f04eea16c9b..ac59075f2845a939beda8b23d105d619c0979ee3 100644 (file)
 #define SMTP_DEFAULT_PORT 80
 #define SSMTP_DEFAULT_PORT 465
 
+static struct event_category event_category_smtp_client = {
+       .name = "smtp-client"
+};
+
 /*
  * Client
  */
@@ -84,6 +88,12 @@ struct smtp_client *smtp_client_init(const struct smtp_client_settings *set)
 
        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;
 }
 
@@ -95,6 +105,7 @@ void smtp_client_deinit(struct smtp_client **_client)
 
        if (client->ssl_ctx != NULL)
                ssl_iostream_context_unref(&client->ssl_ctx);
+       event_unref(&client->event);
        pool_unref(&client->pool);
        *_client = NULL;
 }
index bf16ec28ab3efec0276d4d5f76e216bc0eea8e2b..50f9faa8d736c7c353404db28bb4123fd4d83b06 100644 (file)
@@ -89,6 +89,10 @@ struct smtp_client_settings {
        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 */