/usr/include/boost/asio/local/detail/impl/endpoint.ipp is in libboost1.49-dev 1.49.0-3.2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | //
// local/detail/impl/endpoint.hpp
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Copyright (c) 2003-2012 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_IMPL_ENDPOINT_IPP
#define BOOST_ASIO_LOCAL_DETAIL_IMPL_ENDPOINT_IPP
#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 <cstring>
#include <boost/asio/detail/socket_ops.hpp>
#include <boost/asio/detail/throw_error.hpp>
#include <boost/asio/error.hpp>
#include <boost/asio/local/detail/endpoint.hpp>
#include <boost/asio/detail/push_options.hpp>
namespace boost {
namespace asio {
namespace local {
namespace detail {
endpoint::endpoint()
{
init("", 0);
}
endpoint::endpoint(const char* path_name)
{
using namespace std; // For strlen.
init(path_name, strlen(path_name));
}
endpoint::endpoint(const std::string& path_name)
{
init(path_name.data(), path_name.length());
}
void endpoint::resize(std::size_t new_size)
{
if (new_size > sizeof(boost::asio::detail::sockaddr_un_type))
{
boost::system::error_code ec(boost::asio::error::invalid_argument);
boost::asio::detail::throw_error(ec);
}
else if (new_size == 0)
{
path_length_ = 0;
}
else
{
path_length_ = new_size
- offsetof(boost::asio::detail::sockaddr_un_type, sun_path);
// The path returned by the operating system may be NUL-terminated.
if (path_length_ > 0 && data_.local.sun_path[path_length_ - 1] == 0)
--path_length_;
}
}
std::string endpoint::path() const
{
return std::string(data_.local.sun_path, path_length_);
}
void endpoint::path(const char* p)
{
using namespace std; // For strlen.
init(p, strlen(p));
}
void endpoint::path(const std::string& p)
{
init(p.data(), p.length());
}
bool operator==(const endpoint& e1, const endpoint& e2)
{
return e1.path() == e2.path();
}
bool operator<(const endpoint& e1, const endpoint& e2)
{
return e1.path() < e2.path();
}
void endpoint::init(const char* path_name, std::size_t path_length)
{
if (path_length > sizeof(data_.local.sun_path) - 1)
{
// The buffer is not large enough to store this address.
boost::system::error_code ec(boost::asio::error::name_too_long);
boost::asio::detail::throw_error(ec);
}
using namespace std; // For memcpy.
data_.local = boost::asio::detail::sockaddr_un_type();
data_.local.sun_family = AF_UNIX;
memcpy(data_.local.sun_path, path_name, path_length);
path_length_ = path_length;
// NUL-terminate normal path names. Names that start with a NUL are in the
// UNIX domain protocol's "abstract namespace" and are not NUL-terminated.
if (path_length > 0 && data_.local.sun_path[0] == 0)
data_.local.sun_path[path_length] = 0;
}
} // namespace detail
} // namespace local
} // namespace asio
} // namespace boost
#include <boost/asio/detail/pop_options.hpp>
#endif // defined(BOOST_ASIO_HAS_LOCAL_SOCKETS)
#endif // BOOST_ASIO_LOCAL_DETAIL_IMPL_ENDPOINT_IPP
|