dovecot-2.2: Removed CONTEXT_TYPE_SAFETY macro and reimplemented...

dovecot at dovecot.org dovecot at dovecot.org
Sun Aug 19 16:17:47 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/d3db2ba15d00
changeset: 14921:d3db2ba15d00
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Aug 19 16:17:32 2012 +0300
description:
Removed CONTEXT_TYPE_SAFETY macro and reimplemented its functionality better.
gcc/clang now gives a compiler error in many places if callback isn't
exactly what was expected. It's also now much easier to add more of these
checks.

diffstat:

 src/anvil/anvil-connection.c                             |   5 +-
 src/auth/auth-request-handler.h                          |  16 +++-----
 src/auth/db-dict.c                                       |   3 +-
 src/auth/db-ldap.c                                       |   3 +-
 src/auth/db-sql.c                                        |   3 +-
 src/config/config-connection.c                           |   3 +-
 src/doveadm/doveadm-mail-mailbox.c                       |   4 +-
 src/doveadm/doveadm-stats.c                              |   2 +-
 src/doveadm/doveadm.c                                    |   6 +-
 src/imap/imap-fetch.h                                    |  15 ++-----
 src/indexer/indexer-client.c                             |   3 +-
 src/lib-dns/dns-lookup.c                                 |   4 +-
 src/lib-dns/dns-lookup.h                                 |  11 +++--
 src/lib-imap-storage/imap-msgpart.c                      |   6 ++-
 src/lib-index/mail-index-util.c                          |  16 ++-----
 src/lib-lda/mail-send.c                                  |   5 +-
 src/lib-mail/istream-header-filter.c                     |   8 ++--
 src/lib-mail/istream-header-filter.h                     |  19 +++------
 src/lib-mail/message-header-parser.h                     |  15 ++-----
 src/lib-mail/message-parser.h                            |  30 +++++----------
 src/lib-mail/test-istream-header-filter.c                |   8 ++-
 src/lib-master/master-service.c                          |   4 +-
 src/lib-settings/settings.c                              |   7 +--
 src/lib-settings/settings.h                              |  30 ++++++++-------
 src/lib-sql/sql-api.h                                    |  27 ++++---------
 src/lib-storage/index/dbox-multi/mdbox-purge.c           |   5 +-
 src/lib-storage/index/dbox-multi/mdbox-storage-rebuild.c |  14 +++----
 src/lib-storage/index/imapc/imapc-mail-fetch.c           |   2 +-
 src/lib-storage/index/index-mail-binary.c                |   2 +-
 src/lib-storage/index/index-mail.c                       |   2 +-
 src/lib-storage/index/index-search.c                     |   7 +--
 src/lib-storage/index/index-sort-string.c                |   5 +-
 src/lib-storage/index/index-thread.c                     |   6 +--
 src/lib-storage/index/maildir/maildir-mail.c             |   3 +-
 src/lib-storage/index/maildir/maildir-storage.h          |  15 ++-----
 src/lib-storage/index/maildir/maildir-sync-index.c       |   4 +-
 src/lib-storage/index/mbox/mbox-mail.c                   |   2 +-
 src/lib-storage/index/pop3c/pop3c-sync.c                 |   4 +-
 src/lib-storage/mail-search.h                            |  13 ++----
 src/lib-storage/mail-storage.h                           |  14 ++-----
 src/lib-storage/mailbox-header.c                         |   2 +-
 src/lib/array.h                                          |  27 ++++----------
 src/lib/bsearch-insert-pos.c                             |   1 +
 src/lib/bsearch-insert-pos.h                             |  22 +++++-----
 src/lib/child-wait.h                                     |  14 ++----
 src/lib/connection.c                                     |   2 +-
 src/lib/ioloop.h                                         |  30 ++++++++--------
 src/lib/istream.h                                        |   5 +-
 src/lib/macros.h                                         |  17 ++------
 src/lib/module-dir.c                                     |   2 +-
 src/lib/ostream.h                                        |   5 +-
 src/lib/strfuncs.c                                       |  18 ++-------
 src/lib/strfuncs.h                                       |  20 ++++++++--
 src/lib/test-bsearch-insert-pos.c                        |   4 +-
 src/plugins/acl/acl-backend.c                            |   8 ++--
 src/plugins/fts-squat/squat-uidlist.c                    |   6 +--
 src/plugins/pop3-migration/pop3-migration-plugin.c       |   2 +-
 57 files changed, 218 insertions(+), 318 deletions(-)

diffs (truncated from 1272 to 300 lines):

diff -r a097ef0a9d6d -r d3db2ba15d00 src/anvil/anvil-connection.c
--- a/src/anvil/anvil-connection.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/anvil/anvil-connection.c	Sun Aug 19 16:17:32 2012 +0300
@@ -129,9 +129,8 @@
 	return 0;
 }
 
