1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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;
|