#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
-#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/uio.h>
set_dscp(int fd, uint8_t dscp)
{
int val;
+ bool success;
if (dscp > 63) {
return EINVAL;
}
+ /* Note: this function is used for both of IPv4 and IPv6 sockets */
+ success = false;
val = dscp << 2;
if (setsockopt(fd, IPPROTO_IP, IP_TOS, &val, sizeof val)) {
- return sock_errno();
+ if (sock_errno() != ENOPROTOOPT) {
+ return sock_errno();
+ }
+ } else {
+ success = true;
+ }
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &val, sizeof val)) {
+ if (sock_errno() != ENOPROTOOPT) {
+ return sock_errno();
+ }
+ } else {
+ success = true;
+ }
+ if (!success) {
+ return ENOPROTOOPT;
}
return 0;
pfd.fd = fd;
pfd.events = POLLOUT;
+
+#ifndef _WIN32
do {
retval = poll(&pfd, 1, 0);
} while (retval < 0 && errno == EINTR);
+#else
+ retval = WSAPoll(&pfd, 1, 0);
+#endif
if (retval == 1) {
if (pfd.revents & POLLERR) {
- ssize_t n = send(fd, "", 1, MSG_DONTWAIT);
+ ssize_t n = send(fd, "", 1, 0);
if (n < 0) {
- return errno;
+ return sock_errno();
} else {
VLOG_ERR_RL(&rl, "poll return POLLERR but send succeeded");
return EPROTO;
}
return 0;
} else if (retval < 0) {
- VLOG_ERR_RL(&rl, "poll: %s", ovs_strerror(errno));
+ VLOG_ERR_RL(&rl, "poll: %s", sock_strerror(sock_errno()));
return errno;
} else {
return EAGAIN;
}
}
+#ifndef _WIN32
/* Drain all the data currently in the receive queue of a datagram socket (and
* possibly additional data). There is no way to know how many packets are in
* the receive queue, but we do know that the total number of bytes queued does
}
return 0;
}
+#endif
/* Returns the size of socket 'sock''s receive buffer (SO_RCVBUF), or a
* negative errno value if an error occurs. */
* connect(), the handshake SYN frames will be sent with a TOS of 0. */
error = set_dscp(fd, dscp);
if (error) {
- VLOG_ERR("%s: socket: %s", target, sock_strerror(error));
+ VLOG_ERR("%s: set_dscp: %s", target, sock_strerror(error));
goto exit;
}
* connect(), the handshake SYN frames will be sent with a TOS of 0. */
error = set_dscp(fd, dscp);
if (error) {
- VLOG_ERR("%s: socket: %s", target, sock_strerror(error));
+ VLOG_ERR("%s: set_dscp: %s", target, sock_strerror(error));
goto error;
}
return -error;
}
-/* Returns a readable and writable fd for /dev/null, if successful, otherwise
- * a negative errno value. The caller must not close the returned fd (because
- * the same fd will be handed out to subsequent callers). */
-int
-get_null_fd(void)
-{
- static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
- static int null_fd;
-
- if (ovsthread_once_start(&once)) {
- null_fd = open("/dev/null", O_RDWR);
- if (null_fd < 0) {
- int error = errno;
- VLOG_ERR("could not open /dev/null: %s", ovs_strerror(error));
- null_fd = -error;
- }
- ovsthread_once_done(&once);
- }
-
- return null_fd;
-}
-
int
read_fully(int fd, void *p_, size_t size, size_t *bytes_read)
{
}
}
+#ifndef _WIN32
void
xpipe(int fds[2])
{
xset_nonblocking(fds[0]);
xset_nonblocking(fds[1]);
}
+#endif
static int
getsockopt_int(int fd, int level, int option, const char *optname, int *valuep)