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 2018/09/26 12:44:39 UTC

[18/19] guacamole-server git commit: GUACAMOLE-623: Move I/O-related functions into separate files.

GUACAMOLE-623: Move I/O-related functions into separate files.


Project: http://git-wip-us.apache.org/repos/asf/guacamole-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-server/commit/2e505735
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-server/tree/2e505735
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-server/diff/2e505735

Branch: refs/heads/master
Commit: 2e50573531411a49c98dcb44a29fe2ad8a983609
Parents: 5e3aec6
Author: Michael Jumper <mj...@apache.org>
Authored: Mon Sep 10 22:55:02 2018 -0700
Committer: Michael Jumper <mj...@apache.org>
Committed: Tue Sep 25 21:30:52 2018 -0700

----------------------------------------------------------------------
 src/protocols/kubernetes/Makefile.am  |   2 +
 src/protocols/kubernetes/io.c         | 143 +++++++++++++++++++++++++
 src/protocols/kubernetes/io.h         | 144 +++++++++++++++++++++++++
 src/protocols/kubernetes/kubernetes.c | 165 +----------------------------
 src/protocols/kubernetes/kubernetes.h |  59 +----------
 5 files changed, 292 insertions(+), 221 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/2e505735/src/protocols/kubernetes/Makefile.am
----------------------------------------------------------------------
diff --git a/src/protocols/kubernetes/Makefile.am b/src/protocols/kubernetes/Makefile.am
index 9e50feb..e818ff7 100644
--- a/src/protocols/kubernetes/Makefile.am
+++ b/src/protocols/kubernetes/Makefile.am
@@ -26,6 +26,7 @@ libguac_client_kubernetes_la_SOURCES = \
     client.c                           \
     clipboard.c                        \
     input.c                            \
+    io.c                               \
     pipe.c                             \
     settings.c                         \
     kubernetes.c                       \
@@ -36,6 +37,7 @@ noinst_HEADERS = \
     client.h     \
     clipboard.h  \
     input.h      \
