| // |
| // local/detail/endpoint.hpp |
| // ~~~~~~~~~~~~~~~~~~~~~~~~~ |
| // |
| // Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com) |
| // Derived from a public domain implementation written by Daniel Casimiro. |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See accompanying |
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| // |
| |
| #ifndef BOOST_ASIO_LOCAL_DETAIL_ENDPOINT_HPP |
| #define BOOST_ASIO_LOCAL_DETAIL_ENDPOINT_HPP |
| |
| #if defined(_MSC_VER) && (_MSC_VER >= 1200) |
| # pragma once |
| #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) |
| |
| #include <boost/asio/detail/config.hpp> |
| |
| #if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS) |
| |
| #include <cstddef> |
| #include <string> |
| #include <boost/asio/detail/socket_types.hpp> |
| |
| #include <boost/asio/detail/push_options.hpp> |
| |
| namespace boost { |
| namespace asio { |
| namespace local { |
| namespace detail { |
| |
| // Helper class for implementing a UNIX domain endpoint. |
| class endpoint |
| { |
| public: |
| // Default constructor. |
| BOOST_ASIO_DECL endpoint(); |
| |
| // Construct an endpoint using the specified path name. |
| BOOST_ASIO_DECL endpoint(const char* path); |
| |
| // Construct an endpoint using the specified path name. |
| BOOST_ASIO_DECL endpoint(const std::string& path); |
| |
| // Copy constructor. |
| endpoint(const endpoint& other) |
| : data_(other.data_), |
| path_length_(other.path_length_) |
| { |
| } |
| |
| // Assign from another endpoint. |
| endpoint& operator=(const endpoint& other) |
| { |
| data_ = other.data_; |
| path_length_ = other.path_length_; |
| return *this; |
| } |
| |
| // Get the underlying endpoint in the native type. |
| boost::asio::detail::socket_addr_type* data() |
| { |
| return &data_.base; |
| } |
| |
| // Get the underlying endpoint in the native type. |
| const boost::asio::detail::socket_addr_type* data() const |
| { |
| return &data_.base; |
| } |
| |
| // Get the underlying size of the endpoint in the native type. |
| std::size_t size() const |
| { |
| return path_length_ |
| + offsetof(boost::asio::detail::sockaddr_un_type, sun_path); |
| } |
| |
| // Set the underlying size of the endpoint in the native type. |
| BOOST_ASIO_DECL void resize(std::size_t size); |
| |
| // Get the capacity of the endpoint in the native type. |
| std::size_t capacity() const |
| { |
| return sizeof(boost::asio::detail::sockaddr_un_type); |
| } |
| |
| // Get the path associated with the endpoint. |
| BOOST_ASIO_DECL std::string path() const; |
| |
| // Set the path associated with the endpoint. |
| BOOST_ASIO_DECL void path(const char* p); |
| |
| // Set the path associated with the endpoint. |
| BOOST_ASIO_DECL void path(const std::string& p); |
| |
| // Compare two endpoints for equality. |
| BOOST_ASIO_DECL friend bool operator==( |
| const endpoint& e1, const endpoint& e2); |
| |
| // Compare endpoints for ordering. |
| BOOST_ASIO_DECL friend bool operator<( |
| const endpoint& e1, const endpoint& e2); |
| |
| private: |
| // The underlying UNIX socket address. |
| union data_union |
| { |
| boost::asio::detail::socket_addr_type base; |
| boost::asio::detail::sockaddr_un_type local; |
| } data_; |
| |
| // The length of the path associated with the endpoint. |
| std::size_t path_length_; |
| |
| // Initialise with a specified path. |
| BOOST_ASIO_DECL void init(const char* path, std::size_t path_length); |
| }; |
| |
| } // namespace detail |
| } // namespace local |
| } // namespace asio |
| } // namespace boost |
| |
| #include <boost/asio/detail/pop_options.hpp> |
| |
| #if defined(BOOST_ASIO_HEADER_ONLY) |
| # include <boost/asio/local/detail/impl/endpoint.ipp> |
| #endif // defined(BOOST_ASIO_HEADER_ONLY) |
| |
| #endif // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS) |
| |
| #endif // BOOST_ASIO_LOCAL_DETAIL_ENDPOINT_HPP |