From 1bea4b9c24fbe2b457950c09cf072292a6701cff Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 4 Sep 2009 17:34:18 -0400 Subject: [PATCH] anvil: Stop immediately when master asks, instead of waiting for clients to finish. --HG-- branch : HEAD --- src/anvil/main.c | 1 + src/lib-master/master-service.c | 9 +++++++-- src/login-common/sasl-server.c | 8 +++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/anvil/main.c b/src/anvil/main.c index 18b991be00..06a6d1268e 100644 --- a/src/anvil/main.c +++ b/src/anvil/main.c @@ -30,6 +30,7 @@ int main(int argc, char *argv[]) exit(FATAL_DEFAULT); } + master_service_set_die_with_master(master_service, TRUE); master_service_init_log(master_service, "anvil: ", 0); master_service_init_finish(master_service); connect_limit = connect_limit_init(); diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 2d88ca0b13..151934dac0 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -416,9 +416,14 @@ void master_service_anvil_send(struct master_service *service, const char *cmd) return; ret = write(MASTER_ANVIL_FD, cmd, strlen(cmd)); - if (ret < 0) + if (ret < 0) { + if (errno == EPIPE) { + /* anvil process was probably recreated, don't bother + logging an error about losing connection to it */ + return; + } i_error("write(anvil) failed: %m"); - else if (ret == 0) + } else if (ret == 0) i_error("write(anvil) failed: EOF"); else { i_assert((size_t)ret == strlen(cmd)); diff --git a/src/login-common/sasl-server.c b/src/login-common/sasl-server.c index 0796b2eeea..460ee6913c 100644 --- a/src/login-common/sasl-server.c +++ b/src/login-common/sasl-server.c @@ -138,8 +138,14 @@ static bool anvil_has_too_many_connections(struct client *client) ident = t_strconcat("LOOKUP\t", net_ip2addr(&client->ip), "/", str_tabescape(client->virtual_user), "/", login_protocol, "\n", NULL); - if (write_full(anvil_fd, ident, strlen(ident)) < 0) + if (write_full(anvil_fd, ident, strlen(ident)) < 0) { + if (errno == EPIPE) { + /* anvil process was probably recreated, don't bother + logging an error about losing connection to it */ + return FALSE; + } i_fatal("write(anvil) failed: %m"); + } ret = read(anvil_fd, buf, sizeof(buf)-1); if (ret < 0) i_fatal("read(anvil) failed: %m"); -- 2.47.3