aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-08-21 14:19:58 +1000
committerStefano Brivio <sbrivio@redhat.com>2024-08-21 11:59:51 +0200
commit066e69986b96bf83dfa2ec09f6b03b6a7ad6bbd6 (patch)
tree921198ec4d648439ff17dde83e07a963c6c3dbc1
parente6feb5a892b4efc2b149883f58915154d6eb349f (diff)
downloadpasst-066e69986b96bf83dfa2ec09f6b03b6a7ad6bbd6.tar
passt-066e69986b96bf83dfa2ec09f6b03b6a7ad6bbd6.tar.gz
passt-066e69986b96bf83dfa2ec09f6b03b6a7ad6bbd6.tar.bz2
passt-066e69986b96bf83dfa2ec09f6b03b6a7ad6bbd6.tar.lz
passt-066e69986b96bf83dfa2ec09f6b03b6a7ad6bbd6.tar.xz
passt-066e69986b96bf83dfa2ec09f6b03b6a7ad6bbd6.tar.zst
passt-066e69986b96bf83dfa2ec09f6b03b6a7ad6bbd6.zip
util: Helper for formatting MAC addresses
There are a couple of places where we somewhat messily open code formatting an Ethernet like MAC address for display. Add an eth_ntop() helper for this. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--conf.c7
-rw-r--r--dhcp.c5
-rw-r--r--util.c19
-rw-r--r--util.h3
4 files changed, 27 insertions, 7 deletions
diff --git a/conf.c b/conf.c
index ed097bd..830f91a 100644
--- a/conf.c
+++ b/conf.c
@@ -921,7 +921,8 @@ pasta_opts:
*/
static void conf_print(const struct ctx *c)
{
- char buf4[INET_ADDRSTRLEN], buf6[INET6_ADDRSTRLEN], ifn[IFNAMSIZ];
+ char buf4[INET_ADDRSTRLEN], buf6[INET6_ADDRSTRLEN];
+ char bufmac[ETH_ADDRSTRLEN], ifn[IFNAMSIZ];
int i;
info("Template interface: %s%s%s%s%s",
@@ -955,9 +956,7 @@ static void conf_print(const struct ctx *c)
info("Namespace interface: %s", c->pasta_ifn);
info("MAC:");
- info(" host: %02x:%02x:%02x:%02x:%02x:%02x",
- c->mac[0], c->mac[1], c->mac[2],
- c->mac[3], c->mac[4], c->mac[5]);
+ info(" host: %s", eth_ntop(c->mac, bufmac, sizeof(bufmac)));
if (c->ifi4) {
if (!c->no_dhcp) {
diff --git a/dhcp.c b/dhcp.c
index aa9f59d..acc5b03 100644
--- a/dhcp.c
+++ b/dhcp.c
@@ -276,6 +276,7 @@ static void opt_set_dns_search(const struct ctx *c, size_t max_len)
int dhcp(const struct ctx *c, const struct pool *p)
{
size_t mlen, dlen, offset = 0, opt_len, opt_off = 0;
+ char macstr[ETH_ADDRSTRLEN];
const struct ethhdr *eh;
const struct iphdr *iph;
const struct udphdr *uh;
@@ -340,9 +341,7 @@ int dhcp(const struct ctx *c, const struct pool *p)
return -1;
}
- info(" from %02x:%02x:%02x:%02x:%02x:%02x",
- m->chaddr[0], m->chaddr[1], m->chaddr[2],
- m->chaddr[3], m->chaddr[4], m->chaddr[5]);
+ info(" from %s", eth_ntop(m->chaddr, macstr, sizeof(macstr)));
m->yiaddr = c->ip4.addr;
mask.s_addr = htonl(0xffffffff << (32 - c->ip4.prefix_len));
diff --git a/util.c b/util.c
index 0b41404..7cb2c10 100644
--- a/util.c
+++ b/util.c
@@ -676,6 +676,25 @@ const char *sockaddr_ntop(const void *sa, char *dst, socklen_t size)
return dst;
}
+/** eth_ntop() - Convert an Ethernet MAC address to text format
+ * @mac: MAC address
+ * @dst: Output buffer, minimum ETH_ADDRSTRLEN bytes
+ * @size: Size of buffer at @dst
+ *
+ * Return: On success, a non-null pointer to @dst, NULL on failure
+ */
+const char *eth_ntop(const unsigned char *mac, char *dst, size_t size)
+{
+ int len;
+
+ len = snprintf(dst, size, "%02x:%02x:%02x:%02x:%02x:%02x",
+ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+ if (len < 0 || (size_t)len >= size)
+ return NULL;
+
+ return dst;
+}
+
/** str_ee_origin() - Convert socket extended error origin to a string
* @ee: Socket extended error structure
*
diff --git a/util.h b/util.h
index cb4d181..a716849 100644
--- a/util.h
+++ b/util.h
@@ -215,9 +215,12 @@ static inline const char *af_name(sa_family_t af)
#define SOCKADDR_STRLEN MAX(SOCKADDR_INET_STRLEN, SOCKADDR_INET6_STRLEN)
+#define ETH_ADDRSTRLEN (sizeof("00:11:22:33:44:55"))
+
struct sock_extended_err;
const char *sockaddr_ntop(const void *sa, char *dst, socklen_t size);
+const char *eth_ntop(const unsigned char *mac, char *dst, size_t size);
const char *str_ee_origin(const struct sock_extended_err *ee);
/**