You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@guacamole.apache.org by vn...@apache.org on 2017/08/13 18:26:45 UTC
[7/9] incubator-guacamole-server git commit: GUACAMOLE-325: Use
select() if poll() is unavailable.
GUACAMOLE-325: Use select() if poll() is unavailable.
Project: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/commit/9dcddd19
Tree: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/tree/9dcddd19
Diff: http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/diff/9dcddd19
Branch: refs/heads/master
Commit: 9dcddd1947c83d9154f96d15ce2aa1c6c15570c8
Parents: 50d2dd5
Author: Michael Jumper <mj...@apache.org>
Authored: Mon Jun 12 13:58:05 2017 -0700
Committer: Michael Jumper <mj...@apache.org>
Committed: Wed Jul 5 20:55:02 2017 -0700
----------------------------------------------------------------------
src/libguac/Makefile.am | 6 ++--
src/libguac/socket-fd.c | 27 +++++-----------
src/libguac/socket-ssl.c | 20 ++----------
src/libguac/wait-fd.c | 72 +++++++++++++++++++++++++++++++++++++++++++
src/libguac/wait-fd.h | 41 ++++++++++++++++++++++++
5 files changed, 127 insertions(+), 39 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/9dcddd19/src/libguac/Makefile.am
----------------------------------------------------------------------
diff --git a/src/libguac/Makefile.am b/src/libguac/Makefile.am
index a1f47ed..35e8e6e 100644
--- a/src/libguac/Makefile.am
+++ b/src/libguac/Makefile.am
@@ -68,7 +68,8 @@ noinst_HEADERS = \
encode-png.h \
palette.h \
user-handlers.h \
- raw_encoder.h
+ raw_encoder.h \
+ wait-fd.h
libguac_la_SOURCES = \
audio.c \
@@ -92,7 +93,8 @@ libguac_la_SOURCES = \
unicode.c \
user.c \
user-handlers.c \
- user-handshake.c
+ user-handshake.c \
+ wait-fd.c
# Compile WebP support if available
if ENABLE_WEBP
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/9dcddd19/src/libguac/socket-fd.c
----------------------------------------------------------------------
diff --git a/src/libguac/socket-fd.c b/src/libguac/socket-fd.c
index 0ed5748..f806b87 100644
--- a/src/libguac/socket-fd.c
+++ b/src/libguac/socket-fd.c
@@ -21,8 +21,8 @@
#include "error.h"
#include "socket.h"
+#include "wait-fd.h"
-#include <poll.h>
#include <pthread.h>
#include <stddef.h>
#include <stdio.h>
@@ -31,6 +31,10 @@
#include <sys/time.h>
#include <unistd.h>
+#ifdef __MINGW32__
+#include <winsock2.h>
+#endif
+
/**
* Data associated with an open socket which writes to a file descriptor.
*/
@@ -330,24 +334,9 @@ static ssize_t guac_socket_fd_write_handler(guac_socket* socket,
static int guac_socket_fd_select_handler(guac_socket* socket,
int usec_timeout) {
+ /* Wait for data on socket */
guac_socket_fd_data* data = (guac_socket_fd_data*) socket->data;
-
- int retval;
-
- /* Initialize with single underlying file descriptor */
- struct pollfd fds[1] = {{
- .fd = data->fd,
- .events = POLLIN,
- .revents = 0,
- }};
-
- /* No timeout if usec_timeout is negative */
- if (usec_timeout < 0)
- retval = poll(fds, 1, -1);
-
- /* Handle timeout if specified, rounding up to poll()'s granularity */
- else
- retval = poll(fds, 1, (usec_timeout + 999) / 1000);
+ int retval = guac_wait_for_fd(data->fd, usec_timeout);
/* Properly set guac_error */
if (retval < 0) {
@@ -355,7 +344,7 @@ static int guac_socket_fd_select_handler(guac_socket* socket,
guac_error_message = "Error while waiting for data on socket";
}
- if (retval == 0) {
+ else if (retval == 0) {
guac_error = GUAC_STATUS_TIMEOUT;
guac_error_message = "Timeout while waiting for data on socket";
}
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/9dcddd19/src/libguac/socket-ssl.c
----------------------------------------------------------------------
diff --git a/src/libguac/socket-ssl.c b/src/libguac/socket-ssl.c
index f8f3f87..1a631fe 100644
--- a/src/libguac/socket-ssl.c
+++ b/src/libguac/socket-ssl.c
@@ -22,8 +22,8 @@
#include "error.h"
#include "socket-ssl.h"
#include "socket.h"
+#include "wait-fd.h"
-#include <poll.h>
#include <stdlib.h>
#include <openssl/ssl.h>
@@ -69,23 +69,7 @@ static ssize_t __guac_socket_ssl_write_handler(guac_socket* socket,
static int __guac_socket_ssl_select_handler(guac_socket* socket, int usec_timeout) {
guac_socket_ssl_data* data = (guac_socket_ssl_data*) socket->data;
-
- int retval;
-
- /* Initialize with single underlying file descriptor */
- struct pollfd fds[1] = {{
- .fd = data->fd,
- .events = POLLIN,
- .revents = 0,
- }};
-
- /* No timeout if usec_timeout is negative */
- if (usec_timeout < 0)
- retval = poll(fds, 1, -1);
-
- /* Handle timeout if specified, rounding up to poll()'s granularity */
- else
- retval = poll(fds, 1, (usec_timeout + 999) / 1000);
+ int retval = guac_wait_for_fd(data->fd, usec_timeout);
/* Properly set guac_error */
if (retval < 0) {
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/9dcddd19/src/libguac/wait-fd.c
----------------------------------------------------------------------
diff --git a/src/libguac/wait-fd.c b/src/libguac/wait-fd.c
new file mode 100644
index 0000000..0523e62
--- /dev/null
+++ b/src/libguac/wait-fd.c
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "config.h"
+
+#ifdef __MINGW32__
+# include <winsock2.h>
+#else
+# ifdef HAVE_POLL
+# include <poll.h>
+# else
+# include <sys/select.h>
+# endif
+#endif
+
+#ifdef HAVE_POLL
+int guac_wait_for_fd(int fd, int usec_timeout) {
+
+ /* Initialize with single underlying file descriptor */
+ struct pollfd fds[1] = {{
+ .fd = fd,
+ .events = POLLIN,
+ .revents = 0
+ }};
+
+ /* No timeout if usec_timeout is negative */
+ if (usec_timeout < 0)
+ return poll(fds, 1, -1);
+
+ /* Handle timeout if specified, rounding up to poll()'s granularity */
+ return poll(fds, 1, (usec_timeout + 999) / 1000);
+
+}
+#else
+int guac_wait_for_fd(int fd, int usec_timeout) {
+
+ fd_set fds;
+
+ /* Initialize fd_set with single underlying file descriptor */
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+
+ /* No timeout if usec_timeout is negative */
+ if (usec_timeout < 0)
+ return select(fd + 1, &fds, NULL, NULL, NULL);
+
+ /* Handle timeout if specified */
+ struct timeval timeout = {
+ .tv_sec = usec_timeout / 1000000,
+ .tv_usec = usec_timeout % 1000000
+ };
+
+ return select(fd + 1, &fds, NULL, NULL, &timeout);
+
+}
+#endif
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/9dcddd19/src/libguac/wait-fd.h
----------------------------------------------------------------------
diff --git a/src/libguac/wait-fd.h b/src/libguac/wait-fd.h
new file mode 100644
index 0000000..b5e2e5f
--- /dev/null
+++ b/src/libguac/wait-fd.h
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef GUAC_WAIT_FD_H
+#define GUAC_WAIT_FD_H
+
+/**
+ * Waits for data to be available for reading on a given file descriptor,
+ * similar to the POSIX select() and poll() functions.
+ *
+ * @param fd
+ * The file descriptor to wait for.
+ *
+ * @param usec_timeout
+ * The maximum number of microseconds to wait for data, or -1 to
+ * potentially wait forever.
+ *
+ * @return
+ * Positive if data is available for reading, zero if the timeout elapsed
+ * and no data is available, negative if an error occurs, in which case
+ * errno will also be set.
+ */
+int guac_wait_for_fd(int fd, int usec_timeout);
+
+#endif