]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: common: Add smtp_proxy_data_merge().
authorStephan Bosch <stephan.bosch@dovecot.fi>
Mon, 3 Dec 2018 17:45:36 +0000 (18:45 +0100)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 12 Feb 2019 13:42:04 +0000 (15:42 +0200)
src/lib-smtp/smtp-common.c
src/lib-smtp/smtp-common.h

index 76dc23ba12e5f34122dfbbfddbada562614d205e..ec7b8a81b311441ceffece06df3357ac3fe256b6 100644 (file)
@@ -38,3 +38,52 @@ enum smtp_capability smtp_capability_find_by_name(const char *cap_name)
 
        return SMTP_CAPABILITY_NONE;
 }
+
+/*
+ * SMTP proxy data
+ */
+
+static void
+smtp_proxy_data_merge_extra_fields(pool_t pool, struct smtp_proxy_data *dst,
+                                  const struct smtp_proxy_data *src)
+{
+       const struct smtp_proxy_data_field *sefields;
+       struct smtp_proxy_data_field *defields;
+       unsigned int i;
+
+       if (src->extra_fields_count == 0)
+               return;
+
+       sefields = src->extra_fields;
+       defields = p_new(pool, struct smtp_proxy_data_field,
+                        src->extra_fields_count);
+       for (i = 0; i < src->extra_fields_count; i++) {
+               defields[i].name = p_strdup(pool, sefields[i].name);
+               defields[i].value = p_strdup(pool, sefields[i].value);
+       }
+
+       dst->extra_fields = defields;
+       dst->extra_fields_count = src->extra_fields_count;
+}
+
+void smtp_proxy_data_merge(pool_t pool, struct smtp_proxy_data *dst,
+                          const struct smtp_proxy_data *src)
+{
+       if (src->proto != SMTP_PROXY_PROTOCOL_UNKNOWN)
+               dst->proto = src->proto;
+       if (src->source_ip.family != 0) {
+               dst->source_ip = src->source_ip;
+               if (src->source_port != 0)
+                       dst->source_port = src->source_port;
+       }
+       if (src->helo != NULL && *src->helo != '\0')
+               dst->helo = p_strdup(pool, src->helo);
+       if (src->login != NULL && *src->login != '\0')
+               dst->login = p_strdup(pool, src->login);
+       if (src->ttl_plus_1 > 0)
+               dst->ttl_plus_1 = src->ttl_plus_1;
+       if (src->timeout_secs > 0)
+               dst->timeout_secs = src->timeout_secs;
+
+       smtp_proxy_data_merge_extra_fields(pool, dst, src);
+};
index 598f96544ad61ea1d4d646c46007fa2dfd2831bb..747da2a268f51c5ed442f59cbb022fa15c835a11 100644 (file)
@@ -101,4 +101,11 @@ struct smtp_proxy_data {
        unsigned int extra_fields_count;
 };
 
+/*
+ * SMTP proxy data
+ */
+
+void smtp_proxy_data_merge(pool_t pool, struct smtp_proxy_data *dst,
+                          const struct smtp_proxy_data *src);
+
 #endif