32 namespace AddressLocalImp
34 static constexpr std::size_t minsize()
36 return sizeof( sockaddr_un::sun_family ) ;
38 static constexpr std::size_t psize()
40 return sizeof( sockaddr_un::sun_path ) ;
42 static std::size_t poffset() noexcept
44 return offsetof( sockaddr_un , sun_path ) ;
46 std::string unescape( std::string path )
48 if( path.size() > 1U && path[0U] ==
'\\' && path[1U] ==
'0' )
50 path = path.substr( 1U ) ;
58unsigned short GNet::AddressLocal::af() noexcept
63int GNet::AddressLocal::domain() noexcept
68GNet::AddressLocal::AddressLocal( std::nullptr_t ) :
70 m_size(AddressLocalImp::minsize())
72 m_local.sun_family = af() ;
73 std::memset( m_local.sun_path , 0 , AddressLocalImp::psize() ) ;
76GNet::AddressLocal::AddressLocal(
unsigned int ) :
81GNet::AddressLocal::AddressLocal(
unsigned int ,
int ) :
86GNet::AddressLocal::AddressLocal(
const sockaddr * addr , socklen_t len ,
bool ) :
89 std::size_t size =
static_cast<std::size_t
>( len ) ;
92 throw Address::Error() ;
93 if( addr->sa_family != af() || size >
sizeof(sockaddr_type) )
94 throw Address::BadFamily() ;
96 m_local = *(
reinterpret_cast<const sockaddr_type*
>(addr)) ;
100GNet::AddressLocal::AddressLocal(
const std::string & host_part ,
unsigned int ) :
101 AddressLocal(nullptr)
103 if( host_part.size() >= AddressLocalImp::psize() )
104 throw Address::BadString(
"local-domain address too long" ) ;
105 std::memcpy( m_local.sun_path , host_part.data() , host_part.size() ) ;
106 m_size = AddressLocalImp::poffset() + host_part.size() + 1U ;
109GNet::AddressLocal::AddressLocal(
const std::string & host_part ,
const std::string & ) :
110 AddressLocal(host_part,0)
114GNet::AddressLocal::AddressLocal(
const std::string & display_string ) :
115 AddressLocal(AddressLocalImp::unescape(display_string),0)
119void GNet::AddressLocal::setPort(
unsigned int )
123bool GNet::AddressLocal::setZone(
const std::string & )
128void GNet::AddressLocal::setScopeId(
unsigned long )
132std::string GNet::AddressLocal::path()
const
134 namespace imp = AddressLocalImp ;
135 G_ASSERT( m_size >= imp::minsize() ) ;
136 if( m_size <= imp::poffset() )
138 else if( m_local.sun_path[0] ==
'\0' )
139 return { m_local.sun_path , std::min(m_size-imp::poffset(),imp::psize()) } ;
141 return { m_local.sun_path , std::min(std::strlen(m_local.sun_path),imp::psize()) } ;
145std::string GNet::AddressLocal::displayString(
bool )
const
147 std::string p = path() ;
148 return p.empty() ? std::string(1U,
'/') :
G::Str::printable( p ) ;
151std::string GNet::AddressLocal::hostPartString(
bool raw )
const
153 return raw ? path() :
G::Str::printable(path()) ;
156std::string GNet::AddressLocal::queryString()
const
161bool GNet::AddressLocal::validData(
const sockaddr * addr , socklen_t len )
163 return addr !=
nullptr && addr->sa_family == af() && len >= AddressLocalImp::minsize() && len <=
sizeof(sockaddr_type) ;
166bool GNet::AddressLocal::validString(
const std::string & path , std::string * reason_p )
168 const char * reason = nullptr ;
169 if( path.size() > AddressLocalImp::psize() )
170 reason =
"local-domain address too long" ;
172 reason =
"empty string" ;
173 if( path[0] !=
'\0' && path[0] !=
'/' )
174 reason =
"not an absolute filesystem path" ;
175 if( reason && reason_p )
176 *reason_p = std::string( reason ) ;
177 return reason == nullptr ;
180bool GNet::AddressLocal::validStrings(
const std::string & host_part ,
const std::string & ,
181 std::string * reason_p )
183 return validString( host_part , reason_p ) ;
186bool GNet::AddressLocal::validPort(
unsigned int )
191bool GNet::AddressLocal::same(
const AddressLocal & other ,
bool )
const
193 G_ASSERT( m_local.sun_family == af() ) ;
195 m_local.sun_family == other.m_local.sun_family &&
196 m_size == other.m_size &&
197 path() == other.path() ;
200bool GNet::AddressLocal::sameHostPart(
const AddressLocal & other )
const
202 return same( other ) ;
205unsigned int GNet::AddressLocal::port()
const
210unsigned long GNet::AddressLocal::scopeId(
unsigned long default_ )
const
215const sockaddr * GNet::AddressLocal::address()
const
217 return reinterpret_cast<const sockaddr*
>(&m_local) ;
220sockaddr * GNet::AddressLocal::address()
222 return reinterpret_cast<sockaddr*
>(&m_local) ;
225socklen_t GNet::AddressLocal::length() const noexcept
232 return { displayString() } ;
235bool GNet::AddressLocal::format(
const std::string & )
240bool GNet::AddressLocal::isLocal( std::string & )
const
245bool GNet::AddressLocal::isLoopback()
const
250bool GNet::AddressLocal::isLinkLocal()
const
255bool GNet::AddressLocal::isUniqueLocal()
const
260bool GNet::AddressLocal::isAny()
const
262 return path().empty() ;
265unsigned int GNet::AddressLocal::bits()
const
std::vector< std::string > StringArray
A std::vector of std::strings.