]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
anvil client: Added more features.
authorTimo Sirainen <tss@iki.fi>
Tue, 10 Nov 2009 20:07:49 +0000 (15:07 -0500)
committerTimo Sirainen <tss@iki.fi>
Tue, 10 Nov 2009 20:07:49 +0000 (15:07 -0500)
--HG--
branch : HEAD

src/lib-master/anvil-client.c
src/lib-master/anvil-client.h
src/login-common/main.c

index 20741cdc784d4b0b71226fa62649729c2917f523..a19e000c5cb48de9f5102cb2450a8ce2e8bf2f1e 100644 (file)
@@ -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 @@ struct anvil_client {
 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_client *client, bool retry)
        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(struct anvil_client *client)
        client->fd = -1;
 }
 
-void anvil_client_query(struct anvil_client *client, const char *query,
-                       anvil_callback_t *callback, void *context)
+static int anvil_client_send(struct anvil_client *client, const char *cmd)
 {
        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_connect(client, FALSE) < 0)
+                       return -1;
        }
 
-       iov[0].iov_base = query;
-       iov[0].iov_len = strlen(query);
+       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 anvil_query anvil_query;
+
+       if (anvil_client_send(client, query) < 0) {
+               callback(NULL, context);
+               return;
+       }
 
        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);
+}
index c7c5836a37543bfc9d7e464db8c9e36fc5a1aabc..f4f057fdbf70576ba6e88743d2752cb5853d7926 100644 (file)
@@ -1,13 +1,19 @@
 #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);
 
 /* 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_client *client, bool retry);
 /* 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
index b292f52fe1d29a77c198c28af1ff5c72bfaa6ced..601327e03e946cf67d11ea1c390f9519503db0ec 100644 (file)
@@ -140,7 +140,7 @@ static void main_preinit(bool allow_core_dumps)
                 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");
        }