-static void anvil_connection_input(void *context)
+static void anvil_connection_input(struct anvil_connection *conn)
 {
-	struct anvil_connection *conn = context;
 	const char *line, *const *args, *error;
 
 	switch (i_stream_read(conn->input)) {
@@ -153,7 +152,7 @@
 			if (anvil_restarted && (conn->master || conn->fifo)) {
 				/* old pending data. ignore input until we get
 				   the handshake. */
-				anvil_connection_input(context);
+				anvil_connection_input(conn);
 				return;
 			}
 			i_error("Anvil client not compatible with this server "
diff -r a097ef0a9d6d -r d3db2ba15d00 src/auth/auth-request-handler.h
--- a/src/auth/auth-request-handler.h	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/auth/auth-request-handler.h	Sun Aug 19 16:17:32 2012 +0300
@@ -17,18 +17,14 @@
 struct auth_request_handler *
 auth_request_handler_create(auth_request_callback_t *callback, void *context,
 			    auth_request_callback_t *master_callback);
-#ifdef CONTEXT_TYPE_SAFETY
-#  define auth_request_handler_create(callback, context, master_callback)\
-	({(void)(1 ? 0 : callback((struct auth_stream_reply *)NULL, context)); \
+#define auth_request_handler_create(callback, context, master_callback)\
 	  auth_request_handler_create( \
-		(auth_request_callback_t *)callback, context, \
-		master_callback); })
-#else
-#  define auth_request_handler_create(callback, context, master_callback)\
-	  auth_request_handler_create( \
-		(auth_request_callback_t *)callback, context, \
+		(auth_request_callback_t *)callback, \
+		(void *)((char*)context + \
+			CALLBACK_TYPECHECK(callback, void (*)( \
+				struct auth_stream_reply *, typeof(context)))), \
 		master_callback)
-#endif
+
 void auth_request_handler_destroy(struct auth_request_handler **handler);
 void auth_request_handler_unref(struct auth_request_handler **handler);
 void auth_request_handler_abort_requests(struct auth_request_handler *handler);
diff -r a097ef0a9d6d -r d3db2ba15d00 src/auth/db-dict.c
--- a/src/auth/db-dict.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/auth/db-dict.c	Sun Aug 19 16:17:32 2012 +0300
@@ -81,8 +81,7 @@
 
 	conn->config_path = p_strdup(pool, config_path);
 	conn->set = default_dict_settings;
-	if (!settings_read(config_path, NULL, parse_setting,
-			   null_settings_section_callback, conn))
+	if (!settings_read_nosection(config_path, parse_setting, conn))
 		exit(FATAL_DEFAULT);
 
 	if (conn->set.uri == NULL)
diff -r a097ef0a9d6d -r d3db2ba15d00 src/auth/db-ldap.c
--- a/src/auth/db-ldap.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/auth/db-ldap.c	Sun Aug 19 16:17:32 2012 +0300
@@ -1402,8 +1402,7 @@
 	conn->fd = -1;
 	conn->config_path = p_strdup(pool, config_path);
 	conn->set = default_ldap_settings;
-	if (!settings_read(config_path, NULL, parse_setting,
-			   null_settings_section_callback, conn))
+	if (!settings_read_nosection(config_path, parse_setting, conn))
 		exit(FATAL_DEFAULT);
 
 	if (conn->set.base == NULL)
diff -r a097ef0a9d6d -r d3db2ba15d00 src/auth/db-sql.c
--- a/src/auth/db-sql.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/auth/db-sql.c	Sun Aug 19 16:17:32 2012 +0300
@@ -86,8 +86,7 @@
 
 	conn->config_path = p_strdup(pool, config_path);
 	conn->set = default_sql_settings;
-	if (!settings_read(config_path, NULL, parse_setting,
-			   null_settings_section_callback, conn))
+	if (!settings_read_nosection(config_path, parse_setting, conn))
 		exit(FATAL_DEFAULT);
 
 	if (conn->set.password_query == default_sql_settings.password_query)
diff -r a097ef0a9d6d -r d3db2ba15d00 src/config/config-connection.c
--- a/src/config/config-connection.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/config/config-connection.c	Sun Aug 19 16:17:32 2012 +0300
@@ -140,9 +140,8 @@
 	return 0;
 }
 
-static void config_connection_input(void *context)
+static void config_connection_input(struct config_connection *conn)
 {
-	struct config_connection *conn = context;
 	const char *const *args, *line;
 
 	switch (i_stream_read(conn->input)) {
diff -r a097ef0a9d6d -r d3db2ba15d00 src/doveadm/doveadm-mail-mailbox.c
--- a/src/doveadm/doveadm-mail-mailbox.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/doveadm/doveadm-mail-mailbox.c	Sun Aug 19 16:17:32 2012 +0300
@@ -261,10 +261,8 @@
 	return &ctx->ctx.ctx;
 }
 
-static int i_strcmp_reverse_p(const void *p1, const void *p2)
+static int i_strcmp_reverse_p(const char *const *s1, const char *const *s2)
 {
-	const char *const *s1 = p1, *const *s2 = p2;
-
 	return -strcmp(*s1, *s2);
 }
 
diff -r a097ef0a9d6d -r d3db2ba15d00 src/doveadm/doveadm-stats.c
--- a/src/doveadm/doveadm-stats.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/doveadm/doveadm-stats.c	Sun Aug 19 16:17:32 2012 +0300
@@ -372,7 +372,7 @@
 	stats_drop_stale(ctx);
 
 	sort_ctx = ctx;
-	array_sort(&ctx->lines, ctx->lines_sort);
+	array_sort(&ctx->lines, *ctx->lines_sort);
 	sort_ctx = NULL;
 	return TRUE;
 }
diff -r a097ef0a9d6d -r d3db2ba15d00 src/doveadm/doveadm.c
--- a/src/doveadm/doveadm.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/doveadm/doveadm.c	Sun Aug 19 16:17:32 2012 +0300
@@ -55,15 +55,15 @@
 doveadm_usage_compress_lines(FILE *out, const char *str, const char *prefix)
 {
 	const char *cmd, *args, *p, *short_name, *prev_name = "";
-	char **lines;
+	const char **lines;
 	unsigned int i, count, prefix_len = strlen(prefix);
 
 	/* split lines */
-	lines = p_strsplit(pool_datastack_create(), str, "\n");
+	lines = (void *)p_strsplit(pool_datastack_create(), str, "\n");
 	for (count = 0; lines[count] != NULL; count++) ;
 
 	/* sort lines */
-	qsort(lines, count, sizeof(*lines), i_strcmp_p);
+	i_qsort(lines, count, sizeof(*lines), i_strcmp_p);
 
 	/* print lines, compress subcommands into a single line */
 	for (i = 0; i < count; i++) {
diff -r a097ef0a9d6d -r d3db2ba15d00 src/imap/imap-fetch.h
--- a/src/imap/imap-fetch.h	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/imap/imap-fetch.h	Sun Aug 19 16:17:32 2012 +0300
@@ -97,17 +97,12 @@
 			    const char *nil_reply,
 			    imap_fetch_handler_t *handler, void *context)
 	ATTR_NULL(3, 5);
-#ifdef CONTEXT_TYPE_SAFETY
-#  define imap_fetch_add_handler(ctx, flags, nil_reply, handler, context) \
-	({(void)(1 ? 0 : handler((struct imap_fetch_context *)NULL, \
-				 (struct mail *)NULL, context)); \
-	  imap_fetch_add_handler(ctx, flags, nil_reply, \
-		(imap_fetch_handler_t *)handler, context); })
-#else
-#  define imap_fetch_add_handler(ctx, flags, nil_reply, handler, context) \
-	  imap_fetch_add_handler(ctx, flags, nil_reply, \
+#define imap_fetch_add_handler(ctx, flags, nil_reply, handler, context) \
+	  imap_fetch_add_handler(ctx, flags, nil_reply + \
+		CALLBACK_TYPECHECK(handler, int (*)( \
+			struct imap_fetch_context *, struct mail *, \
+			typeof(context))), \
 		(imap_fetch_handler_t *)handler, context)
-#endif
 
 int imap_fetch_att_list_parse(struct client *client, pool_t pool,
 			      const struct imap_arg *list,
diff -r a097ef0a9d6d -r d3db2ba15d00 src/indexer/indexer-client.c
--- a/src/indexer/indexer-client.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/indexer/indexer-client.c	Sun Aug 19 16:17:32 2012 +0300
@@ -147,9 +147,8 @@
 	}
 }
 
-static void indexer_client_input(void *context)
+static void indexer_client_input(struct indexer_client *client)
 {
-	struct indexer_client *client = context;
 	const char *line, *const *args, *error;
 
 	switch (i_stream_read(client->input)) {
diff -r a097ef0a9d6d -r d3db2ba15d00 src/lib-dns/dns-lookup.c
--- a/src/lib-dns/dns-lookup.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/lib-dns/dns-lookup.c	Sun Aug 19 16:17:32 2012 +0300
@@ -121,8 +121,8 @@
 
 #undef dns_lookup
 int dns_lookup(const char *host, const struct dns_lookup_settings *set,
-	       struct dns_lookup **lookup_r,
-	       dns_lookup_callback_t *callback, void *context)
+	       dns_lookup_callback_t *callback, void *context,
+	       struct dns_lookup **lookup_r)
 {
 	struct dns_lookup *lookup;
 	struct dns_lookup_result result;
diff -r a097ef0a9d6d -r d3db2ba15d00 src/lib-dns/dns-lookup.h
--- a/src/lib-dns/dns-lookup.h	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/lib-dns/dns-lookup.h	Sun Aug 19 16:17:32 2012 +0300
@@ -29,12 +29,13 @@
    When failing with -1, the callback is called before returning from the
    function. */
 int dns_lookup(const char *host, const struct dns_lookup_settings *set,
-	       struct dns_lookup **lookup_r,
-	       dns_lookup_callback_t *callback, void *context) ATTR_NULL(5);
+	       dns_lookup_callback_t *callback, void *context,
+	       struct dns_lookup **lookup_r) ATTR_NULL(4);
 #define dns_lookup(host, set, callback, context, lookup_r) \
-	CONTEXT_CALLBACK2(dns_lookup, dns_lookup_callback_t, \
-			  callback, const struct dns_lookup_result *, \
-			  context, host, set, lookup_r)
+	dns_lookup(host + \
+		CALLBACK_TYPECHECK(callback, void (*)( \
+			const struct dns_lookup_result *, typeof(context))), \
+		set, (dns_lookup_callback_t *)callback, context, lookup_r)
 /* Abort the DNS lookup without calling the callback. */
 void dns_lookup_abort(struct dns_lookup **lookup);
 
diff -r a097ef0a9d6d -r d3db2ba15d00 src/lib-imap-storage/imap-msgpart.c
--- a/src/lib-imap-storage/imap-msgpart.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/lib-imap-storage/imap-msgpart.c	Sun Aug 19 16:17:32 2012 +0300
@@ -339,14 +339,16 @@
 						      HEADER_FILTER_INCLUDE |
 						      HEADER_FILTER_HIDE_BODY,
 						      hdr_fields, hdr_count,
-						      null_header_filter_callback, NULL);
+						      *null_header_filter_callback,
+						      (void *)NULL);
 	} else {
 		i_assert(msgpart->fetch_type == FETCH_HEADER_FIELDS_NOT);
 		input = i_stream_create_header_filter(mail_input,
 						      HEADER_FILTER_EXCLUDE |
 						      HEADER_FILTER_HIDE_BODY,
 						      hdr_fields, hdr_count,
-						      null_header_filter_callback, NULL);
+						      *null_header_filter_callback,
+						      (void *)NULL);
 	}
 
 	if (message_get_header_size(input, hdr_size_r, &has_nuls) < 0) {
diff -r a097ef0a9d6d -r d3db2ba15d00 src/lib-index/mail-index-util.c
--- a/src/lib-index/mail-index-util.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/lib-index/mail-index-util.c	Sun Aug 19 16:17:32 2012 +0300
@@ -103,23 +103,17 @@
 	return 0;
 }
 
