aboutsummaryrefslogtreecommitdiffstats
path: root/src/libutil/addr.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2020-08-23 11:46:32 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2020-08-23 11:46:32 +0100
commit1b6b3012ea9e7cac196b56ab46b678bcbe2b056e (patch)
tree1ab6be665d597d907be74f45d71c6106337810bf /src/libutil/addr.c
parent3f0f843468f2c7922141748b04faf7faf34dcf1d (diff)
downloadrspamd-1b6b3012ea9e7cac196b56ab46b678bcbe2b056e.tar.gz
rspamd-1b6b3012ea9e7cac196b56ab46b678bcbe2b056e.zip
[Minor] Add hack to reuse rspamd_inet_address_to_string*
Diffstat (limited to 'src/libutil/addr.c')
-rw-r--r--src/libutil/addr.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/src/libutil/addr.c b/src/libutil/addr.c
index 9e74245a7..fd628aaca 100644
--- a/src/libutil/addr.c
+++ b/src/libutil/addr.c
@@ -924,22 +924,34 @@ rspamd_parse_inet_address_ip (const char *src, gsize srclen,
return ret;
}
+/*
+ * This is used to allow rspamd_inet_address_to_string to be used several times
+ * at the same function invocation, like printf("%s -> %s", f(ip1), f(ip2));
+ * Yes, it is bad but it helps to utilise this function without temporary buffers
+ * for up to 5 simultaneous invocations.
+ */
+#define NADDR_BUFS 5
+
const char *
rspamd_inet_address_to_string (const rspamd_inet_addr_t *addr)
{
- static char addr_str[INET6_ADDRSTRLEN + 1];
+ static char addr_str[NADDR_BUFS][INET6_ADDRSTRLEN + 1];
+ static guint cur_addr = 0;
+ char *addr_buf;
if (addr == NULL) {
return "<empty inet address>";
}
+ addr_buf = addr_str[cur_addr++ % NADDR_BUFS];
+
switch (addr->af) {
case AF_INET:
- return inet_ntop (addr->af, &addr->u.in.addr.s4.sin_addr, addr_str,
- sizeof (addr_str));
+ return inet_ntop (addr->af, &addr->u.in.addr.s4.sin_addr, addr_buf,
+ INET6_ADDRSTRLEN + 1);
case AF_INET6:
- return inet_ntop (addr->af, &addr->u.in.addr.s6.sin6_addr, addr_str,
- sizeof (addr_str));
+ return inet_ntop (addr->af, &addr->u.in.addr.s6.sin6_addr, addr_buf,
+ INET6_ADDRSTRLEN + 1);
case AF_UNIX:
return addr->u.un->addr.sun_path;
}
@@ -947,33 +959,39 @@ rspamd_inet_address_to_string (const rspamd_inet_addr_t *addr)
return "undefined";
}
+#define PRETTY_IP_BUFSIZE 128
+
const char *
rspamd_inet_address_to_string_pretty (const rspamd_inet_addr_t *addr)
{
- static char addr_str[PATH_MAX + 5];
+ static char addr_str[NADDR_BUFS][PRETTY_IP_BUFSIZE];
+ static guint cur_addr = 0;
+ char *addr_buf;
if (addr == NULL) {
return "<empty inet address>";
}
+ addr_buf = addr_str[cur_addr++ % NADDR_BUFS];
+
switch (addr->af) {
case AF_INET:
- rspamd_snprintf (addr_str, sizeof (addr_str), "%s:%d",
+ rspamd_snprintf (addr_buf, PRETTY_IP_BUFSIZE, "%s:%d",
rspamd_inet_address_to_string (addr),
rspamd_inet_address_get_port (addr));
break;
case AF_INET6:
- rspamd_snprintf (addr_str, sizeof (addr_str), "[%s]:%d",
+ rspamd_snprintf (addr_buf, PRETTY_IP_BUFSIZE, "[%s]:%d",
rspamd_inet_address_to_string (addr),
rspamd_inet_address_get_port (addr));
break;
case AF_UNIX:
- rspamd_snprintf (addr_str, sizeof (addr_str), "unix:%s",
+ rspamd_snprintf (addr_buf, PRETTY_IP_BUFSIZE, "unix:%s",
rspamd_inet_address_to_string (addr));
break;
}
- return addr_str;
+ return addr_buf;
}
uint16_t