From: Timo Sirainen Date: Sun, 5 Nov 2017 16:29:13 +0000 (+0200) Subject: lib-ssl-iostream: Add ssl_iostream_settings_equals() X-Git-Tag: 2.3.0.rc1~536 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1c1896564144f487fa5be3bd3ac5d7f1826311f7;p=thirdparty%2Fdovecot%2Fcore.git lib-ssl-iostream: Add ssl_iostream_settings_equals() --- diff --git a/src/lib-ssl-iostream/iostream-ssl-private.h b/src/lib-ssl-iostream/iostream-ssl-private.h index 2972b38ac8..1858a66472 100644 --- a/src/lib-ssl-iostream/iostream-ssl-private.h +++ b/src/lib-ssl-iostream/iostream-ssl-private.h @@ -40,4 +40,9 @@ struct iostream_ssl_vfuncs { void iostream_ssl_module_init(const struct iostream_ssl_vfuncs *vfuncs); +/* Returns TRUE if both settings are equal. Note that NULL and "" aren't + treated equal. */ +bool ssl_iostream_settings_equals(const struct ssl_iostream_settings *set1, + const struct ssl_iostream_settings *set2); + #endif diff --git a/src/lib-ssl-iostream/iostream-ssl.c b/src/lib-ssl-iostream/iostream-ssl.c index 343f1daa9f..a7ea39efeb 100644 --- a/src/lib-ssl-iostream/iostream-ssl.c +++ b/src/lib-ssl-iostream/iostream-ssl.c @@ -262,3 +262,28 @@ void ssl_iostream_settings_init_from(pool_t pool, *dest_str = p_strdup(pool, *src_str); } } + +bool ssl_iostream_settings_equals(const struct ssl_iostream_settings *set1, + const struct ssl_iostream_settings *set2) +{ + struct ssl_iostream_settings set1_nonstr, set2_nonstr; + unsigned int i; + + set1_nonstr = *set1; + set2_nonstr = *set2; + for (i = 0; i < N_ELEMENTS(ssl_iostream_settings_string_offsets); i++) { + const size_t offset = ssl_iostream_settings_string_offsets[i]; + const char *const *str1 = CONST_PTR_OFFSET(set1, offset); + const char *const *str2 = CONST_PTR_OFFSET(set2, offset); + + if (null_strcmp(*str1, *str2) != 0) + return FALSE; + + /* clear away the string pointer from the settings struct */ + memset(PTR_OFFSET(&set1_nonstr, offset), 0, sizeof(*str1)); + memset(PTR_OFFSET(&set2_nonstr, offset), 0, sizeof(*str2)); + } + /* The set*_nonstr no longer have any pointers, so we can compare them + directly. */ + return memcmp(&set1_nonstr, &set2_nonstr, sizeof(set1_nonstr)) == 0; +}