diff --git a/Net/include/Poco/Net/Net.h b/Net/include/Poco/Net/Net.h index 383c3bb01..dc1b2fd70 100644 --- a/Net/include/Poco/Net/Net.h +++ b/Net/include/Poco/Net/Net.h @@ -112,7 +112,11 @@ void Net_API uninitializeNetwork(); #if !defined(s6_addr32) #if defined(POCO_OS_FAMILY_UNIX) - #define s6_addr32 __u6_addr.__u6_addr32 + #if (POCO_OS == POCO_OS_SOLARIS) + #define s6_addr32 _S6_un._S6_u32 + #else + #define s6_addr32 __u6_addr.__u6_addr32 + #endif #endif #endif diff --git a/Net/src/NetworkInterface.cpp b/Net/src/NetworkInterface.cpp index 597f03510..42df5711a 100644 --- a/Net/src/NetworkInterface.cpp +++ b/Net/src/NetworkInterface.cpp @@ -63,7 +63,6 @@ namespace Net { // NetworkInterfaceImpl // - class NetworkInterfaceImpl: public Poco::RefCountedObject { public: @@ -108,9 +107,6 @@ public: bool running() const; bool up() const; -protected: - ~NetworkInterfaceImpl(); - #if defined(POCO_OS_FAMILY_WINDOWS) void setFlags(DWORD flags, DWORD iftype); #else @@ -121,8 +117,11 @@ protected: void setMtu(unsigned mtu); void setType(Type type); void setIndex(unsigned index); - void getPhyParams(); - void getPeerAddress(); + void setPhyParams(); + void setPeerAddress(); + +protected: + ~NetworkInterfaceImpl(); private: std::string _name; @@ -164,8 +163,8 @@ NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const std::s _mtu(0) { _addressList.push_back(AddressTuple(address, IPAddress(), IPAddress())); - getPhyParams(); - if (_pointToPoint) getPeerAddress(); + setPhyParams(); + if (_pointToPoint) setPeerAddress(); } @@ -181,8 +180,8 @@ NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const std::s _running(false), _mtu(0) { - getPhyParams(); - if (_pointToPoint) getPeerAddress(); + setPhyParams(); + if (_pointToPoint) setPeerAddress(); } @@ -199,12 +198,12 @@ NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const std::s _mtu(0) { _addressList.push_back(AddressTuple(address, subnetMask, broadcastAddress)); - getPhyParams(); - if (_pointToPoint) getPeerAddress(); + setPhyParams(); + if (_pointToPoint) setPeerAddress(); } -void NetworkInterfaceImpl::getPhyParams() +void NetworkInterfaceImpl::setPhyParams() { #if !defined(POCO_OS_FAMILY_WINDOWS) && !defined(POCO_VXWORKS) struct ifreq ifr; @@ -220,7 +219,7 @@ void NetworkInterfaceImpl::getPhyParams() } -void NetworkInterfaceImpl::getPeerAddress() +void NetworkInterfaceImpl::setPeerAddress() { AddressList::iterator it = _addressList.begin(); AddressList::iterator end = _addressList.end(); @@ -948,9 +947,10 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly) #endif DWORD dwRetVal = 0; ULONG iterations = 0; - PIP_ADAPTER_ADDRESSES pAddress = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(memory.begin()); + PIP_ADAPTER_ADDRESSES pAddress = 0; do { + pAddress = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(memory.begin()); // leave in the loop, begin may change after resize poco_assert (memory.capacity() >= outBufLen); if (ERROR_BUFFER_OVERFLOW == (dwRetVal = GetAdaptersAddresses(family, flags, 0, pAddress, &outBufLen))) memory.resize(outBufLen); // adjust size and try again @@ -1048,7 +1048,9 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly) // VxWorks // +#error TODO +/* namespace Poco { namespace Net { @@ -1094,11 +1096,11 @@ NetworkInterface::NetworkInterfaceList NetworkInterface::list() } } // namespace Poco::Net +*/ - -#elif defined(POCO_OS_FAMILY_BSD) || POCO_OS == POCO_OS_QNX +#elif defined(POCO_OS_FAMILY_BSD) || (POCO_OS == POCO_OS_QNX) || (POCO_OS == POCO_OS_SOLARIS) // -// BSD variants +// BSD variants, QNX and Solaris // #include <sys/types.h> #include <sys/socket.h> @@ -1106,7 +1108,7 @@ NetworkInterface::NetworkInterfaceList NetworkInterface::list() #include <net/if.h> #include <net/if_dl.h> #include <net/if_types.h> - +#include <iostream> namespace Poco { namespace Net { @@ -1114,7 +1116,7 @@ namespace Net { namespace { -static NetworkInterface::Type fromNative(u_char nativeType) +NetworkInterface::Type fromNative(u_char nativeType) { switch (nativeType) { @@ -1124,11 +1126,24 @@ static NetworkInterface::Type fromNative(u_char nativeType) case IFT_PPP: return NetworkInterface::NI_TYPE_PPP; case IFT_LOOP: return NetworkInterface::NI_TYPE_SOFTWARE_LOOPBACK; case IFT_ATM: return NetworkInterface::NI_TYPE_ATM; +#if (POCO_OS != POCO_OS_SOLARIS) case IFT_IEEE1394: return NetworkInterface::NI_TYPE_IEEE1394; +#endif default: return NetworkInterface::NI_TYPE_OTHER; } } - + +void setInterfaceParams(struct ifaddrs* iface, NetworkInterfaceImpl& impl) +{ + struct sockaddr_dl* sdl = (struct sockaddr_dl*) iface->ifa_addr; + impl.setName(iface->ifa_name); + impl.setDisplayName(iface->ifa_name); + impl.setPhyParams(); + + impl.setMACAddress(LLADDR(sdl), sdl->sdl_alen); + impl.setType(fromNative(sdl->sdl_type)); +} + } @@ -1156,27 +1171,27 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly) unsigned family = currIface->ifa_addr->sa_family; switch (family) { +#if defined(POCO_OS_FAMILY_BSD) case AF_LINK: - { - struct sockaddr_dl* sdl = (struct sockaddr_dl*) currIface->ifa_addr; ifIndex = sdl->sdl_index; - intf = NetworkInterface(ifIndex); - intf.impl().setName(currIface->ifa_name); - intf.impl().setDisplayName(currIface->ifa_name); - intf.impl().getPhyParams(); - - intf.impl().setMACAddress(LLADDR(sdl), sdl->sdl_alen); - intf.impl().setType(fromNative(sdl->sdl_type)); - - if ((upOnly && intf.isUp()) || !upOnly) + if ((result.find(ifIndex) == result.end()) && ((upOnly && intf.isUp()) || !upOnly)) + { + intf = NetworkInterface(ifIndex); + setInterfaceParams(currIface, intf.impl()); ifIt = result.insert(Map::value_type(ifIndex, intf)).first; - + } break; - } +#endif case AF_INET: ifIndex = if_nametoindex(currIface->ifa_name); ifIt = result.find(ifIndex); - + if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly)) + { + intf = NetworkInterface(ifIndex); + setInterfaceParams(currIface, intf.impl()); + ifIt = result.insert(Map::value_type(ifIndex, intf)).first; + } + address = IPAddress(*(currIface->ifa_addr)); subnetMask = IPAddress(*(currIface->ifa_netmask)); @@ -1191,8 +1206,15 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly) case AF_INET6: ifIndex = if_nametoindex(currIface->ifa_name); ifIt = result.find(ifIndex); - - address = IPAddress(&reinterpret_cast<const struct sockaddr_in6*>(currIface->ifa_addr)->sin6_addr, sizeof(struct in6_addr), ifIndex); + if ((ifIt == result.end()) && ((upOnly && intf.isUp()) || !upOnly)) + { + intf = NetworkInterface(ifIndex); + setInterfaceParams(currIface, intf.impl()); + ifIt = result.insert(Map::value_type(ifIndex, intf)).first; + } + + address = IPAddress(&reinterpret_cast<const struct sockaddr_in6*>(currIface->ifa_addr)->sin6_addr, + sizeof(struct in6_addr), ifIndex); subnetMask = IPAddress(*(currIface->ifa_netmask)); broadcastAddress = IPAddress(); break; @@ -1295,7 +1317,7 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly) intf = NetworkInterface(ifIndex); intf.impl().setName(iface->ifa_name); intf.impl().setDisplayName(iface->ifa_name); - intf.impl().getPhyParams(); + intf.impl().setPhyParams(); intf.impl().setMACAddress(sll->sll_addr, sll->sll_halen); intf.impl().setType(fromNative(sll->sll_hatype)); @@ -1361,12 +1383,8 @@ NetworkInterface::Map NetworkInterface::map(bool ipOnly, bool upOnly) // // Non-BSD Unix variants // - - -namespace Poco { -namespace Net { - - +#error TODO +/* NetworkInterface::NetworkInterfaceList NetworkInterface::list() { FastMutex::ScopedLock lock(_mutex); @@ -1446,7 +1464,7 @@ NetworkInterface::NetworkInterfaceList NetworkInterface::list() delete [] buf; return result; } - +*/ } } // namespace Poco::Net diff --git a/build/config/SunOS-GCC b/build/config/SunOS-GCC index e11ecba25..6bead00af 100644 --- a/build/config/SunOS-GCC +++ b/build/config/SunOS-GCC @@ -68,4 +68,4 @@ SYSFLAGS = -D_XOPEN_SOURCE=500 -D_REENTRANT -D_THREAD_SAFE -D_FILE_OFFSET_BITS=6 # # System Specific Libraries # -SYSLIBS = -lpthread -ldl -lrt +SYSLIBS = -lpthread -lrt -lxnet -lsocket -lnsl -lresolv -ldl