From: Stephan Bosch Date: Fri, 28 Sep 2018 15:59:53 +0000 (+0200) Subject: lib-smtp: client: transaction: Add support for creating an empty transaction (without... X-Git-Tag: 2.3.9~1247 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf50fbb04dda2bc33f0a486c9ac51ae77a11221f;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: client: transaction: Add support for creating an empty transaction (without MAIL FROM data). --- diff --git a/src/lib-smtp/smtp-client-transaction.c b/src/lib-smtp/smtp-client-transaction.c index ca8b5b3df0..d2d136fb09 100644 --- a/src/lib-smtp/smtp-client-transaction.c +++ b/src/lib-smtp/smtp-client-transaction.c @@ -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) diff --git a/src/lib-smtp/smtp-client-transaction.h b/src/lib-smtp/smtp-client-transaction.h index f897f29b5a..545cd689d6 100644 --- a/src/lib-smtp/smtp-client-transaction.h +++ b/src/lib-smtp/smtp-client-transaction.h @@ -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