dovecot-2.0-sslstream: anvil client: Added more features.

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 02:56:17 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/13da60f934da
changeset: 10301:13da60f934da
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Nov 10 15:07:49 2009 -0500
description:
anvil client: Added more features.

diffstat:

3 files changed, 44 insertions(+), 16 deletions(-)
src/lib-master/anvil-client.c |   48 +++++++++++++++++++++++++++++------------
src/lib-master/anvil-client.h |   10 +++++++-
src/login-common/main.c       |    2 -

diffs (137 lines):

diff -r 9702da6d3b6a -r 13da60f934da src/lib-master/anvil-client.c
--- a/src/lib-master/anvil-client.c	Tue Nov 10 15:07:12 2009 -0500
+++ b/src/lib-master/anvil-client.c	Tue Nov 10 15:07:49 2009 -0500
@@ -25,6 +25,7 @@ struct anvil_client {
 	struct aqueue *queries;
 
 	bool (*reconnect_callback)(void);
+	enum anvil_client_flags flags;
 };
 
 #define ANVIL_HANDSHAKE "VERSION\tanvil\t1\t0\n"
@@ -33,13 +34,15 @@ static void anvil_client_disconnect(stru
 static void anvil_client_disconnect(struct anvil_client *client);
 
 struct anvil_client *
-anvil_client_init(const char *path, bool (*reconnect_callback)(void))
+anvil_client_init(const char *path, bool (*reconnect_callback)(void),
+		  enum anvil_client_flags flags)
 {
 	struct anvil_client *client;
 
 	client = i_new(struct anvil_client, 1);
 	client->path = i_strdup(path);
 	client->reconnect_callback = reconnect_callback;
+	client->flags = flags;
 	client->fd = -1;
 	i_array_init(&client->queries_arr, 32);
 	client->queries = aqueue_init(&client->queries_arr.arr);
@@ -106,7 +109,11 @@ int anvil_client_connect(struct anvil_cl
 	fd = retry ? net_connect_unix_with_retries(client->path, 5000) :
 		net_connect_unix(client->path);
 	if (fd == -1) {
-		i_error("net_connect_unix(%s) failed: %m", client->path);
+		if (errno != ENOENT ||
+		    (client->flags & ANVIL_CLIENT_FLAG_HIDE_ENOENT) == 0) {
+			i_error("net_connect_unix(%s) failed: %m",
+				client->path);
+		}
 		return -1;
 	}
 
@@ -144,26 +151,39 @@ static void anvil_client_disconnect(stru
 	client->fd = -1;
 }
 
+static int anvil_client_send(struct anvil_client *client, const char *cmd)
+{
+	struct const_iovec iov[2];
+
+	if (client->fd == -1) {
+		if (anvil_client_connect(client, FALSE) < 0)
+			return -1;
+	}
+
+	iov[0].iov_base = cmd;
+	iov[0].iov_len = strlen(cmd);
+	iov[1].iov_base = "\n";
+	iov[1].iov_len = 1;
+	o_stream_sendv(client->output, iov, 2);
+	return 0;
+}
+
 void anvil_client_query(struct anvil_client *client, const char *query,
 			anvil_callback_t *callback, void *context)
 {
-	struct const_iovec iov[2];
 	struct anvil_query anvil_query;
 
-	if (client->fd == -1) {
-		if (anvil_client_connect(client, FALSE) < 0) {
-			callback(NULL, context);
-			return;
-		}
+	if (anvil_client_send(client, query) < 0) {
+		callback(NULL, context);
+		return;
 	}
-
-	iov[0].iov_base = query;
-	iov[0].iov_len = strlen(query);
-	iov[1].iov_base = "\n";
-	iov[1].iov_len = 1;
-	o_stream_sendv(client->output, iov, 2);
 
 	anvil_query.callback = callback;
 	anvil_query.context = context;
 	aqueue_append(client->queries, &anvil_query);
 }
+
+void anvil_client_cmd(struct anvil_client *client, const char *cmd)
+{
+	(void)anvil_client_send(client, cmd);
+}
diff -r 9702da6d3b6a -r 13da60f934da src/lib-master/anvil-client.h
--- a/src/lib-master/anvil-client.h	Tue Nov 10 15:07:12 2009 -0500
+++ b/src/lib-master/anvil-client.h	Tue Nov 10 15:07:49 2009 -0500
@@ -1,5 +1,10 @@
 #ifndef ANVIL_CLIENT_H
 #define ANVIL_CLIENT_H
+
+enum anvil_client_flags {
+	/* if connect() fails with ENOENT, hide the error */
+	ANVIL_CLIENT_FLAG_HIDE_ENOENT	= 0x01
+};
 
 /* reply=NULL if query failed */
 typedef void anvil_callback_t(const char *reply, void *context);
@@ -7,7 +12,8 @@ typedef void anvil_callback_t(const char
 /* If reconnect_callback is specified, it's called when connection is lost.
    If the callback returns FALSE, reconnection isn't attempted. */
 struct anvil_client *
-anvil_client_init(const char *path, bool (*reconnect_callback)(void));
+anvil_client_init(const char *path, bool (*reconnect_callback)(void),
+		  enum anvil_client_flags flags);
 void anvil_client_deinit(struct anvil_client **client);
 
 /* Connect to anvil. If retry=TRUE, try connecting for a while */
@@ -16,5 +22,7 @@ int anvil_client_connect(struct anvil_cl
 /* Send a query to anvil, expect a one line reply. */
 void anvil_client_query(struct anvil_client *client, const char *query,
 			anvil_callback_t *callback, void *context);
+/* Send a command to anvil, don't expect any replies. */
+void anvil_client_cmd(struct anvil_client *client, const char *cmd);
 
 #endif
diff -r 9702da6d3b6a -r 13da60f934da src/login-common/main.c
--- a/src/login-common/main.c	Tue Nov 10 15:07:12 2009 -0500
+++ b/src/login-common/main.c	Tue Nov 10 15:07:49 2009 -0500
@@ -140,7 +140,7 @@ static void main_preinit(bool allow_core
 		 ssl_initialized);
 
 	if (global_login_settings->mail_max_userip_connections > 0) {
-		anvil = anvil_client_init("anvil", anvil_reconnect_callback);
+		anvil = anvil_client_init("anvil", anvil_reconnect_callback, 0);
 		if (anvil_client_connect(anvil, TRUE) < 0)
 			i_fatal("Couldn't connect to anvil");
 	}


More information about the dovecot-cvs mailing list