$search
00001 // 00002 // descriptor_ops.hpp 00003 // ~~~~~~~~~~~~~~~~~~ 00004 // 00005 // Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com) 00006 // 00007 // Distributed under the Boost Software License, Version 1.0. (See accompanying 00008 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 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 } // namespace descriptor_ops 00131 } // namespace detail 00132 } // namespace asio 00133 00134 #endif // !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) 00135 00136 #include "asio/detail/pop_options.hpp" 00137 00138 #endif // ASIO_DETAIL_DESCRIPTOR_OPS_HPP