From 437cef075caec19a8150e0c4c04ef64a1a5e9d94 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 26 Jul 2019 18:15:23 +0100 Subject: [PATCH] [Minor] Rework rspamd_parse_host_port_priority function result --- src/libserver/cfg_file.h | 1 + src/libserver/cfg_rcl.c | 6 ++++ src/libserver/cfg_utils.c | 4 +-- src/libutil/addr.c | 58 +++++++++++++++++++-------------------- src/libutil/addr.h | 16 +++++++---- src/rspamadm/lua_repl.c | 4 +-- 6 files changed, 51 insertions(+), 38 deletions(-) diff --git a/src/libserver/cfg_file.h b/src/libserver/cfg_file.h index de00ab128..39d997754 100644 --- a/src/libserver/cfg_file.h +++ b/src/libserver/cfg_file.h @@ -450,6 +450,7 @@ struct rspamd_config { guint upstream_max_errors; /**< upstream max errors before shutting off */ gdouble upstream_error_time; /**< rate of upstream errors */ gdouble upstream_revive_time; /**< revive timeout for upstreams */ + gdouble upstream_lazy_resolve_time; /**< lazy resolve time for upstreams */ struct upstream_ctx *ups_ctx; /**< upstream context */ struct rspamd_dns_resolver *dns_resolver; /**< dns resolver if loaded */ diff --git a/src/libserver/cfg_rcl.c b/src/libserver/cfg_rcl.c index 0a40cdd72..5b67a5f61 100644 --- a/src/libserver/cfg_rcl.c +++ b/src/libserver/cfg_rcl.c @@ -2223,6 +2223,12 @@ rspamd_rcl_config_init (struct rspamd_config *cfg, GHashTable *skip_sections) G_STRUCT_OFFSET (struct rspamd_config, upstream_revive_time), RSPAMD_CL_FLAG_TIME_FLOAT, "Time before attempting to recover upstream after an error"); + rspamd_rcl_add_default_handler (ssub, + "lazy_resolve_time", + rspamd_rcl_parse_struct_time, + G_STRUCT_OFFSET (struct rspamd_config, upstream_lazy_resolve_time), + RSPAMD_CL_FLAG_TIME_FLOAT, + "Time to resolve upstreams addresses in lazy mode"); } if (!(skip_sections && g_hash_table_lookup (skip_sections, "actions"))) { diff --git a/src/libserver/cfg_utils.c b/src/libserver/cfg_utils.c index d6dc95527..4348f7940 100644 --- a/src/libserver/cfg_utils.c +++ b/src/libserver/cfg_utils.c @@ -106,8 +106,8 @@ rspamd_parse_bind_line (struct rspamd_config *cfg, } } else { - if (!rspamd_parse_host_port_priority (str, &cnf->addrs, - NULL, &cnf->name, DEFAULT_BIND_PORT, cfg->cfg_pool)) { + if (rspamd_parse_host_port_priority (str, &cnf->addrs, + NULL, &cnf->name, DEFAULT_BIND_PORT, cfg->cfg_pool) == RSPAMD_PARSE_ADDR_FAIL) { msg_err_config ("cannot parse bind line: %s", str); ret = FALSE; } diff --git a/src/libutil/addr.c b/src/libutil/addr.c index 112c5d2cd..d6a1be471 100644 --- a/src/libutil/addr.c +++ b/src/libutil/addr.c @@ -1211,7 +1211,7 @@ rspamd_check_port_priority (const char *line, guint default_port, return TRUE; } -static gboolean +static enum rspamd_parse_host_port_result rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs, const gchar *portbuf, gint flags, rspamd_mempool_t *pool) @@ -1220,6 +1220,7 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs, rspamd_inet_addr_t *cur_addr = NULL; gint r, addr_cnt; gchar *addr_cpy = NULL; + enum rspamd_parse_host_port_result ret = RSPAMD_PARSE_ADDR_FAIL; rspamd_ip_check_ipv6 (); @@ -1236,6 +1237,7 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs, rspamd_inet_address_set_port (cur_addr, strtoul (portbuf, NULL, 10)); g_ptr_array_add (*addrs, cur_addr); + ret = RSPAMD_PARSE_ADDR_NUMERIC; } else { memset (&hints, 0, sizeof (hints)); @@ -1292,6 +1294,7 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs, } freeaddrinfo (res); + ret = RSPAMD_PARSE_ADDR_RESOLVED; } else if (addr_cpy) { msg_err_pool_check ("address resolution for %s failed: %s", @@ -1302,7 +1305,7 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs, g_free (addr_cpy); } - return FALSE; + return RSPAMD_PARSE_ADDR_FAIL; } else { /* Should never ever happen */ @@ -1310,21 +1313,22 @@ rspamd_resolve_addrs (const char *begin, size_t len, GPtrArray **addrs, } } - return TRUE; + return ret; } -gboolean +enum rspamd_parse_host_port_result rspamd_parse_host_port_priority (const gchar *str, - GPtrArray **addrs, - guint *priority, - gchar **name_ptr, - guint default_port, - rspamd_mempool_t *pool) + GPtrArray **addrs, + guint *priority, + gchar **name_ptr, + guint default_port, + rspamd_mempool_t *pool) { gchar portbuf[8]; const gchar *p, *name = NULL; gsize namelen; rspamd_inet_addr_t *cur_addr = NULL; + enum rspamd_parse_host_port_result ret = RSPAMD_PARSE_ADDR_FAIL; /* * In this function, we can have several possibilities: @@ -1337,15 +1341,17 @@ rspamd_parse_host_port_priority (const gchar *str, if (str[0] == '*') { if (!rspamd_check_port_priority (str + 1, default_port, priority, portbuf, sizeof (portbuf), pool)) { - return FALSE; + return ret; } - if (!rspamd_resolve_addrs (str, 0, addrs, portbuf, AI_PASSIVE, pool)) { - return FALSE; + if (rspamd_resolve_addrs (str, 0, addrs, portbuf, AI_PASSIVE, pool) + == RSPAMD_PARSE_ADDR_FAIL) { + return ret; } name = "*"; namelen = 1; + ret = RSPAMD_PARSE_ADDR_NUMERIC; /* No resolution here */ } else if (str[0] == '[') { /* This is braced IPv6 address */ @@ -1356,7 +1362,7 @@ rspamd_parse_host_port_priority (const gchar *str, str, strerror (EINVAL)); - return FALSE; + return ret; } name = str + 1; @@ -1364,13 +1370,10 @@ rspamd_parse_host_port_priority (const gchar *str, if (!rspamd_check_port_priority (p + 1, default_port, priority, portbuf, sizeof (portbuf), pool)) { - return FALSE; + return ret; } - if (!rspamd_resolve_addrs (name, namelen, addrs, - portbuf, 0, pool)) { - return FALSE; - } + ret = rspamd_resolve_addrs (name, namelen, addrs, portbuf, 0, pool); } else if (str[0] == '/' || str[0] == '.') { /* Special case of unix socket, as getaddrinfo cannot deal with them */ @@ -1389,12 +1392,13 @@ rspamd_parse_host_port_priority (const gchar *str, str, strerror (errno)); - return FALSE; + return ret; } g_ptr_array_add (*addrs, cur_addr); name = str; namelen = strlen (str); + ret = RSPAMD_PARSE_ADDR_NUMERIC; /* No resolution here: unix socket */ } else { p = strchr (str, ':'); @@ -1406,10 +1410,8 @@ rspamd_parse_host_port_priority (const gchar *str, rspamd_check_port_priority ("", default_port, priority, portbuf, sizeof (portbuf), pool); - if (!rspamd_resolve_addrs (name, namelen, addrs, - portbuf, 0, pool)) { - return FALSE; - } + ret = rspamd_resolve_addrs (name, namelen, addrs, + portbuf, 0, pool); } else { name = str; @@ -1417,13 +1419,11 @@ rspamd_parse_host_port_priority (const gchar *str, if (!rspamd_check_port_priority (p, default_port, priority, portbuf, sizeof (portbuf), pool)) { - return FALSE; + return ret; } - if (!rspamd_resolve_addrs (str, p - str, addrs, - portbuf, 0, pool)) { - return FALSE; - } + ret = rspamd_resolve_addrs (str, p - str, addrs, + portbuf, 0, pool); } } @@ -1438,7 +1438,7 @@ rspamd_parse_host_port_priority (const gchar *str, rspamd_strlcpy (*name_ptr, name, namelen + 1); } - return TRUE; + return ret; } guchar* diff --git a/src/libutil/addr.h b/src/libutil/addr.h index fe00ccc86..06413a51a 100644 --- a/src/libutil/addr.h +++ b/src/libutil/addr.h @@ -240,17 +240,23 @@ gint rspamd_accept_from_socket (gint sock, rspamd_accept_throttling_handler hdl, void *hdl_data); +enum rspamd_parse_host_port_result { + RSPAMD_PARSE_ADDR_FAIL = 0, + RSPAMD_PARSE_ADDR_RESOLVED = 1, + RSPAMD_PARSE_ADDR_NUMERIC = 2, +}; /** * Parse host[:port[:priority]] line * @param ina host address * @param port port * @param priority priority - * @return TRUE if string was parsed + * @return RSPAMD_PARSE_ADDR_FAIL in case of error, RSPAMD_PARSE_ADDR_NUMERIC in case of pure ip/unix socket */ -gboolean rspamd_parse_host_port_priority (const gchar *str, - GPtrArray **addrs, - guint *priority, gchar **name, guint default_port, - rspamd_mempool_t *pool); +enum rspamd_parse_host_port_result +rspamd_parse_host_port_priority (const gchar *str, + GPtrArray **addrs, + guint *priority, gchar **name, guint default_port, + rspamd_mempool_t *pool); /** * Destroy the specified IP address diff --git a/src/rspamadm/lua_repl.c b/src/rspamadm/lua_repl.c index 59e3db02c..4cd68185d 100644 --- a/src/rspamadm/lua_repl.c +++ b/src/rspamadm/lua_repl.c @@ -799,8 +799,8 @@ rspamadm_lua (gint argc, gchar **argv, const struct rspamadm_command *cmd) gint fd; struct rspamadm_lua_repl_context *ctx; - if (!rspamd_parse_host_port_priority (serve, &addrs, NULL, &name, - 10000, NULL)) { + if (rspamd_parse_host_port_priority (serve, &addrs, NULL, &name, + 10000, NULL) == RSPAMD_PARSE_ADDR_FAIL) { fprintf (stderr, "cannot listen on %s", serve); exit (EXIT_FAILURE); } -- 2.39.5