]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: client: transaction: Add support for creating an empty transaction (without...
authorStephan Bosch <stephan.bosch@dovecot.fi>
Fri, 28 Sep 2018 15:59:53 +0000 (17:59 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:40:48 +0000 (15:40 +0200)
src/lib-smtp/smtp-client-transaction.c
src/lib-smtp/smtp-client-transaction.h

index ca8b5b3df0ff55174ce21673319a92eb7eaef78a..d2d136fb09d3bdf2653e77916fbfe0d735be8341 100644 (file)
@@ -208,11 +208,9 @@ smtp_client_transaction_debug(struct smtp_client_transaction *trans,
  *
  */
 
-#undef smtp_client_transaction_create
+#undef smtp_client_transaction_create_empty
 struct smtp_client_transaction *
-smtp_client_transaction_create(struct smtp_client_connection *conn,
-       const struct smtp_address *mail_from,
-       const struct smtp_params_mail *mail_params,
+smtp_client_transaction_create_empty(struct smtp_client_connection *conn,
        unsigned int flags ATTR_UNUSED,
        smtp_client_transaction_callback_t *callback, void *context)
 {
@@ -226,8 +224,6 @@ smtp_client_transaction_create(struct smtp_client_connection *conn,
        trans->callback = callback;
        trans->context = context;
 
-       (void)smtp_client_transaction_mail_new(trans, mail_from, mail_params);
-
        trans->conn = conn;
        smtp_client_connection_ref(conn);
 
@@ -236,6 +232,22 @@ smtp_client_transaction_create(struct smtp_client_connection *conn,
        return trans;
 }
 
+#undef smtp_client_transaction_create
+struct smtp_client_transaction *
+smtp_client_transaction_create(struct smtp_client_connection *conn,
+       const struct smtp_address *mail_from,
+       const struct smtp_params_mail *mail_params,
+       unsigned int flags ATTR_UNUSED,
+       smtp_client_transaction_callback_t *callback, void *context)
+{
+       struct smtp_client_transaction *trans;
+
+       trans = smtp_client_transaction_create_empty(conn, flags,
+                                                    callback, context);
+       (void)smtp_client_transaction_mail_new(trans, mail_from, mail_params);
+       return trans;
+}
+
 static void
 smtp_client_transaction_finish(struct smtp_client_transaction *trans)
 {
@@ -658,6 +670,20 @@ void smtp_client_transaction_start(
        smtp_client_connection_add_transaction(conn, trans);
 }
 
+#undef smtp_client_transaction_start_empty
+void smtp_client_transaction_start_empty(
+       struct smtp_client_transaction *trans,
+       const struct smtp_address *mail_from,
+       const struct smtp_params_mail *mail_params,
+       smtp_client_command_callback_t *mail_callback, void *context)
+{
+       i_assert(trans->mail_head == NULL);
+
+       (void)smtp_client_transaction_mail_new(trans, mail_from, mail_params);
+       
+       smtp_client_transaction_start(trans, mail_callback, context);
+}
+
 static void
 smtp_client_transaction_rcpt_cb(const struct smtp_reply *reply,
                                struct smtp_client_transaction_rcpt *rcpt)
index f897f29b5aa07ef83d960570767298d7a0ee31b4..545cd689d606a44ae2023ff16688b689ea663d0f 100644 (file)
@@ -30,12 +30,25 @@ struct smtp_client_transaction_times {
 typedef void
 smtp_client_transaction_callback_t(void *context);
 
+/* Create an empty transaction (i.e. even without the parameters for the
+   MAIL FROM command) */
+struct smtp_client_transaction *
+smtp_client_transaction_create_empty(
+       struct smtp_client_connection *conn, unsigned int flags,
+       smtp_client_transaction_callback_t *callback, void *context)
+       ATTR_NULL(4);
+#define smtp_client_transaction_create_empty(conn, callback, context) \
+       smtp_client_transaction_create_empty(conn, \
+               0 + CALLBACK_TYPECHECK(callback, void (*)(typeof(context))), \
+               (smtp_client_transaction_callback_t *)callback, context)
+/* Create a new transaction, including the parameters for the MAIL FROM
+   command */
 struct smtp_client_transaction *
 smtp_client_transaction_create(struct smtp_client_connection *conn,
                const struct smtp_address *mail_from,
                const struct smtp_params_mail *mail_params, unsigned int flags,
                smtp_client_transaction_callback_t *callback, void *context)
-               ATTR_NULL(2, 3, 5);
+               ATTR_NULL(2, 3, 6);
 #define smtp_client_transaction_create(conn, \
                mail_from, mail_params, callback, context) \
        smtp_client_transaction_create(conn, mail_from, mail_params, \
@@ -67,6 +80,25 @@ void smtp_client_transaction_start(struct smtp_client_transaction *trans,
                (smtp_client_command_callback_t *)mail_callback, \
                context + CALLBACK_TYPECHECK(mail_callback, void (*)( \
                        const struct smtp_reply *reply, typeof(context))))
+/* Start the transaction with a MAIL command. This function allows providing the
+   parameters for the MAIL FROM command for when the transaction was created
+   empty. The mail_from_callback is called once the server replies to the MAIL
+   FROM command. Calling this function is not mandatory; it is called implicitly
+   by smtp_client_transaction_send() if the transaction wasn't already started.
+   In that case, the NULL sender ("<>") will be used when the transaction was
+   created empty.
+ */
+void smtp_client_transaction_start_empty(
+       struct smtp_client_transaction *trans,
+       const struct smtp_address *mail_from,
+       const struct smtp_params_mail *mail_params,
+       smtp_client_command_callback_t *mail_callback, void *context);
+#define smtp_client_transaction_start_empty(trans, mail_from, mail_params, \
+                                           mail_callback, context) \
+       smtp_client_transaction_start_empty(trans, mail_from, mail_params, \
+               (smtp_client_command_callback_t *)mail_callback, \
+               context + CALLBACK_TYPECHECK(mail_callback, void (*)( \
+                       const struct smtp_reply *reply, typeof(context))))
 
 /* Add an extra pipelined MAIL command to the transaction. The mail_callback is
    called once the server replies to the MAIL command. This is usually only