]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lmtp: Add and use lmtp_pre_mail_settings
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 6 Mar 2025 18:08:16 +0000 (20:08 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Mar 2025 13:01:57 +0000 (13:01 +0000)
It only has mail_max_lock_timeout setting. This is much efficient to lookup
than the full large mail_storage_settings.

src/lmtp/lmtp-local.c
src/lmtp/lmtp-settings.c
src/lmtp/lmtp-settings.h

index 4d827ec9322274e726d8f9c07472fa608df5acf0..6f386477e94c587efa93bc4d6c4d358aefc57dc0 100644 (file)
@@ -431,7 +431,7 @@ lmtp_local_deliver(struct lmtp_local *local,
        struct lmtp_local_deliver_context lldctx;
        struct mail_user *rcpt_user;
        const struct mail_storage_service_input *input;
-       const struct mail_storage_settings *mail_set;
+       const struct lmtp_pre_mail_settings *pre_mail_set;
        struct smtp_proxy_data proxy_data;
        struct mail_namespace *ns;
        const char *error, *username;
@@ -441,9 +441,9 @@ lmtp_local_deliver(struct lmtp_local *local,
        username = t_strdup(input->username);
 
        if (settings_get(mail_storage_service_user_get_event(service_user),
-                        &mail_storage_setting_parser_info,
+                        &lmtp_pre_mail_setting_parser_info,
                         SETTINGS_GET_FLAG_NO_EXPAND,
-                        &mail_set, &error) < 0) {
+                        &pre_mail_set, &error) < 0) {
                e_error(rcpt->event, "%s", error);
                smtp_server_recipient_reply(rcpt, 451, "4.3.0",
                                            "Temporary internal error");
@@ -453,8 +453,8 @@ lmtp_local_deliver(struct lmtp_local *local,
        smtp_server_connection_get_proxy_data
                (client->conn, &proxy_data);
        if (proxy_data.timeout_secs > 0 &&
-           (mail_set->mail_max_lock_timeout == 0 ||
-            mail_set->mail_max_lock_timeout > proxy_data.timeout_secs)) {
+           (pre_mail_set->mail_max_lock_timeout == 0 ||
+            pre_mail_set->mail_max_lock_timeout > proxy_data.timeout_secs)) {
                /* set lock timeout waits to be less than when proxy has
                   advertised that it's going to timeout the connection.
                   this avoids duplicate deliveries in case the delivery
@@ -467,7 +467,7 @@ lmtp_local_deliver(struct lmtp_local *local,
                settings_override(set_instance, "*/mail_max_lock_timeout",
                                  value, SETTINGS_OVERRIDE_TYPE_CODE);
        }
-       settings_free(mail_set);
+       settings_free(pre_mail_set);
 
        i_zero(&lldctx);
        lldctx.session_id = lrcpt->session_id;
index ea7f3a5a083108ec2c3e775dba90c748e9fbe9ee..7fe9a74db73b85639c6dc9c38cd6608f1624c510 100644 (file)
@@ -55,6 +55,30 @@ const struct setting_keyvalue lmtp_service_settings_defaults[] = {
        { NULL, NULL }
 };
 
+#undef DEF
+#define DEF(type, name) \
+       SETTING_DEFINE_STRUCT_##type(#name, name, struct lmtp_pre_mail_settings)
+
+static const struct setting_define lmtp_pre_mail_setting_defines[] = {
+       DEF(TIME, mail_max_lock_timeout),
+
+       SETTING_DEFINE_LIST_END
+};
+
+static const struct lmtp_pre_mail_settings lmtp_pre_mail_default_settings = {
+       .mail_max_lock_timeout = 0,
+};
+
+const struct setting_parser_info lmtp_pre_mail_setting_parser_info = {
+       .name = "lmtp_pre_mail",
+
+       .defines = lmtp_pre_mail_setting_defines,
+       .defaults = &lmtp_pre_mail_default_settings,
+
+       .struct_size = sizeof(struct lmtp_pre_mail_settings),
+       .pool_offset1 = 1 + offsetof(struct lmtp_pre_mail_settings, pool),
+};
+
 #undef DEF
 #define DEF(type, name) \
        SETTING_DEFINE_STRUCT_##type(#name, name, struct lmtp_settings)
index 7e79941692d48394a7af55d60cdac907548b0e94..b6ab546a60463aa31649ad1c3d5baf6bec8a33e2 100644 (file)
@@ -18,6 +18,11 @@ enum lmtp_client_workarounds {
 };
 /* </settings checks> */
 
+struct lmtp_pre_mail_settings {
+       pool_t pool;
+       unsigned int mail_max_lock_timeout;
+};
+
 struct lmtp_settings {
        pool_t pool;
        bool lmtp_proxy;
@@ -44,6 +49,7 @@ struct lmtp_settings {
        enum lmtp_client_workarounds parsed_workarounds;
 };
 
+extern const struct setting_parser_info lmtp_pre_mail_setting_parser_info;
 extern const struct setting_parser_info lmtp_setting_parser_info;
 
 #endif