+    io.h         \
     pipe.h       \
     settings.h   \
     kubernetes.h \

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/2e505735/src/protocols/kubernetes/io.c
----------------------------------------------------------------------
diff --git a/src/protocols/kubernetes/io.c b/src/protocols/kubernetes/io.c
new file mode 100644
index 0000000..bfa37b1
--- /dev/null
+++ b/src/protocols/kubernetes/io.c
@@ -0,0 +1,143 @@
+/*
+ * 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 "kubernetes.h"
+#include "terminal/terminal.h"
+
+#include <guacamole/client.h>
+#include <libwebsockets.h>
+
+#include <pthread.h>
+#include <stdbool.h>
+#include <string.h>
+
+void guac_kubernetes_receive_data(guac_client* client,
+        const char* buffer, size_t length) {
+
+    guac_kubernetes_client* kubernetes_client =
+        (guac_kubernetes_client*) client->data;
+
+    /* Strip channel index from beginning of buffer */
+    int channel = *(buffer++);
+    length--;
+
+    switch (channel) {
+
+        /* Write STDOUT / STDERR directly to terminal as output */
+        case GUAC_KUBERNETES_CHANNEL_STDOUT:
+        case GUAC_KUBERNETES_CHANNEL_STDERR:
+            guac_terminal_write(kubernetes_client->term, buffer, length);
+            break;
+
+        /* Ignore data on other channels */
+        default:
+            guac_client_log(client, GUAC_LOG_DEBUG, "Received %i bytes along "
+                    "channel %i.", length, channel);
+
+    }
+
+}
+
+void guac_kubernetes_send_message(guac_client* client,
+        int channel, const char* data, int length) {
+
+    guac_kubernetes_client* kubernetes_client =
+        (guac_kubernetes_client*) client->data;
+
+    pthread_mutex_lock(&(kubernetes_client->outbound_message_lock));
+
+    /* Add message to buffer if space is available */
+    if (kubernetes_client->outbound_messages_waiting
+            < GUAC_KUBERNETES_MAX_OUTBOUND_MESSAGES) {
+
+        /* Calculate storage position of next message */
+        int index = (kubernetes_client->outbound_messages_top
+                  + kubernetes_client->outbound_messages_waiting)
+                  % GUAC_KUBERNETES_MAX_OUTBOUND_MESSAGES;
+
+        /* Obtain pointer to message slot at calculated position */
+        guac_kubernetes_message* message =
+            &(kubernetes_client->outbound_messages[index]);
+
+        /* Copy details of message into buffer */
+        message->channel = channel;
+        memcpy(message->data, data, length);
+        message->length = length;
+
+        /* One more message is now waiting */
+        kubernetes_client->outbound_messages_waiting++;
+
+        /* Notify libwebsockets that we need a callback to send pending
+         * messages */
+        lws_callback_on_writable(kubernetes_client->wsi);
+        lws_cancel_service(kubernetes_client->context);
+
+    }
+
+    /* Warn if data has to be dropped */
+    else
+        guac_client_log(client, GUAC_LOG_WARNING, "Send buffer could not be "
+                "flushed in time to handle additional data. Outbound "
+                "message dropped.");
+
+    pthread_mutex_unlock(&(kubernetes_client->outbound_message_lock));
+
+}
+
+bool guac_kubernetes_write_pending_message(guac_client* client) {
+
+    bool messages_remain;
+    guac_kubernetes_client* kubernetes_client =
+        (guac_kubernetes_client*) client->data;
+
+    pthread_mutex_lock(&(kubernetes_client->outbound_message_lock));
+
+    /* Send one message from top of buffer */
+    if (kubernetes_client->outbound_messages_waiting > 0) {
+
+        /* Obtain pointer to message at top */
+        int top = kubernetes_client->outbound_messages_top;
+        guac_kubernetes_message* message =
+            &(kubernetes_client->outbound_messages[top]);
+
+        /* Write message including channel index */
+        lws_write(kubernetes_client->wsi,
+                ((unsigned char*) message) + LWS_PRE,
+                message->length + 1, LWS_WRITE_BINARY);
+
+        /* Advance top to next message */
+        kubernetes_client->outbound_messages_top++;
+        kubernetes_client->outbound_messages_top %=
+            GUAC_KUBERNETES_MAX_OUTBOUND_MESSAGES;
+
+        /* One less message is waiting */
+        kubernetes_client->outbound_messages_waiting--;
+
+    }
+
+    /* Record whether messages remained at time of completion */
+    messages_remain = (kubernetes_client->outbound_messages_waiting > 0);
+
+    pthread_mutex_unlock(&(kubernetes_client->outbound_message_lock));
+
+    return messages_remain;
+
+}
+
+

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/2e505735/src/protocols/kubernetes/io.h
----------------------------------------------------------------------
diff --git a/src/protocols/kubernetes/io.h b/src/protocols/kubernetes/io.h
new file mode 100644
index 0000000..40f2c69
--- /dev/null
+++ b/src/protocols/kubernetes/io.h
@@ -0,0 +1,144 @@
+/*
+ * 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_KUBERNETES_IO_H
+#define GUAC_KUBERNETES_IO_H
+
+#include <guacamole/client.h>
+#include <libwebsockets.h>
+
+#include <stdbool.h>
+#include <stdint.h>
+
+/**
+ * The maximum amount of data to include in any particular WebSocket message
+ * to Kubernetes. This excludes the storage space required for the channel
+ * index.
+ */
+#define GUAC_KUBERNETES_MAX_MESSAGE_SIZE 1024
+
+/**
+ * The index of the Kubernetes channel used for STDIN.
+ */
+#define GUAC_KUBERNETES_CHANNEL_STDIN 0
+
+/**
+ * The index of the Kubernetes channel used for STDOUT.
+ */
+#define GUAC_KUBERNETES_CHANNEL_STDOUT 1
+
+/**
+ * The index of the Kubernetes channel used for STDERR.
+ */
+#define GUAC_KUBERNETES_CHANNEL_STDERR 2
+
+/**
+ * The index of the Kubernetes channel used for terminal resize messages.
+ */
+#define GUAC_KUBERNETES_CHANNEL_RESIZE 4
+
+/**
+ * An outbound message to be received by Kubernetes over WebSocket.
+ */
+typedef struct guac_kubernetes_message {
+
+    /**
+     * lws_write() requires leading padding of LWS_PRE bytes to provide
+     * scratch space for WebSocket framing.
+     */
+    uint8_t _padding[LWS_PRE];
+
+    /**
+     * The index of the channel receiving the data, such as
+     * GUAC_KUBERNETES_CHANNEL_STDIN.
+     */
+    uint8_t channel;
+
+    /**
+     * The data that should be sent to Kubernetes (along with the channel
+     * index).
+     */
+    char data[GUAC_KUBERNETES_MAX_MESSAGE_SIZE];
+
+    /**
+     * The length of the data to be sent, excluding the channel index.
+     */
+    int length;
+
+} guac_kubernetes_message;
+
+
+/**
+ * Handles data received from Kubernetes over WebSocket, decoding the channel
+ * index of the received data and forwarding that data accordingly.
+ *
+ * @param client
+ *     The guac_client associated with the connection to Kubernetes.
+ *
+ * @param buffer
+ *     The data received from Kubernetes.
+ *
+ * @param length
+ *     The size of the data received from Kubernetes, in bytes.
+ */
+void guac_kubernetes_receive_data(guac_client* client,
+        const char* buffer, size_t length);
+
+/**
+ * Requests that the given data be sent along the given channel to the
+ * Kubernetes server when the WebSocket connection is next available for
+ * writing. If the WebSocket connection has not been available for writing for
+ * long enough that the outbound message buffer is full, the request to send
+ * this particular message will be dropped.
+ *
+ * @param client
+ *     The guac_client associated with the Kubernetes connection.
+ *
+ * @param channel
+ *     The Kubernetes channel on which to send the message,
+ *     such as GUAC_KUBERNETES_CHANNEL_STDIN.
+ *
+ * @param data
+ *     A buffer containing the data to send.
+ *
+ * @param length
+ *     The number of bytes to send.
+ */
+void guac_kubernetes_send_message(guac_client* client,
+        int channel, const char* data, int length);
+
+/**
+ * Writes the oldest pending message within the outbound message queue,
+ * as scheduled with guac_kubernetes_send_message(), removing that message
+ * from the queue. This function MAY NOT be invoked outside the libwebsockets
+ * event callback and MUST only be invoked in the context of a
+ * LWS_CALLBACK_CLIENT_WRITEABLE event. If no messages are pending, this
+ * function has no effect.
+ *
+ * @param client
+ *     The guac_client associated with the Kubernetes connection.
+ *
+ * @return
+ *     true if messages still remain to be written within the outbound message
+ *     queue, false otherwise.
+ */
+bool guac_kubernetes_write_pending_message(guac_client* client);
+
+#endif
+

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/2e505735/src/protocols/kubernetes/kubernetes.c
----------------------------------------------------------------------
diff --git a/src/protocols/kubernetes/kubernetes.c b/src/protocols/kubernetes/kubernetes.c
index 3644d6e..4e7928e 100644
--- a/src/protocols/kubernetes/kubernetes.c
+++ b/src/protocols/kubernetes/kubernetes.c
@@ -18,8 +18,9 @@
  */
 
 #include "config.h"
