mirror of
https://github.com/ZeroTier/ZeroTierOne
synced 2025-08-21 13:54:15 -07:00
Safely handle disappearing bonded interfaces (See issue #1587)
This commit is contained in:
parent
eea93d2607
commit
6c85f8c7a7
3 changed files with 135 additions and 73 deletions
|
@ -229,23 +229,33 @@ public:
|
|||
* @param s Socket object
|
||||
* @return Underlying OS-type (usually int or long) file descriptor associated with object
|
||||
*/
|
||||
static inline ZT_PHY_SOCKFD_TYPE getDescriptor(PhySocket *s) throw() { return reinterpret_cast<PhySocketImpl *>(s)->sock; }
|
||||
static inline ZT_PHY_SOCKFD_TYPE getDescriptor(PhySocket* s) throw()
|
||||
{
|
||||
return reinterpret_cast<PhySocketImpl*>(s)->sock;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param s Socket object
|
||||
* @return Pointer to user object
|
||||
*/
|
||||
static inline void** getuptr(PhySocket *s) throw() { return &(reinterpret_cast<PhySocketImpl *>(s)->uptr); }
|
||||
static inline void** getuptr(PhySocket* s) throw()
|
||||
{
|
||||
return &(reinterpret_cast<PhySocketImpl*>(s)->uptr);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param s Socket object
|
||||
* @param nameBuf Buffer to store name of interface which this Socket object is bound to
|
||||
* @param buflen Length of buffer to copy name into
|
||||
*/
|
||||
static inline void getIfName(PhySocket *s, char *nameBuf, int buflen)
|
||||
static inline void getIfName(PhySocket* s, char* nameBuf, int buflen)
|
||||
{
|
||||
PhySocketImpl& sws = *(reinterpret_cast<PhySocketImpl*>(s));
|
||||
if (sws.type == ZT_PHY_SOCKET_CLOSED) {
|
||||
return;
|
||||
}
|
||||
if (s) {
|
||||
memcpy(nameBuf, reinterpret_cast<PhySocketImpl *>(s)->ifname, buflen);
|
||||
memcpy(nameBuf, reinterpret_cast<PhySocketImpl*>(s)->ifname, buflen);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -254,10 +264,14 @@ public:
|
|||
* @param ifname Buffer containing name of interface that this Socket object is bound to
|
||||
* @param len Length of name of interface
|
||||
*/
|
||||
static inline void setIfName(PhySocket *s, char *ifname, int len)
|
||||
static inline void setIfName(PhySocket* s, char* ifname, int len)
|
||||
{
|
||||
PhySocketImpl& sws = *(reinterpret_cast<PhySocketImpl*>(s));
|
||||
if (sws.type == ZT_PHY_SOCKET_CLOSED) {
|
||||
return;
|
||||
}
|
||||
if (s) {
|
||||
memcpy(&(reinterpret_cast<PhySocketImpl *>(s)->ifname), ifname, len);
|
||||
memcpy(&(reinterpret_cast<PhySocketImpl*>(s)->ifname), ifname, len);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -270,21 +284,27 @@ public:
|
|||
inline void whack()
|
||||
{
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
::send(_whackSendSocket,(const char *)this,1,0);
|
||||
::send(_whackSendSocket, (const char*)this, 1, 0);
|
||||
#else
|
||||
(void)(::write(_whackSendSocket,(PhySocket *)this,1));
|
||||
(void)(::write(_whackSendSocket, (PhySocket*)this, 1));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Number of open sockets
|
||||
*/
|
||||
inline unsigned long count() const throw() { return _socks.size(); }
|
||||
inline unsigned long count() const throw()
|
||||
{
|
||||
return _socks.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Maximum number of sockets allowed
|
||||
*/
|
||||
inline unsigned long maxCount() const throw() { return ZT_PHY_MAX_SOCKETS; }
|
||||
inline unsigned long maxCount() const throw()
|
||||
{
|
||||
return ZT_PHY_MAX_SOCKETS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap a raw file descriptor in a PhySocket structure
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue