From ee7ad6615d9521d62af220f1a35582c79fba2007 Mon Sep 17 00:00:00 2001 From: Frederic Lecaille Date: Fri, 30 Aug 2024 13:56:15 +0200 Subject: [PATCH] MINOR: tools: Implement ipaddrcpy(). Implement ipaddrcpy() new function to copy only the IP address from a sockaddr_storage struct object into a buffer. (cherry picked from commit fb7a0922038932a6b82f1827a0214c5d2e8da32e) Signed-off-by: Frederic Lecaille --- include/haproxy/tools.h | 5 +++++ src/tools.c | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/haproxy/tools.h b/include/haproxy/tools.h index 937adaa..2ea9776 100644 --- a/include/haproxy/tools.h +++ b/include/haproxy/tools.h @@ -842,6 +842,11 @@ int ipcmp2net(const struct sockaddr_storage *addr, const struct net_addr *net); */ struct sockaddr_storage *ipcpy(const struct sockaddr_storage *source, struct sockaddr_storage *dest); +/* Copy only the IP address from socket address data into buffer. * + * Return the number of bytes copied. + */ +size_t ipaddrcpy(unsigned char *buf, const struct sockaddr_storage *saddr); + char *human_time(int t, short hz_div); extern const char *monthname[]; diff --git a/src/tools.c b/src/tools.c index b297d04..474f6e9 100644 --- a/src/tools.c +++ b/src/tools.c @@ -3679,6 +3679,33 @@ struct sockaddr_storage *ipcpy(const struct sockaddr_storage *source, struct soc return dest; } +/* Copy only the IP address from socket address data into buffer. + * This is the responsibility of the caller to check the buffer is big + * enough to contain these socket address data. + * Return the number of bytes copied. + */ +size_t ipaddrcpy(unsigned char *buf, const struct sockaddr_storage *saddr) +{ + void *addr; + unsigned char *p; + size_t addr_len; + + p = buf; + if (saddr->ss_family == AF_INET6) { + addr = &((struct sockaddr_in6 *)saddr)->sin6_addr; + addr_len = sizeof ((struct sockaddr_in6 *)saddr)->sin6_addr; + } + else { + addr = &((struct sockaddr_in *)saddr)->sin_addr; + addr_len = sizeof ((struct sockaddr_in *)saddr)->sin_addr; + } + memcpy(p, addr, addr_len); + p += addr_len; + + return p - buf; +} + + char *human_time(int t, short hz_div) { static char rv[sizeof("24855d23h")+1]; // longest of "23h59m" and "59m59s" char *p = rv; -- 1.7.10.4