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