diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-11-05 02:13:37 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-11-13 08:53:33 +0900 |
commit | ed9fa69f1c8958c64adde1407936eb930be7f0d1 (patch) | |
tree | 35b8eb5698e5abdf48e986dea28d9a1d0946fbc2 /src/shared/ethtool-util.c | |
parent | 57ae8cd8125d46455f5bc46cd8166f2a9fff6b5f (diff) | |
download | systemd-ed9fa69f1c8958c64adde1407936eb930be7f0d1.tar.gz |
ethtool-util: introduce ethtool_get_permanent_hw_addr()
And replaces all ethtool_get_permanent_macaddr() with it.
Diffstat (limited to 'src/shared/ethtool-util.c')
-rw-r--r-- | src/shared/ethtool-util.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/src/shared/ethtool-util.c b/src/shared/ethtool-util.c index 333e5a4879..8afb51328e 100644 --- a/src/shared/ethtool-util.c +++ b/src/shared/ethtool-util.c @@ -339,14 +339,14 @@ int ethtool_get_link_info( return 0; } -int ethtool_get_permanent_macaddr(int *ethtool_fd, const char *ifname, struct ether_addr *ret) { +int ethtool_get_permanent_hw_addr(int *ethtool_fd, const char *ifname, struct hw_addr_data *ret) { _cleanup_close_ int fd = -1; struct { struct ethtool_perm_addr addr; - uint8_t space[MAX_ADDR_LEN]; + uint8_t space[HW_ADDR_MAX_SIZE]; } epaddr = { .addr.cmd = ETHTOOL_GPERMADDR, - .addr.size = MAX_ADDR_LEN, + .addr.size = HW_ADDR_MAX_SIZE, }; struct ifreq ifr = { .ifr_data = (caddr_t) &epaddr, @@ -367,17 +367,14 @@ int ethtool_get_permanent_macaddr(int *ethtool_fd, const char *ifname, struct et if (ioctl(*ethtool_fd, SIOCETHTOOL, &ifr) < 0) return -errno; - if (epaddr.addr.size != 6) - return -EOPNOTSUPP; + if (epaddr.addr.size == 0) + return -ENODATA; -#pragma GCC diagnostic push -#if HAVE_ZERO_LENGTH_BOUNDS -# pragma GCC diagnostic ignored "-Wzero-length-bounds" -#endif - for (size_t i = 0; i < epaddr.addr.size; i++) - ret->ether_addr_octet[i] = epaddr.addr.data[i]; -#pragma GCC diagnostic pop + if (epaddr.addr.size > HW_ADDR_MAX_SIZE) + return -EINVAL; + ret->length = epaddr.addr.size; + memcpy(ret->bytes, epaddr.addr.data, epaddr.addr.size); return 0; } |