/usr/include/ros/io.h is in libroscpp-dev 1.11.16-3.
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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | /*
* Software License Agreement (BSD License)
*
* Copyright (c) 2008, Willow Garage, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Willow Garage, Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*****************************************************************************
** Ifdefs
*****************************************************************************/
#ifndef ROSCPP_IO_H_
#define ROSCPP_IO_H_
/*****************************************************************************
** Includes
*****************************************************************************/
#include <string>
#include "common.h"
#ifdef WIN32
#include <winsock2.h> // For struct timeval
#include <ws2tcpip.h> // Must be after winsock2.h because MS didn't put proper inclusion guards in their headers.
#include <sys/types.h>
#include <io.h>
#include <fcntl.h>
#include <process.h> // for _getpid
#else
#include <poll.h> // should get cmake to explicitly check for poll.h?
#include <sys/poll.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <netdb.h> // getnameinfo in network.cpp
#include <netinet/in.h> // sockaddr_in in network.cpp
#include <netinet/tcp.h> // TCP_NODELAY in transport/transport_tcp.cpp
#endif
/*****************************************************************************
** Cross Platform Macros
*****************************************************************************/
#ifdef WIN32
#define getpid _getpid
#define ROS_INVALID_SOCKET INVALID_SOCKET
#define ROS_SOCKETS_SHUT_RDWR SD_BOTH /* Used by ::shutdown() */
#define ROS_SOCKETS_ASYNCHRONOUS_CONNECT_RETURN WSAEWOULDBLOCK
#ifndef POLLRDNORM
#define POLLRDNORM 0x0100 /* mapped to read fds_set */
#endif
#ifndef POLLRDBAND
#define POLLRDBAND 0x0200 /* mapped to exception fds_set */
#endif
#ifndef POLLIN
#define POLLIN (POLLRDNORM | POLLRDBAND) /* There is data to read. */
#endif
#ifndef POLLPRI
#define POLLPRI 0x0400 /* There is urgent data to read. */
#endif
#ifndef POLLWRNORM
#define POLLWRNORM 0x0010 /* mapped to write fds_set */
#endif
#ifndef POLLOUT
#define POLLOUT (POLLWRNORM) /* Writing now will not block. */
#endif
#ifndef POLLWRBAND
#define POLLWRBAND 0x0020 /* mapped to write fds_set */
#endif
#ifndef POLLERR
#define POLLERR 0x0001 /* Error condition. */
#endif
#ifndef POLLHUP
#define POLLHUP 0x0002 /* Hung up. */
#endif
#ifndef POLLNVAL
#define POLLNVAL 0x0004 /* Invalid polling request. */
#endif
#else
#define ROS_SOCKETS_SHUT_RDWR SHUT_RDWR /* Used by ::shutdown() */
#define ROS_INVALID_SOCKET ((int) -1)
#define ROS_SOCKETS_ASYNCHRONOUS_CONNECT_RETURN EINPROGRESS
#endif
/*****************************************************************************
** Namespaces
*****************************************************************************/
namespace ros {
/*****************************************************************************
** Cross Platform Types
*****************************************************************************/
#ifdef WIN32
typedef SOCKET socket_fd_t;
typedef SOCKET signal_fd_t;
/* poll emulation support */
typedef struct socket_pollfd {
socket_fd_t fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
} socket_pollfd;
typedef unsigned long int nfds_t;
#ifdef _MSC_VER
typedef int pid_t; /* return type for windows' _getpid */
#endif
#else
typedef int socket_fd_t;
typedef int signal_fd_t;
typedef struct pollfd socket_pollfd;
#endif
/*****************************************************************************
** Functions
*****************************************************************************/
ROSCPP_DECL int last_socket_error();
ROSCPP_DECL const char* last_socket_error_string();
ROSCPP_DECL bool last_socket_error_is_would_block();
ROSCPP_DECL int poll_sockets(socket_pollfd *fds, nfds_t nfds, int timeout);
ROSCPP_DECL int set_non_blocking(socket_fd_t &socket);
ROSCPP_DECL int close_socket(socket_fd_t &socket);
ROSCPP_DECL int create_signal_pair(signal_fd_t signal_pair[2]);
/*****************************************************************************
** Inlines - almost direct api replacements, should stay fast.
*****************************************************************************/
/**
* Closes the signal pair - on windows we're using sockets (because windows
* select() function cant handle pipes). On linux, we're just using the pipes.
* @param signal_pair : the signal pair type.
*/
inline void close_signal_pair(signal_fd_t signal_pair[2]) {
#ifdef WIN32 // use a socket pair
::closesocket(signal_pair[0]);
::closesocket(signal_pair[1]);
#else // use a socket pair on mingw or pipe pair on linux, either way, close works
::close(signal_pair[0]);
::close(signal_pair[1]);
#endif
}
/**
* Write to a signal_fd_t device. On windows we're using sockets (because windows
* select() function cant handle pipes) so we have to use socket functions.
* On linux, we're just using the pipes.
*/
#ifdef _MSC_VER
inline int write_signal(const signal_fd_t &signal, const char *buffer, const unsigned int &nbyte) {
return ::send(signal, buffer, nbyte, 0);
// return write(signal, buffer, nbyte);
}
#else
inline ssize_t write_signal(const signal_fd_t &signal, const void *buffer, const size_t &nbyte) {
return write(signal, buffer, nbyte);
}
#endif
/**
* Read from a signal_fd_t device. On windows we're using sockets (because windows
* select() function cant handle pipes) so we have to use socket functions.
* On linux, we're just using the pipes.
*/
#ifdef _MSC_VER
inline int read_signal(const signal_fd_t &signal, char *buffer, const unsigned int &nbyte) {
return ::recv(signal, buffer, nbyte, 0);
// return _read(signal, buffer, nbyte);
}
#else
inline ssize_t read_signal(const signal_fd_t &signal, void *buffer, const size_t &nbyte) {
return read(signal, buffer, nbyte);
}
#endif
} // namespace ros
#endif /* ROSCPP_IO_H_ */
|