11
11
#ifdef HAVE_NET_IF_TYPES_H
12
12
# include <net/if_types.h>
14
#ifdef HAVE_SYS_SOCKIO_H
15
# include <sys/sockio.h>
17
#ifndef HAVE_NET_IF_ARP_H
18
# include <net/if_arp.h>
15
22
#ifdef WITH_DMALLOC
16
23
# include <dmalloc.h>
27
# define HWINFO_DOMAIN PF_PACKET
29
# define HWINFO_DOMAIN PF_INET
32
# define HWINFO_TYPE SOCK_PACKET
34
# define HWINFO_TYPE SOCK_DGRAM
19
37
int fill_mac_address(void)
23
if ((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {
41
if ((s = socket(HWINFO_DOMAIN, HWINFO_TYPE, 0)) == -1) {
42
logfile(LOG_ERR, _("Unable to open raw device: [%s]"),
27
46
#ifdef SIOCGIFHWADDR
31
if (strlen(interface) >= sizeof ifr.ifr_name) {
32
fprintf(stderr, "Interface name too long\n");
35
strcpy(ifr.ifr_name, interface);
50
if (strlen(interface) >= sizeof ifr.ifr_name) {
51
logfile(LOG_ERR, _("Interface name too long"));
54
strcpy(ifr.ifr_name, interface);
36
55
if (ioctl(s, SIOCGIFHWADDR, &ifr) != 0) {
37
perror("SIOCGIFHWADDR");
57
_("Unable to get hardware info about an interface: %s"),
43
64
case ARPHRD_IEEE802:
46
fprintf(stderr, "Warning : unknown hardware type [%u]\n",
67
logfile(LOG_ERR, _("Unknown hardware type [%u]"),
47
68
(unsigned int) ifr.ifr_hwaddr.sa_family);
49
70
memcpy(hwaddr, &ifr.ifr_hwaddr.sa_data, sizeof hwaddr);
51
72
#elif defined(HAVE_GETIFADDRS)
55
struct sockaddr_dl *sadl;
56
struct ether_addr *ea;
58
if (getifaddrs(&ifas) != 0) {
64
if (strcmp(ifa->ifa_name, interface) == 0 &&
65
ifa->ifa_addr->sa_family == AF_LINK) {
66
sadl = (struct sockaddr_dl *) ifa->ifa_addr;
67
if (sadl == NULL || sadl->sdl_type != IFT_ETHER ||
68
sadl->sdl_alen <= 0) {
70
"Invalid media / hardware address for [%s]\n",
74
ea = (struct ether_addr *) LLADDR(sadl);
75
memcpy(hwaddr, ea, sizeof hwaddr);
76
struct sockaddr_dl *sadl;
77
struct ether_addr *ea;
79
if (getifaddrs(&ifas) != 0) {
80
logfile(LOG_ERR, _("Unable to get interface address: %s"),
86
if (strcmp(ifa->ifa_name, interface) == 0 &&
87
ifa->ifa_addr->sa_family == AF_LINK) {
88
sadl = (struct sockaddr_dl *) ifa->ifa_addr;
89
if (sadl == NULL || sadl->sdl_type != IFT_ETHER ||
90
sadl->sdl_alen <= 0) {
92
_("Invalid media / hardware address for [%s]"),
96
ea = (struct ether_addr *) LLADDR(sadl);
97
memcpy(hwaddr, ea, sizeof hwaddr);
105
#elif defined(SIOCGLIFNUM)
111
struct arpreq arpreq;
114
lifn.lifn_family = AF_INET;
115
if (ioctl(s, SIOCGLIFNUM, &lifn) < 0) {
116
logfile(LOG_ERR, _("ioctl SIOCGLIFNUM error"));
119
if (lifn.lifn_count <= 0) {
120
logfile(LOG_ERR, _("No interface found"));
123
lifc.lifc_family = lifn.lifn_family;
124
lifc.lifc_len = lifn.lifn_count * sizeof *lifr;
125
lifrspace = ALLOCA(lifc.lifc_len);
126
lifc.lifc_buf = (caddr_t) lifrspace;
127
if (ioctl(s, SIOCGLIFCONF, &lifc) < 0) {
128
logfile(LOG_ERR, _("ioctl SIOCGLIFCONF error"));
129
ALLOCA_FREE(lifrspace);
132
lifr = lifc.lifc_req;
133
while (--lifn.lifn_count > 0) {
134
if (strcmp(lifr->lifr_name, interface) == 0) {
139
if (lifn.lifn_count <= 0) {
140
logfile(LOG_ERR, _("Interface [%s] not found"), interface);
141
ALLOCA_FREE(lifrspace);
144
memcpy(&arpreq.arp_pa, &lifr->lifr_addr, sizeof arpreq.arp_pa);
145
ALLOCA_FREE(lifrspace);
146
if (ioctl(s, SIOCGARP, &arpreq) != 0) {
147
logfile(LOG_ERR, _("Unable to get hardware info about [%s]"),
151
memcpy(hwaddr, &arpreq.arp_ha.sa_data, sizeof hwaddr);