-static int mail_index_seq_record_cmp(const void *key, const void *data)
+static int mail_index_seq_record_cmp(const uint32_t *key_seq,
+				     const uint32_t *data_seq)
 {
-	const uint32_t *seq_p = key;
-	const uint32_t *data_seq = data;
-
-	return *seq_p - *data_seq;
+	return *key_seq - *data_seq;
 }
 
 bool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array,
 				 uint32_t seq, unsigned int *idx_r)
 {
-	const void *base;
-	unsigned int count;
-
-	base = array_get(array, &count);
-	return bsearch_insert_pos(&seq, base, count, array->arr.element_size,
-				  mail_index_seq_record_cmp, idx_r);
+	return array_bsearch_insert_pos(array, &seq,
+					mail_index_seq_record_cmp, idx_r);
 }
 
 bool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq,
diff -r a097ef0a9d6d -r d3db2ba15d00 src/lib-lda/mail-send.c
--- a/src/lib-lda/mail-send.c	Sun Aug 19 14:21:37 2012 +0300
+++ b/src/lib-lda/mail-send.c	Sun Aug 19 16:17:32 2012 +0300
@@ -169,7 +169,7 @@
 	    		HEADER_FILTER_EXCLUDE | HEADER_FILTER_NO_CR |
 			HEADER_FILTER_HIDE_BODY, exclude_headers,
 			N_ELEMENTS(exclude_headers),
-			null_header_filter_callback, NULL);
+			*null_header_filter_callback, (void *)NULL);
 
 	    ret = o_stream_send_istream(output, input);
 	    i_stream_unref(&input);
@@ -207,7 +207,8 @@
     input = i_stream_create_header_filter(input, HEADER_FILTER_EXCLUDE |
                                           HEADER_FILTER_NO_CR, hide_headers,
                                           N_ELEMENTS(hide_headers),
-					  null_header_filter_callback, NULL);


More information about the dovecot-cvs mailing list