From: Timo Sirainen Date: Sun, 11 Jul 2010 23:33:12 +0000 (+0100) Subject: doveadm director/penalty/who: Support also communicating via TCP sockets. X-Git-Tag: 2.0.rc3~81 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=91770f85d9b2ac3e91b7aa74f57149412ae33c4c;p=thirdparty%2Fdovecot%2Fcore.git doveadm director/penalty/who: Support also communicating via TCP sockets. --- diff --git a/src/doveadm/doveadm-director.c b/src/doveadm/doveadm-director.c index da3d7dfdd3..25c512f2ca 100644 --- a/src/doveadm/doveadm-director.c +++ b/src/doveadm/doveadm-director.c @@ -32,9 +32,7 @@ static void director_connect(struct director_context *ctx) const char *line; int fd; - fd = net_connect_unix(ctx->socket_path); - if (fd == -1) - i_fatal("net_connect_unix(%s) failed: %m", ctx->socket_path); + fd = doveadm_connect(ctx->socket_path); net_set_nonblock(fd, FALSE); ctx->input = i_stream_create_fd(fd, (size_t)-1, TRUE); diff --git a/src/doveadm/doveadm-penalty.c b/src/doveadm/doveadm-penalty.c index cddda375fd..d2e068d037 100644 --- a/src/doveadm/doveadm-penalty.c +++ b/src/doveadm/doveadm-penalty.c @@ -68,9 +68,7 @@ static void penalty_lookup(struct penalty_context *ctx) const char *line; int fd; - fd = net_connect_unix(ctx->anvil_path); - if (fd == -1) - i_fatal("net_connect_unix(%s) failed: %m", ctx->anvil_path); + fd = doveadm_connect(ctx->anvil_path); net_set_nonblock(fd, FALSE); input = i_stream_create_fd(fd, (size_t)-1, TRUE); diff --git a/src/doveadm/doveadm-who.c b/src/doveadm/doveadm-who.c index 461df2390c..30c638421a 100644 --- a/src/doveadm/doveadm-who.c +++ b/src/doveadm/doveadm-who.c @@ -137,9 +137,7 @@ void who_lookup(struct who_context *ctx, who_callback_t *callback) const char *line; int fd; - fd = net_connect_unix(ctx->anvil_path); - if (fd == -1) - i_fatal("net_connect_unix(%s) failed: %m", ctx->anvil_path); + fd = doveadm_connect(ctx->anvil_path); net_set_nonblock(fd, FALSE); input = i_stream_create_fd(fd, (size_t)-1, TRUE); diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index 60353bb75c..595367533d 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -5,6 +5,7 @@ #include "str.h" #include "env-util.h" #include "execv-const.h" +#include "network.h" #include "module-dir.h" #include "master-service.h" #include "master-service-settings.h" @@ -17,6 +18,7 @@ #include #include #include +#include bool doveadm_verbose = FALSE, doveadm_debug = FALSE; @@ -148,6 +150,52 @@ const char *doveadm_plugin_getenv(const char *name) return NULL; } +static bool +parse_hostport(const char *str, const char **host_r, unsigned int *port_r) +{ + const char *p; + + /* host:port */ + p = strrchr(str, ':'); + if (p == NULL || str_to_uint(p+1, port_r) < 0) + return FALSE; + *host_r = t_strdup_until(str, p); + + /* there is any '/' character (unlikely to be found from host names), + assume ':' is part of a file path */ + if (strchr(str, '/') != NULL) + return FALSE; + return TRUE; +} + +int doveadm_connect(const char *path) +{ + struct stat st; + const char *host; + struct ip_addr *ips; + unsigned int port, ips_count; + int fd, ret; + + if (parse_hostport(path, &host, &port) && stat(path, &st) < 0) { + /* it's a host:port, connect via TCP */ + ret = net_gethostbyname(host, &ips, &ips_count); + if (ret != 0) { + i_fatal("Lookup of host %s failed: %s", + host, net_gethosterror(ret)); + } + fd = net_connect_ip_blocking(&ips[0], port, NULL); + if (fd == -1) { + i_fatal("connect(%s:%u) failed: %m", + net_ip2addr(&ips[0]), port); + } + } else { + fd = net_connect_unix(path); + if (fd == -1) + i_fatal("net_connect_unix(%s) failed: %m", path); + } + return fd; +} + static bool doveadm_has_subcommands(const char *cmd_name) { const struct doveadm_cmd *cmd; diff --git a/src/doveadm/doveadm.h b/src/doveadm/doveadm.h index f5ab19a11b..c62c4aab6e 100644 --- a/src/doveadm/doveadm.h +++ b/src/doveadm/doveadm.h @@ -34,6 +34,7 @@ void help(const struct doveadm_cmd *cmd) ATTR_NORETURN; const char *unixdate2str(time_t timestamp); const char *doveadm_plugin_getenv(const char *name); +int doveadm_connect(const char *path); void doveadm_master_send_signal(int signo); void doveadm_register_director_commands(void);