00001
00002
00003
00004
00005
00006
00007
00008 #include "ibrcommon/config.h"
00009 #include "ibrcommon/net/NetInterface.h"
00010
00011 #include <sys/types.h>
00012 #include <netinet/ip.h>
00013 #include <netinet/ip6.h>
00014 #include <arpa/inet.h>
00015 #include <sys/socket.h>
00016
00017 #include <stdlib.h>
00018 #include <net/if.h>
00019 #include <ifaddrs.h>
00020 #include <errno.h>
00021
00022 #include <unistd.h>
00023
00024 using namespace std;
00025
00026 namespace ibrcommon
00027 {
00028 NetInterface::NetInterface(std::string interface)
00029 : _interface(interface)
00030 {
00031 }
00032
00033 NetInterface::~NetInterface()
00034 {
00035
00036 }
00037
00038 bool NetInterface::operator<(const NetInterface &other) const
00039 {
00040 if (_interface < other._interface) return true;
00041 return false;
00042 }
00043
00044 bool NetInterface::operator==(const NetInterface &other) const
00045 {
00046 if (_interface == other._interface) return true;
00047 return false;
00048 }
00049
00050 std::string NetInterface::getInterface() const
00051 {
00052 return _interface;
00053 }
00054
00055 std::string NetInterface::getAddress() const
00056 {
00057 return NetInterface::getAddress(_interface);
00058 }
00059
00060 std::string NetInterface::getBroadcast() const
00061 {
00062 return NetInterface::getBroadcast(_interface);
00063 }
00064
00065 void NetInterface::getAddress(struct in_addr *ret) const
00066 {
00067 NetInterface::getAddress(_interface, ret);
00068 }
00069
00070 void NetInterface::getBroadcast(struct in_addr *ret) const
00071 {
00072 NetInterface::getBroadcast(_interface, ret);
00073 }
00074
00075 void NetInterface::getAddress(std::string interface, struct in_addr *ret)
00076 {
00077
00078 ret->s_addr = htonl(INADDR_ANY);
00079
00080 struct ifaddrs *ifap = NULL;
00081 int status = getifaddrs(&ifap);
00082
00083 if ((status != 0) || (ifap == NULL))
00084 {
00085
00086 return;
00087 }
00088
00089 for (struct ifaddrs *iter = ifap; iter != NULL; iter = iter->ifa_next)
00090 {
00091 if (iter->ifa_addr == NULL) continue;
00092 if ((iter->ifa_flags & IFF_UP) == 0) continue;
00093
00094 sockaddr *addr = iter->ifa_addr;
00095
00096
00097 if (addr->sa_family != AF_INET) continue;
00098
00099
00100 if (string(iter->ifa_name).compare(interface) != 0) continue;
00101
00102 sockaddr_in *ip = (sockaddr_in*)iter->ifa_addr;
00103
00104 ret->s_addr = ip->sin_addr.s_addr;
00105 break;
00106 }
00107
00108 freeifaddrs(ifap);
00109 }
00110
00111 void NetInterface::getBroadcast(std::string interface, struct in_addr *ret)
00112 {
00113
00114 ret->s_addr = htonl(INADDR_BROADCAST);
00115
00116 struct ifaddrs *ifap = NULL;
00117 int status = getifaddrs(&ifap);
00118
00119 if ((status != 0) || (ifap == NULL))
00120 {
00121
00122 return;
00123 }
00124
00125 for (struct ifaddrs *iter = ifap; iter != NULL; iter = iter->ifa_next)
00126 {
00127 if (iter->ifa_addr == NULL) continue;
00128 if ((iter->ifa_flags & IFF_UP) == 0) continue;
00129
00130 sockaddr *addr = iter->ifa_addr;
00131
00132
00133 if (addr->sa_family != AF_INET) continue;
00134
00135
00136 if (string(iter->ifa_name).compare(interface) != 0) continue;
00137
00138 if (iter->ifa_flags & IFF_BROADCAST)
00139 {
00140 sockaddr_in *broadcast = (sockaddr_in*)iter->ifa_broadaddr;
00141 ret->s_addr = broadcast->sin_addr.s_addr;
00142 break;
00143 }
00144 }
00145
00146 freeifaddrs(ifap);
00147 }
00148
00149 std::string NetInterface::getAddress(std::string interface)
00150 {
00151 struct in_addr addr;
00152 NetInterface::getAddress(interface, &addr);
00153 return string(inet_ntoa(addr));
00154 }
00155
00156 std::string NetInterface::getBroadcast(std::string interface)
00157 {
00158 struct in_addr addr;
00159 NetInterface::getBroadcast(interface, &addr);
00160 return string(inet_ntoa(addr));
00161 }
00162 }