21
21
22
22
#ifndef MAIN
23
23
24
- #if defined(__FreeBSD__ ) || defined(__linux__ )
25
- static my_bool memcpy_and_test (uchar * to , uchar * from , uint len )
26
- {
27
- uint i , res = 1 ;
28
-
29
- for (i = 0 ; i < len ; i ++ )
30
- if ((* to ++ = * from ++ ))
31
- res = 0 ;
32
- return res ;
33
- }
34
- #endif /* FreeBSD || linux */
35
-
36
24
#ifdef __FreeBSD__
37
25
38
26
#include <net/ethernet.h>
@@ -44,10 +32,11 @@ static my_bool memcpy_and_test(uchar *to, uchar *from, uint len)
44
32
my_bool my_gethwaddr (uchar * to )
45
33
{
46
34
size_t len ;
47
- uchar * buf , * next , * end , * addr ;
35
+ char * buf , * next , * end ;
48
36
struct if_msghdr * ifm ;
49
37
struct sockaddr_dl * sdl ;
50
38
int res = 1 , mib [6 ]= {CTL_NET , AF_ROUTE , 0 , AF_LINK , NET_RT_IFLIST , 0 };
39
+ char zero_array [ETHER_ADDR_LEN ] = {0 };
51
40
52
41
if (sysctl (mib , 6 , NULL , & len , NULL , 0 ) == -1 )
53
42
goto err ;
@@ -63,9 +52,9 @@ my_bool my_gethwaddr(uchar *to)
63
52
ifm = (struct if_msghdr * )next ;
64
53
if (ifm -> ifm_type == RTM_IFINFO )
65
54
{
66
- sdl = (struct sockaddr_dl * )(ifm + 1 );
67
- addr = LLADDR (sdl );
68
- res = memcpy_and_test (to , addr , ETHER_ADDR_LEN );
55
+ sdl = (struct sockaddr_dl * )(ifm + 1 );
56
+ memcpy ( to , LLADDR (sdl ), ETHER_ADDR_LEN );
57
+ res = memcmp (to , zero_array , ETHER_ADDR_LEN ) ? 0 : 1 ;
69
58
}
70
59
}
71
60
@@ -81,8 +70,9 @@ my_bool my_gethwaddr(uchar *to)
81
70
82
71
my_bool my_gethwaddr (uchar * to )
83
72
{
84
- int fd , res = 1 ;
73
+ int fd , res = 1 ;
85
74
struct ifreq ifr ;
75
+ char zero_array [ETHER_ADDR_LEN ] = {0 };
86
76
87
77
fd = socket (AF_INET , SOCK_DGRAM , 0 );
88
78
if (fd < 0 )
@@ -91,9 +81,13 @@ my_bool my_gethwaddr(uchar *to)
91
81
bzero (& ifr , sizeof (ifr ));
92
82
strnmov (ifr .ifr_name , "eth0" , sizeof (ifr .ifr_name ) - 1 );
93
83
94
- do {
84
+ do
85
+ {
95
86
if (ioctl (fd , SIOCGIFHWADDR , & ifr ) >= 0 )
96
- res = memcpy_and_test (to , (uchar * )& ifr .ifr_hwaddr .sa_data , ETHER_ADDR_LEN );
87
+ {
88
+ memcpy (to , & ifr .ifr_hwaddr .sa_data , ETHER_ADDR_LEN );
89
+ res = memcmp (to , zero_array , ETHER_ADDR_LEN ) ? 0 : 1 ;
90
+ }
97
91
} while (res && (errno == 0 || errno == ENODEV ) && ifr .ifr_name [3 ]++ < '6' );
98
92
99
93
close (fd );
0 commit comments