-#include "kubernetes.h"
 #include "common/recording.h"
+#include "io.h"
+#include "kubernetes.h"
 #include "terminal/terminal.h"
 #include "url.h"
 
@@ -30,168 +31,6 @@
 #include <pthread.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-
-/**
- * Handles data received from Kubernetes over WebSocket, decoding the channel
- * index of the received data and forwarding that data accordingly.
- *
- * @param client
- *     The guac_client associated with the connection to Kubernetes.
- *
- * @param buffer
- *     The data received from Kubernetes.
- *
- * @param length
- *     The size of the data received from Kubernetes, in bytes.
- */
-static void guac_kubernetes_receive_data(guac_client* client,
-        const char* buffer, size_t length) {
-
-    guac_kubernetes_client* kubernetes_client =
-        (guac_kubernetes_client*) client->data;
-
-    /* Strip channel index from beginning of buffer */
-    int channel = *(buffer++);
-    length--;
-
-    switch (channel) {
-
-        /* Write STDOUT / STDERR directly to terminal as output */
-        case GUAC_KUBERNETES_CHANNEL_STDOUT:
-        case GUAC_KUBERNETES_CHANNEL_STDERR:
-            guac_terminal_write(kubernetes_client->term, buffer, length);
-            break;
-
-        /* Ignore data on other channels */
-        default:
-            guac_client_log(client, GUAC_LOG_DEBUG, "Received %i bytes along "
-                    "channel %i.", length, channel);
-
-    }
-
-}
-
-/**
- * Requests that the given data be sent along the given channel to the
- * Kubernetes server when the WebSocket connection is next available for
- * writing. If the WebSocket connection has not been available for writing for
- * long enough that the outbound message buffer is full, the request to send
- * this particular message will be dropped.
- *
- * @param client
- *     The guac_client associated with the Kubernetes connection.
- *
- * @param channel
- *     The Kubernetes channel on which to send the message,
- *     such as GUAC_KUBERNETES_CHANNEL_STDIN.
- *
- * @param data
- *     A buffer containing the data to send.
- *
- * @param length
- *     The number of bytes to send.
- */
-static void guac_kubernetes_send_message(guac_client* client,
-        int channel, const char* data, int length) {
-
-    guac_kubernetes_client* kubernetes_client =
-        (guac_kubernetes_client*) client->data;
-
-    pthread_mutex_lock(&(kubernetes_client->outbound_message_lock));
-
-    /* Add message to buffer if space is available */
-    if (kubernetes_client->outbound_messages_waiting
-            < GUAC_KUBERNETES_MAX_OUTBOUND_MESSAGES) {
-
-        /* Calculate storage position of next message */
-        int index = (kubernetes_client->outbound_messages_top
-                  + kubernetes_client->outbound_messages_waiting)
-                  % GUAC_KUBERNETES_MAX_OUTBOUND_MESSAGES;
-
-        /* Obtain pointer to message slot at calculated position */
-        guac_kubernetes_message* message =
-            &(kubernetes_client->outbound_messages[index]);
-
-        /* Copy details of message into buffer */
-        message->channel = channel;
-        memcpy(message->data, data, length);
-        message->length = length;
-
-        /* One more message is now waiting */
-        kubernetes_client->outbound_messages_waiting++;
-
-        /* Notify libwebsockets that we need a callback to send pending
-         * messages */
-        lws_callback_on_writable(kubernetes_client->wsi);
-        lws_cancel_service(kubernetes_client->context);
-
-    }
-
-    /* Warn if data has to be dropped */
-    else
-        guac_client_log(client, GUAC_LOG_WARNING, "Send buffer could not be "
-                "flushed in time to handle additional data. Outbound "
-                "message dropped.");
-
-    pthread_mutex_unlock(&(kubernetes_client->outbound_message_lock));
-
-}
-
-/**
- * Writes the oldest pending message within the outbound message queue,
- * as scheduled with guac_kubernetes_send_message(), removing that message
- * from the queue. This function MAY NOT be invoked outside the libwebsockets
- * event callback and MUST only be invoked in the context of a
- * LWS_CALLBACK_CLIENT_WRITEABLE event. If no messages are pending, this
- * function has no effect.
- *
- * @param client
- *     The guac_client associated with the Kubernetes connection.
- *
- * @return
- *     true if messages still remain to be written within the outbound message
- *     queue, false otherwise.
- */
-static bool guac_kubernetes_write_pending_message(guac_client* client) {
-
-    bool messages_remain;
-    guac_kubernetes_client* kubernetes_client =
-        (guac_kubernetes_client*) client->data;
-
-    pthread_mutex_lock(&(kubernetes_client->outbound_message_lock));
-
-    /* Send one message from top of buffer */
-    if (kubernetes_client->outbound_messages_waiting > 0) {
-
-        /* Obtain pointer to message at top */
-        int top = kubernetes_client->outbound_messages_top;
-        guac_kubernetes_message* message =
-            &(kubernetes_client->outbound_messages[top]);
-
-        /* Write message including channel index */
-        lws_write(kubernetes_client->wsi,
-                ((unsigned char*) message) + LWS_PRE,
-                message->length + 1, LWS_WRITE_BINARY);
-
-        /* Advance top to next message */
-        kubernetes_client->outbound_messages_top++;
-        kubernetes_client->outbound_messages_top %=
-            GUAC_KUBERNETES_MAX_OUTBOUND_MESSAGES;
-
-        /* One less message is waiting */
-        kubernetes_client->outbound_messages_waiting--;
-
-    }
-
-    /* Record whether messages remained at time of completion */
-    messages_remain = (kubernetes_client->outbound_messages_waiting > 0);
-
-    pthread_mutex_unlock(&(kubernetes_client->outbound_message_lock));
-
-    return messages_remain;
-
-}
 
 /**
  * Callback invoked by libwebsockets for events related to a WebSocket being

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/2e505735/src/protocols/kubernetes/kubernetes.h
----------------------------------------------------------------------
diff --git a/src/protocols/kubernetes/kubernetes.h b/src/protocols/kubernetes/kubernetes.h
index 8c9a25e..c37ca4c 100644
--- a/src/protocols/kubernetes/kubernetes.h
+++ b/src/protocols/kubernetes/kubernetes.h
@@ -22,6 +22,7 @@
 
 #include "common/clipboard.h"
 #include "common/recording.h"
+#include "io.h"
 #include "settings.h"
 #include "terminal/terminal.h"
 
@@ -29,7 +30,6 @@
 #include <libwebsockets.h>
 
 #include <pthread.h>
-#include <stdint.h>
 
 /**
  * The name of the WebSocket protocol specific to Kubernetes which should be
@@ -38,33 +38,6 @@
 #define GUAC_KUBERNETES_LWS_PROTOCOL "v4.channel.k8s.io"
 
 /**
- * The index of the Kubernetes channel used for STDIN.
- */
-#define GUAC_KUBERNETES_CHANNEL_STDIN 0
-
-/**
- * The index of the Kubernetes channel used for STDOUT.
- */
-#define GUAC_KUBERNETES_CHANNEL_STDOUT 1
-
-/**
- * The index of the Kubernetes channel used for STDERR.
- */
-#define GUAC_KUBERNETES_CHANNEL_STDERR 2
-
-/**
- * The index of the Kubernetes channel used for terminal resize messages.
- */
-#define GUAC_KUBERNETES_CHANNEL_RESIZE 4
-
-/**
- * The maximum amount of data to include in any particular WebSocket message
- * to Kubernetes. This excludes the storage space required for the channel
- * index.
- */
-#define GUAC_KUBERNETES_MAX_MESSAGE_SIZE 1024
-
-/**
  * The maximum number of messages to allow within the outbound message buffer.
  * If messages are sent despite the buffer being full, those messages will be
  * dropped.
@@ -78,36 +51,6 @@
 #define GUAC_KUBERNETES_SERVICE_INTERVAL 1000
 
 /**
- * An outbound message to be received by Kubernetes over WebSocket.
- */
-typedef struct guac_kubernetes_message {
-
-    /**
-     * lws_write() requires leading padding of LWS_PRE bytes to provide
-     * scratch space for WebSocket framing.
-     */
-    uint8_t _padding[LWS_PRE];
-
-    /**
-     * The index of the channel receiving the data, such as
-     * GUAC_KUBERNETES_CHANNEL_STDIN.
-     */
-    uint8_t channel;
-
-    /**
-     * The data that should be sent to Kubernetes (along with the channel
-     * index).
-     */
-    char data[GUAC_KUBERNETES_MAX_MESSAGE_SIZE];
-
-    /**
-     * The length of the data to be sent, excluding the channel index.
-     */
-    int length;
-
-} guac_kubernetes_message;
-
-/**
  * Kubernetes-specific client data.
  */
 typedef struct guac_kubernetes_client {