diff options
Diffstat (limited to 'devel/efivar/files/patch-src_linux.c')
-rw-r--r-- | devel/efivar/files/patch-src_linux.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/devel/efivar/files/patch-src_linux.c b/devel/efivar/files/patch-src_linux.c new file mode 100644 index 000000000000..1948fba2d92b --- /dev/null +++ b/devel/efivar/files/patch-src_linux.c @@ -0,0 +1,108 @@ +--- src/linux.c.orig 2024-01-31 20:08:46 UTC ++++ src/linux.c +@@ -12,17 +12,30 @@ + #include <fcntl.h> + #include <inttypes.h> + #include <limits.h> +-#include <linux/ethtool.h> +-#include <linux/version.h> +-#include <linux/sockios.h> ++#if defined(__linux__) ++# include <linux/ethtool.h> ++# include <linux/version.h> ++# include <linux/sockios.h> ++#elif defined(__FreeBSD__) ++# include <net/if.h> ++# include <net/if_dl.h> ++#endif + #include <net/if.h> +-#include <scsi/scsi.h> ++#if defined(__linux__) ++# include <scsi/scsi.h> ++#endif + #include <stdbool.h> + #include <stdio.h> ++#if defined(__FreeBSD__) ++# include <sys/disk.h> ++# undef LIST_HEAD ++#endif + #include <sys/ioctl.h> + #include <sys/mount.h> + #include <sys/socket.h> +-#include <sys/sysmacros.h> ++#if defined(__linux__) ++# include <sys/sysmacros.h> ++#endif + #include <sys/types.h> + #include <sys/param.h> + #include <sys/stat.h> +@@ -630,6 +643,7 @@ make_blockdev_path(uint8_t *buf, ssize_t size, struct + return off; + } + ++#if defined(__linux__) + ssize_t HIDDEN + make_mac_path(uint8_t *buf, ssize_t size, const char * const ifname) + { +@@ -693,7 +707,48 @@ err: + close(fd); + return ret; + } ++#elif defined(__FreeBSD__) ++ssize_t HIDDEN ++make_mac_path(uint8_t *buf, ssize_t size, const char * const ifname) ++{ ++ int fd; ++ struct ifreq ifr; ++ struct sockaddr_dl *sdl; ++ ssize_t ret = -1; + ++ if (!buf || !ifname) ++ return -1; ++ ++ fd = socket(AF_INET, SOCK_DGRAM, 0); ++ if (fd < 0) ++ return -1; ++ ++ memset(&ifr, 0, sizeof(ifr)); ++ strncpy(ifr.ifr_name, ifname, IFNAMSIZ-1); ++ ifr.ifr_name[IFNAMSIZ-1] = '\0'; ++ ++ if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { ++ close(fd); ++ return -1; ++ } ++ ++ // For MAC, use AF_LINK (sockaddr_dl) ++ if (ioctl(fd, SIOCGIFCONF, &ifr) < 0) { ++ close(fd); ++ return -1; ++ } ++ ++ sdl = (struct sockaddr_dl *)&ifr.ifr_addr; ++ if (sdl->sdl_alen > 0 && sdl->sdl_alen <= size) { ++ memcpy(buf, LLADDR(sdl), sdl->sdl_alen); ++ ret = sdl->sdl_alen; ++ } ++ ++ close(fd); ++ return ret; ++} ++#endif ++ + /************************************************************ + * get_sector_size + * Requires: +@@ -707,7 +762,12 @@ get_sector_size(int filedes) + { + int rc, sector_size = 512; + ++ (void)filedes; ++#if defined(__linux__) + rc = ioctl(filedes, BLKSSZGET, §or_size); ++#elif defined(__FreeBSD__) ++ rc = ioctl(filedes, DIOCGSECTORSIZE, §or_size); ++#endif + if (rc) + sector_size = 512; + return sector_size; |