Mercurial > dovecot > core-2.2
diff src/director/doveadm-connection.c @ 11355:ef1de95396d4 HEAD
Added doveadm director flush command for dropping user associations from memory.
This should probably mainly be used for testing.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 20 May 2010 13:35:38 +0200 |
parents | 1bc3d5589c5a |
children | 26cfc1c3a4b1 |
line wrap: on
line diff
--- a/src/director/doveadm-connection.c Thu May 20 13:17:30 2010 +0200 +++ b/src/director/doveadm-connection.c Thu May 20 13:35:38 2010 +0200 @@ -103,7 +103,7 @@ struct ip_addr ip; if (net_addr2ip(line, &ip) < 0) { - i_error("doveadm sent invalid HOST-SET parameters"); + i_error("doveadm sent invalid HOST-REMOVE parameters"); return FALSE; } host = mail_host_lookup(conn->dir->mail_hosts, &ip); @@ -116,6 +116,41 @@ return TRUE; } +static void +doveadm_cmd_host_flush_all(struct doveadm_connection *conn) +{ + struct mail_host *const *hostp; + + array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) + director_flush_host(conn->dir, conn->dir->self_host, *hostp); + o_stream_send(conn->output, "OK\n", 3); +} + +static bool +doveadm_cmd_host_flush(struct doveadm_connection *conn, const char *line) +{ + struct mail_host *host; + struct ip_addr ip; + + if (*line == '\0') { + doveadm_cmd_host_flush_all(conn); + return TRUE; + } + + if (net_addr2ip(line, &ip) < 0) { + i_error("doveadm sent invalid HOST-FLUSH parameters"); + return FALSE; + } + host = mail_host_lookup(conn->dir->mail_hosts, &ip); + if (host == NULL) + o_stream_send_str(conn->output, "NOTFOUND\n"); + else { + director_flush_host(conn->dir, conn->dir->self_host, host); + o_stream_send(conn->output, "OK\n", 3); + } + return TRUE; +} + static bool doveadm_cmd_user_lookup(struct doveadm_connection *conn, const char *line) { @@ -156,7 +191,7 @@ static void doveadm_connection_input(struct doveadm_connection *conn) { - const char *line; + const char *line, *cmd, *args; bool ret = TRUE; if (!conn->handshaked) { @@ -174,16 +209,27 @@ } while ((line = i_stream_read_next_line(conn->input)) != NULL && ret) { - if (strcmp(line, "HOST-LIST") == 0) + args = strchr(line, '\t'); + if (args == NULL) { + cmd = line; + args = ""; + } else { + cmd = t_strdup_until(line, args); + args++; + } + + if (strcmp(cmd, "HOST-LIST") == 0) doveadm_cmd_host_list(conn); - else if (strcmp(line, "DIRECTOR-LIST") == 0) + else if (strcmp(cmd, "DIRECTOR-LIST") == 0) doveadm_cmd_director_list(conn); - else if (strncmp(line, "HOST-SET\t", 9) == 0) - ret = doveadm_cmd_host_set(conn, line + 9); - else if (strncmp(line, "HOST-REMOVE\t", 12) == 0) - ret = doveadm_cmd_host_remove(conn, line + 12); - else if (strncmp(line, "USER-LOOKUP\t", 12) == 0) - ret = doveadm_cmd_user_lookup(conn, line + 12); + else if (strcmp(cmd, "HOST-SET") == 0) + ret = doveadm_cmd_host_set(conn, args); + else if (strcmp(cmd, "HOST-REMOVE") == 0) + ret = doveadm_cmd_host_remove(conn, args); + else if (strcmp(cmd, "HOST-FLUSH") == 0) + ret = doveadm_cmd_host_flush(conn, args); + else if (strcmp(cmd, "USER-LOOKUP") == 0) + ret = doveadm_cmd_user_lookup(conn, args); else { i_error("doveadm sent unknown command: %s", line); ret = FALSE;