@@ -139,63 +139,64 @@ uint64_t get_time_microseconds(void) {
139139
140140static uint64_t get_device_salt (void ) {
141141 uint64_t salt = DEFAULT_SALT ;
142+ ULONG size = 15000 ;
143+ IP_ADAPTER_ADDRESSES * adapters = (IP_ADAPTER_ADDRESSES * )malloc (size );
144+ if (!adapters ) return salt ;
142145
143- ULONG outBufLen = 15000 ;
144- IP_ADAPTER_ADDRESSES * addresses = (IP_ADAPTER_ADDRESSES * )malloc (outBufLen );
145- if (!addresses ) return salt ;
146-
147- if (GetAdaptersAddresses (AF_UNSPEC , GAA_FLAG_SKIP_ANYCAST , NULL , addresses , & outBufLen ) == NO_ERROR ) {
148- for (IP_ADAPTER_ADDRESSES * addr = addresses ; addr != NULL ; addr = addr -> Next ) {
149- if (addr -> PhysicalAddressLength == 6 ) {
146+ if (GetAdaptersAddresses (AF_UNSPEC , GAA_FLAG_SKIP_ANYCAST , NULL , adapters , & size ) == NO_ERROR ) {
147+ for (IP_ADAPTER_ADDRESSES * a = adapters ; a ; a = a -> Next ) {
148+ if (a -> PhysicalAddressLength == 6 ) {
150149 for (ULONG i = 0 ; i < 6 ; ++ i ) {
151- salt ^= addr -> PhysicalAddress [i ];
150+ salt ^= a -> PhysicalAddress [i ];
152151 salt *= 0x100000001b3ULL ;
153152 }
154153 break ;
155154 }
156155 }
157156 }
158-
159- free (addresses );
157+ free (adapters );
160158 return salt ;
161159}
162160
163161#elif defined(__APPLE__ ) && defined(__MACH__ )
164- // ==========================================
165- // macOS implementation using getifaddrs()
166- // ==========================================
162+ // ========================
163+ // macOS / Darwin
164+ // ========================
167165#include <ifaddrs.h>
168166#include <net/if_dl.h>
167+ #include <net/if.h> // for IFNAMSIZ
168+ #include <sys/socket.h> // for struct sockaddr and AF_LINK
169169
170170static uint64_t get_device_salt (void ) {
171- struct ifaddrs * ifap = NULL ;
172171 uint64_t salt = DEFAULT_SALT ;
172+ struct ifaddrs * ifap = NULL ;
173173
174- if (getifaddrs (& ifap ) == 0 ) {
175- for (struct ifaddrs * ifa = ifap ; ifa != NULL ; ifa = ifa -> ifa_next ) {
176- if (!ifa -> ifa_addr || ifa -> ifa_addr -> sa_family != AF_LINK )
177- continue ;
174+ if (getifaddrs (& ifap ) != 0 || !ifap )
175+ return salt ;
178176
179- struct sockaddr_dl * sdl = (struct sockaddr_dl * )ifa -> ifa_addr ;
180- const unsigned char * mac = (const unsigned char * )LLADDR (sdl );
181- if (sdl -> sdl_alen == 6 ) {
182- for (int i = 0 ; i < 6 ; ++ i ) {
183- salt ^= mac [i ];
184- salt *= 0x100000001b3ULL ;
185- }
186- break ;
177+ for (struct ifaddrs * ifa = ifap ; ifa != NULL ; ifa = ifa -> ifa_next ) {
178+ if (!ifa -> ifa_addr || ifa -> ifa_addr -> sa_family != AF_LINK )
179+ continue ;
180+
181+ struct sockaddr_dl * sdl = (struct sockaddr_dl * )ifa -> ifa_addr ;
182+ const unsigned char * mac = (const unsigned char * )LLADDR (sdl );
183+ if (sdl -> sdl_alen == 6 ) {
184+ for (int i = 0 ; i < 6 ; ++ i ) {
185+ salt ^= mac [i ];
186+ salt *= 0x100000001b3ULL ;
187187 }
188+ break ;
188189 }
189- freeifaddrs (ifap );
190190 }
191191
192+ freeifaddrs (ifap );
192193 return salt ;
193194}
194195
195196#else
196- // ==========================================
197- // Linux implementation using ioctl
198- // ==========================================
197+ // ========================
198+ // Linux and Unix-like OS
199+ // ========================
199200#include <unistd.h>
200201#include <sys/ioctl.h>
201202#include <net/if.h>
@@ -213,7 +214,7 @@ static uint64_t get_device_salt(void) {
213214 memset (& ifr , 0 , sizeof (ifr ));
214215 strncpy (ifr .ifr_name , interfaces [i ], IFNAMSIZ - 1 );
215216
216- // SIOCGIFHWADDR = 0x8927 on Linux
217+ // 0x8927 = SIOCGIFHWADDR on Linux
217218 if (ioctl (sock , 0x8927 , & ifr ) == 0 ) {
218219 unsigned char * mac = (unsigned char * )ifr .ifr_hwaddr .sa_data ;
219220 for (int j = 0 ; j < 6 ; ++ j ) {
0 commit comments