00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef ASIO_DETAIL_DESCRIPTOR_OPS_HPP
00012 #define ASIO_DETAIL_DESCRIPTOR_OPS_HPP
00013
00014 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
00015 # pragma once
00016 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
00017
00018 #include "asio/detail/push_options.hpp"
00019
00020 #include "asio/detail/push_options.hpp"
00021 #include <boost/config.hpp>
00022 #include <cerrno>
00023 #include "asio/detail/pop_options.hpp"
00024
00025 #include "asio/error.hpp"
00026 #include "asio/detail/socket_types.hpp"
00027
00028 #if !defined(BOOST_WINDOWS) && !defined(__CYGWIN__)
00029
00030 namespace asio {
00031 namespace detail {
00032 namespace descriptor_ops {
00033
00034 inline void clear_error(asio::error_code& ec)
00035 {
00036 errno = 0;
00037 ec = asio::error_code();
00038 }
00039
00040 template <typename ReturnType>
00041 inline ReturnType error_wrapper(ReturnType return_value,
00042 asio::error_code& ec)
00043 {
00044 ec = asio::error_code(errno,
00045 asio::error::get_system_category());
00046 return return_value;
00047 }
00048
00049 inline int open(const char* path, int flags, asio::error_code& ec)
00050 {
00051 clear_error(ec);
00052 return error_wrapper(::open(path, flags), ec);
00053 }
00054
00055 inline int close(int d, asio::error_code& ec)
00056 {
00057 clear_error(ec);
00058 return error_wrapper(::close(d), ec);
00059 }
00060
00061 typedef iovec buf;
00062
00063 inline void init_buf(buf& b, void* data, size_t size)
00064 {
00065 b.iov_base = data;
00066 b.iov_len = size;
00067 }
00068
00069 inline void init_buf(buf& b, const void* data, size_t size)
00070 {
00071 b.iov_base = const_cast<void*>(data);
00072 b.iov_len = size;
00073 }
00074
00075 inline int scatter_read(int d, buf* bufs, size_t count,
00076 asio::error_code& ec)
00077 {
00078 clear_error(ec);
00079 return error_wrapper(::readv(d, bufs, static_cast<int>(count)), ec);
00080 }
00081
00082 inline int gather_write(int d, const buf* bufs, size_t count,
00083 asio::error_code& ec)
00084 {
00085 clear_error(ec);
00086 return error_wrapper(::writev(d, bufs, static_cast<int>(count)), ec);
00087 }
00088
00089 inline int ioctl(int d, long cmd, ioctl_arg_type* arg,
00090 asio::error_code& ec)
00091 {
00092 clear_error(ec);
00093 return error_wrapper(::ioctl(d, cmd, arg), ec);
00094 }
00095
00096 inline int fcntl(int d, long cmd, asio::error_code& ec)
00097 {
00098 clear_error(ec);
00099 return error_wrapper(::fcntl(d, cmd), ec);
00100 }
00101
00102 inline int fcntl(int d, long cmd, long arg, asio::error_code& ec)
00103 {
00104 clear_error(ec);
00105 return error_wrapper(::fcntl(d, cmd, arg), ec);
00106 }
00107
00108 inline int poll_read(int d, asio::error_code& ec)
00109 {
00110 clear_error(ec);
00111 pollfd fds;
00112 fds.fd = d;
00113 fds.events = POLLIN;
00114 fds.revents = 0;
00115 clear_error(ec);
00116 return error_wrapper(::poll(&fds, 1, -1), ec);
00117 }
00118
00119 inline int poll_write(int d, asio::error_code& ec)
00120 {
00121 clear_error(ec);
00122 pollfd fds;
00123 fds.fd = d;
00124 fds.events = POLLOUT;
00125 fds.revents = 0;
00126 clear_error(ec);
00127 return error_wrapper(::poll(&fds, 1, -1), ec);
00128 }
00129
00130 }
00131 }
00132 }
00133
00134 #endif // !defined(BOOST_WINDOWS) && !defined(__CYGWIN__)
00135
00136 #include "asio/detail/pop_options.hpp"
00137
00138 #endif // ASIO_DETAIL_DESCRIPTOR_OPS_HPP