Merge branch 'release-0.6.6'
[olsrd.git] / lib / pud / src / netTools.c
1 #include "netTools.h"
2
3 /* Plugin includes */
4 #include "pud.h"
5
6 /* OLSR includes */
7
8 /* System includes */
9 #include <sys/ioctl.h>
10 #include <errno.h>
11 #include <string.h>
12
13 /**
14  Get the hardware address (MAC) of an interface
15
16  @param ifName
17  the name of the interface
18  @param family
19  the protocol family (AF_INET or AF_INET6)
20  @param ifr
21  the buffer in which to write the hardware address (MAC)
22
23  @return
24  - the pointer to the hardware address (inside ifr)
25  - NULL on failure
26  */
27 unsigned char * getHardwareAddress(const char * ifName, int family,
28                 struct ifreq *ifr) {
29         int fd;
30
31         assert(ifName != NULL);
32         assert(strlen(ifName) <= sizeof(ifr->ifr_name));
33         assert((family == AF_INET) || (family == AF_INET6));
34         assert(ifr != NULL);
35
36         fd = socket(family, SOCK_DGRAM, 0);
37         if (fd < 0) {
38                 pudError(true, "%s@%u: socket error: %s", __FILE__, __LINE__, strerror(errno));
39                 return NULL;
40         }
41
42         ifr->ifr_addr.sa_family = family;
43         memset(ifr->ifr_name, 0, sizeof(ifr->ifr_name));
44         strncpy(ifr->ifr_name, ifName, sizeof(ifr->ifr_name));
45
46         errno = 0;
47         if (ioctl(fd, SIOCGIFHWADDR, ifr) < 0) {
48                 pudError(true, "%s@%u: ioctl(SIOCGIFHWADDR) error", __FILE__, __LINE__);
49                 close(fd);
50                 return NULL;
51         }
52
53         close(fd);
54
55         return (unsigned char *) &ifr->ifr_hwaddr.sa_data[0];
56 }
57
58 /**
59  Get the IPv4 address of an interface
60
61  @param ifName
62  the name of the interface
63  @param ifr
64  the buffer in which to write the IPv4 address
65
66  @return
67  - the pointer to the IPv4 address (inside ifr)
68  - NULL on failure
69  */
70 struct in_addr * getIPv4Address(const char * ifName, struct ifreq *ifr) {
71         int fd;
72
73         assert(ifName != NULL);
74         assert(strlen(ifName) <= sizeof(ifr->ifr_name));
75         assert(ifr != NULL);
76
77         fd = socket(AF_INET, SOCK_DGRAM, 0);
78         if (fd < 0) {
79                 pudError(true, "%s@%u: socket error: %s", __FILE__, __LINE__, strerror(errno));
80                 return NULL;
81         }
82
83         ifr->ifr_addr.sa_family = AF_INET;
84         memset(ifr->ifr_name, 0, sizeof(ifr->ifr_name));
85         strncpy(ifr->ifr_name, ifName, sizeof(ifr->ifr_name));
86
87         errno = 0;
88         if (ioctl(fd, SIOCGIFADDR, ifr) < 0) {
89                 pudError(true, "%s@%u: ioctl(SIOCGIFADDR) error", __FILE__, __LINE__);
90                 close(fd);
91                 return NULL;
92         }
93
94         close(fd);
95
96         return &((struct sockaddr_in *)(void *) &ifr->ifr_addr)->sin_addr;
97 }