1 | //----------------------------------------------------------------------------
|
---|
2 | /// \file boost-ext.hpp
|
---|
3 | //----------------------------------------------------------------------------
|
---|
4 | /// \brief This file contains implementation of a timestamp supporting
|
---|
5 | /// socket options.
|
---|
6 | //----------------------------------------------------------------------------
|
---|
7 | // Author: Serge Aleynikov <saleyn@gmail.com>
|
---|
8 | // Created: 2010-09-30
|
---|
9 | // License: The same open-source licensing terms apply as in boost::asio.
|
---|
10 | //----------------------------------------------------------------------------
|
---|
11 | #ifndef _BOOST_ASIO_EXT_HPP_
|
---|
12 | #define _BOOST_ASIO_EXT_HPP_
|
---|
13 |
|
---|
14 | #include <time.h>
|
---|
15 | #include <boost/asio/detail/socket_option.hpp>
|
---|
16 |
|
---|
17 | namespace boost {
|
---|
18 | namespace asio {
|
---|
19 |
|
---|
20 | namespace ip {
|
---|
21 | namespace unicast {
|
---|
22 |
|
---|
23 | #if defined(GENERATING_DOCUMENTATION)
|
---|
24 | typedef implementation_defined timestamp;
|
---|
25 | #else
|
---|
26 | typedef boost::asio::detail::socket_option::boolean<
|
---|
27 | SOL_SOCKET, SO_TIMESTAMP> timestamp;
|
---|
28 | #endif
|
---|
29 |
|
---|
30 | #if defined(GENERATING_DOCUMENTATION)
|
---|
31 | typedef implementation_defined timestampns;
|
---|
32 | #else
|
---|
33 | typedef boost::asio::detail::socket_option::boolean<
|
---|
34 | SOL_SOCKET, SO_TIMESTAMPNS> timestampns;
|
---|
35 | #endif
|
---|
36 |
|
---|
37 | } // namespace unicast
|
---|
38 | } // namespace ip
|
---|
39 |
|
---|
40 | namespace detail {
|
---|
41 | namespace io_control {
|
---|
42 |
|
---|
43 | // Helper template for implementing SIOCGSTAMP option.
|
---|
44 | class siocgstamp {
|
---|
45 | public:
|
---|
46 | // Default constructor.
|
---|
47 | siocgstamp() {
|
---|
48 | m_value.tv_sec = 0;
|
---|
49 | m_value.tv_usec = 0;
|
---|
50 | }
|
---|
51 |
|
---|
52 | siocgstamp(struct timeval* tv) { set(*tv); }
|
---|
53 |
|
---|
54 | const struct timeval* get() const { return &m_value; }
|
---|
55 |
|
---|
56 | void set(const struct timeval& tv) {
|
---|
57 | m_value.tv_sec = tv.tv_sec;
|
---|
58 | m_value.tv_usec = tv.tv_usec;
|
---|
59 | }
|
---|
60 |
|
---|
61 | //const struct timeval& get() const { return m_value; }
|
---|
62 | //struct timeval& get() { return m_value; }
|
---|
63 |
|
---|
64 | const struct timeval* operator*() const { return &m_value; }
|
---|
65 | struct timeval* operator*() { return &m_value; }
|
---|
66 |
|
---|
67 | // Get the value for the siocgstamp timeout.
|
---|
68 | double value() const {
|
---|
69 | return static_cast<double>(m_value.tv_sec)
|
---|
70 | + static_cast<double>(m_value.tv_usec) / 1000000.0;
|
---|
71 | }
|
---|
72 |
|
---|
73 | long diff_usec(struct timeval& other) {
|
---|
74 | return (m_value.tv_sec - other.tv_sec)*1000000
|
---|
75 | + (m_value.tv_usec - other.tv_usec);
|
---|
76 | }
|
---|
77 |
|
---|
78 | // Get the name of the socket option.
|
---|
79 | int name() const { return SIOCGSTAMP; }
|
---|
80 |
|
---|
81 | // Get the address of the siocgstamp data.
|
---|
82 | detail::ioctl_arg_type* data() {
|
---|
83 | return reinterpret_cast<detail::ioctl_arg_type*>(&m_value);
|
---|
84 | }
|
---|
85 |
|
---|
86 | // Get the address of the siocgstamp data.
|
---|
87 | const detail::ioctl_arg_type* data() const {
|
---|
88 | return reinterpret_cast<const detail::ioctl_arg_type*>(&m_value);
|
---|
89 | }
|
---|
90 | private:
|
---|
91 | struct timeval m_value;
|
---|
92 | };
|
---|
93 |
|
---|
94 | } // namespace socket_option
|
---|
95 | } // namespace detail
|
---|
96 | } // namespace asio
|
---|
97 | } // namespace boost
|
---|
98 |
|
---|
99 | #endif // _BOOST_ASIO_EXT_HPP_
|
---|