summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/mongoose/examples/websocket_ssl_proxy/ssl_wrapper.c
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2015-01-10 13:30:30 +0100
committer Miodrag Milanovic <mmicko@gmail.com>2015-01-10 13:30:30 +0100
commit8556d0cdf7058be2c519bd4d8e7006ea9e913527 (patch)
tree09594058dc17564b4ff3c106581d0856cf69c2d5 /3rdparty/mongoose/examples/websocket_ssl_proxy/ssl_wrapper.c
parent61f7cd05dfed932dd1be927608a4989c187cc737 (diff)
Added integral source of mongoose (nw)
Diffstat (limited to '3rdparty/mongoose/examples/websocket_ssl_proxy/ssl_wrapper.c')
-rw-r--r--3rdparty/mongoose/examples/websocket_ssl_proxy/ssl_wrapper.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/3rdparty/mongoose/examples/websocket_ssl_proxy/ssl_wrapper.c b/3rdparty/mongoose/examples/websocket_ssl_proxy/ssl_wrapper.c
new file mode 100644
index 00000000000..969aa979345
--- /dev/null
+++ b/3rdparty/mongoose/examples/websocket_ssl_proxy/ssl_wrapper.c
@@ -0,0 +1,123 @@
+// Copyright (c) 2014 Cesanta Software Limited
+// All rights reserved
+//
+// This software is dual-licensed: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation. For the terms of this
+// license, see <http://www.gnu.org/licenses/>.
+//
+// You are free to use this software under the terms of the GNU General
+// Public License, but WITHOUT ANY WARRANTY; without even the implied
+// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+// See the GNU General Public License for more details.
+//
+// Alternatively, you can license this software under a commercial
+// license, as set out in <http://cesanta.com/products.html>.
+//
+// $Date$
+
+#include "net_skeleton.h"
+#include "ssl_wrapper.h"
+
+static void ev_handler(struct ns_connection *nc, int ev, void *p) {
+ const char *target_addr = (const char *) nc->mgr->user_data;
+ struct ns_connection *pc = (struct ns_connection *) nc->user_data;
+ struct iobuf *io = &nc->recv_iobuf;
+
+ (void) p;
+ switch (ev) {
+ case NS_ACCEPT:
+ // Create a connection to the target, and interlink both connections
+ nc->user_data = ns_connect(nc->mgr, target_addr, ev_handler, nc);
+ if (nc->user_data == NULL) {
+ nc->flags |= NSF_CLOSE_IMMEDIATELY;
+ }
+ break;
+
+ case NS_CLOSE:
+ // If either connection closes, unlink them and shedule closing
+ if (pc != NULL) {
+ pc->flags |= NSF_FINISHED_SENDING_DATA;
+ pc->user_data = NULL;
+ }
+ nc->user_data = NULL;
+ break;
+
+ case NS_RECV:
+ // Forward arrived data to the other connection, and discard from buffer
+ if (pc != NULL) {
+ ns_send(pc, io->buf, io->len);
+ iobuf_remove(io, io->len);
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+void *ssl_wrapper_init(const char *local_addr, const char *target_addr,
+ const char **err_msg) {
+ struct ns_mgr *mgr = (struct ns_mgr *) calloc(1, sizeof(mgr[0]));
+ *err_msg = NULL;
+
+ if (mgr == NULL) {
+ *err_msg = "malloc failed";
+ } else {
+ ns_mgr_init(mgr, (void *) target_addr);
+ if (ns_bind(mgr, local_addr, ev_handler, NULL) == NULL) {
+ *err_msg = "ns_bind() failed: bad listening_port";
+ ns_mgr_free(mgr);
+ free(mgr);
+ mgr = NULL;
+ }
+ }
+
+ return mgr;
+}
+
+void ssl_wrapper_serve(void *param, volatile int *quit) {
+ struct ns_mgr *mgr = (struct ns_mgr *) param;
+
+ while (*quit == 0) {
+ ns_mgr_poll(mgr, 1000);
+ }
+ ns_mgr_free(mgr);
+ free(mgr);
+}
+
+#ifndef SSL_WRAPPER_USE_AS_LIBRARY
+static int s_received_signal = 0;
+
+static void signal_handler(int sig_num) {
+ signal(sig_num, signal_handler);
+ s_received_signal = sig_num;
+}
+
+static void show_usage_and_exit(const char *prog) {
+ fprintf(stderr, "Usage: %s <listening_address> <target_address>\n", prog);
+ exit(EXIT_FAILURE);
+}
+
+int main(int argc, char *argv[]) {
+ void *wrapper;
+ const char *err_msg;
+
+ if (argc != 3) {
+ show_usage_and_exit(argv[0]);
+ }
+
+ // Setup signal handlers
+ signal(SIGTERM, signal_handler);
+ signal(SIGINT, signal_handler);
+ signal(SIGPIPE, SIG_IGN);
+
+ if ((wrapper = ssl_wrapper_init(argv[1], argv[2], &err_msg)) == NULL) {
+ fprintf(stderr, "Error: %s\n", err_msg);
+ exit(EXIT_FAILURE);
+ }
+ ssl_wrapper_serve(wrapper, &s_received_signal);
+
+ return EXIT_SUCCESS;
+}
+#endif // SSL_WRAPPER_USE_AS_LIBRARY