Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
mongoose
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
esp
mongoose
Commits
83237a02
Commit
83237a02
authored
Sep 09, 2014
by
Sergey Lyubka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Made local copies of dependencies
parent
965188ba
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1330 additions
and
0 deletions
+1330
-0
net_skeleton.c
examples/ws_ssl/net_skeleton.c
+934
-0
net_skeleton.h
examples/ws_ssl/net_skeleton.h
+239
-0
ssl_wrapper.c
examples/ws_ssl/ssl_wrapper.c
+123
-0
ssl_wrapper.h
examples/ws_ssl/ssl_wrapper.h
+34
-0
No files found.
examples/ws_ssl/net_skeleton.c
0 → 100644
View file @
83237a02
This diff is collapsed.
Click to expand it.
examples/ws_ssl/net_skeleton.h
0 → 100644
View file @
83237a02
// 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/>.
//
// $Date: 2014-09-09 16:03:50 UTC $
#ifndef NS_SKELETON_HEADER_INCLUDED
#define NS_SKELETON_HEADER_INCLUDED
#define NS_SKELETON_VERSION "2.0.0"
#undef UNICODE // Use ANSI WinAPI functions
#undef _UNICODE // Use multibyte encoding on Windows
#define _MBCS // Use multibyte encoding on Windows
#define _INTEGRAL_MAX_BITS 64 // Enable _stati64() on Windows
#define _CRT_SECURE_NO_WARNINGS // Disable deprecation warning in VS2005+
#undef WIN32_LEAN_AND_MEAN // Let windows.h always include winsock2.h
#define _XOPEN_SOURCE 600 // For flockfile() on Linux
#define __STDC_FORMAT_MACROS // <inttypes.h> wants this for C++
#define __STDC_LIMIT_MACROS // C++ wants that for INT64_MAX
#ifndef _LARGEFILE_SOURCE
#define _LARGEFILE_SOURCE // Enable fseeko() and ftello() functions
#endif
#define _FILE_OFFSET_BITS 64 // Enable 64-bit file offsets
#ifdef _MSC_VER
#pragma warning (disable : 4127) // FD_SET() emits warning, disable it
#pragma warning (disable : 4204) // missing c99 support
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#ifdef _WIN32
#ifdef _MSC_VER
#pragma comment(lib, "ws2_32.lib") // Linking with winsock library
#endif
#include <windows.h>
#include <process.h>
#ifndef EINPROGRESS
#define EINPROGRESS WSAEINPROGRESS
#endif
#ifndef EWOULDBLOCK
#define EWOULDBLOCK WSAEWOULDBLOCK
#endif
#ifndef __func__
#define STRX(x) #x
#define STR(x) STRX(x)
#define __func__ __FILE__ ":" STR(__LINE__)
#endif
#ifndef va_copy
#define va_copy(x,y) x = y
#endif // MINGW #defines va_copy
#define snprintf _snprintf
#define vsnprintf _vsnprintf
#define sleep(x) Sleep((x) * 1000)
#define to64(x) _atoi64(x)
typedef
int
socklen_t
;
typedef
unsigned
char
uint8_t
;
typedef
unsigned
int
uint32_t
;
typedef
unsigned
short
uint16_t
;
typedef
unsigned
__int64
uint64_t
;
typedef
__int64
int64_t
;
typedef
SOCKET
sock_t
;
#ifndef S_ISDIR
#define S_ISDIR(x) ((x) & _S_IFDIR)
#endif
#else
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <pthread.h>
#include <stdarg.h>
#include <unistd.h>
#include <arpa/inet.h> // For inet_pton() when NS_ENABLE_IPV6 is defined
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/select.h>
#define closesocket(x) close(x)
#define __cdecl
#define INVALID_SOCKET (-1)
#define to64(x) strtoll(x, NULL, 10)
typedef
int
sock_t
;
#endif
#ifdef NS_ENABLE_DEBUG
#define DBG(x) do { printf("%-20s ", __func__); printf x; putchar('\n'); \
fflush(stdout); } while(0)
#else
#define DBG(x)
#endif
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
#endif
#ifdef NS_ENABLE_SSL
#ifdef __APPLE__
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
#include <openssl/ssl.h>
#else
typedef
void
*
SSL
;
typedef
void
*
SSL_CTX
;
#endif
#ifdef __cplusplus
extern
"C"
{
#endif // __cplusplus
union
socket_address
{
struct
sockaddr
sa
;
struct
sockaddr_in
sin
;
#ifdef NS_ENABLE_IPV6
struct
sockaddr_in6
sin6
;
#else
struct
sockaddr
sin6
;
#endif
};
// IO buffers interface
struct
iobuf
{
char
*
buf
;
size_t
len
;
size_t
size
;
};
void
iobuf_init
(
struct
iobuf
*
,
size_t
initial_size
);
void
iobuf_free
(
struct
iobuf
*
);
size_t
iobuf_append
(
struct
iobuf
*
,
const
void
*
data
,
size_t
data_size
);
void
iobuf_remove
(
struct
iobuf
*
,
size_t
data_size
);
// Net skeleton interface
// Events. Meaning of event parameter (evp) is given in the comment.
enum
ns_event
{
NS_POLL
,
// Sent to each connection on each call to ns_mgr_poll()
NS_ACCEPT
,
// New connection accept()-ed. union socket_address *remote_addr
NS_CONNECT
,
// connect() succeeded or failed. int *success_status
NS_RECV
,
// Data has benn received. int *num_bytes
NS_SEND
,
// Data has been written to a socket. int *num_bytes
NS_CLOSE
// Connection is closed. NULL
};
// Callback function (event handler) prototype, must be defined by user.
// Net skeleton will call event handler, passing events defined above.
struct
ns_connection
;
typedef
void
(
*
ns_callback_t
)(
struct
ns_connection
*
,
enum
ns_event
,
void
*
evp
);
struct
ns_mgr
{
struct
ns_connection
*
active_connections
;
ns_callback_t
callback
;
// Event handler function
const
char
*
hexdump_file
;
// Debug hexdump file path
sock_t
ctl
[
2
];
// Socketpair for mg_wakeup()
void
*
user_data
;
// User data
};
struct
ns_connection
{
struct
ns_connection
*
next
,
*
prev
;
// ns_mgr::active_connections linkage
struct
ns_connection
*
listener
;
// Set only for accept()-ed connections
struct
ns_mgr
*
mgr
;
sock_t
sock
;
union
socket_address
sa
;
struct
iobuf
recv_iobuf
;
struct
iobuf
send_iobuf
;
SSL
*
ssl
;
SSL_CTX
*
ssl_ctx
;
void
*
connection_data
;
time_t
last_io_time
;
unsigned
int
flags
;
#define NSF_FINISHED_SENDING_DATA (1 << 0)
#define NSF_BUFFER_BUT_DONT_SEND (1 << 1)
#define NSF_SSL_HANDSHAKE_DONE (1 << 2)
#define NSF_CONNECTING (1 << 3)
#define NSF_CLOSE_IMMEDIATELY (1 << 4)
#define NSF_WANT_READ (1 << 5)
#define NSF_WANT_WRITE (1 << 6)
#define NSF_LISTENING (1 << 7)
#define NSF_UDP (1 << 8)
#define NSF_USER_1 (1 << 20)
#define NSF_USER_2 (1 << 21)
#define NSF_USER_3 (1 << 22)
#define NSF_USER_4 (1 << 23)
#define NSF_USER_5 (1 << 24)
#define NSF_USER_6 (1 << 25)
};
void
ns_mgr_init
(
struct
ns_mgr
*
,
void
*
data
,
ns_callback_t
);
void
ns_mgr_free
(
struct
ns_mgr
*
);
int
ns_mgr_poll
(
struct
ns_mgr
*
,
int
milli
);
void
ns_broadcast
(
struct
ns_mgr
*
,
ns_callback_t
,
void
*
,
size_t
);
struct
ns_connection
*
ns_next
(
struct
ns_mgr
*
,
struct
ns_connection
*
);
struct
ns_connection
*
ns_add_sock
(
struct
ns_mgr
*
,
sock_t
sock
,
void
*
p
);
struct
ns_connection
*
ns_bind
(
struct
ns_mgr
*
,
const
char
*
addr
,
void
*
p
);
struct
ns_connection
*
ns_connect
(
struct
ns_mgr
*
,
const
char
*
addr
,
void
*
p
);
int
ns_send
(
struct
ns_connection
*
,
const
void
*
buf
,
int
len
);
int
ns_printf
(
struct
ns_connection
*
,
const
char
*
fmt
,
...);
int
ns_vprintf
(
struct
ns_connection
*
,
const
char
*
fmt
,
va_list
ap
);
// Utility functions
void
*
ns_start_thread
(
void
*
(
*
f
)(
void
*
),
void
*
p
);
int
ns_socketpair
(
sock_t
[
2
]);
int
ns_socketpair2
(
sock_t
[
2
],
int
sock_type
);
// SOCK_STREAM or SOCK_DGRAM
void
ns_set_close_on_exec
(
sock_t
);
void
ns_sock_to_str
(
sock_t
sock
,
char
*
buf
,
size_t
len
,
int
flags
);
int
ns_hexdump
(
const
void
*
buf
,
int
len
,
char
*
dst
,
int
dst_len
);
int
ns_avprintf
(
char
**
buf
,
size_t
size
,
const
char
*
fmt
,
va_list
ap
);
int
ns_resolve
(
const
char
*
domain_name
,
char
*
ip_addr_buf
,
size_t
buf_len
);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // NS_SKELETON_HEADER_INCLUDED
examples/ws_ssl/ssl_wrapper.c
0 → 100644
View file @
83237a02
// 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: 2014-09-09 16:03:50 UTC $
#include "net_skeleton.h"
#include "ssl_wrapper.h"
static
void
ev_handler
(
struct
ns_connection
*
nc
,
enum
ns_event
ev
,
void
*
p
)
{
const
char
*
target_addr
=
(
const
char
*
)
nc
->
mgr
->
user_data
;
struct
ns_connection
*
pc
=
(
struct
ns_connection
*
)
nc
->
connection_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
->
connection_data
=
ns_connect
(
nc
->
mgr
,
target_addr
,
nc
);
if
(
nc
->
connection_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
->
connection_data
=
NULL
;
}
nc
->
connection_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
,
ev_handler
);
if
(
ns_bind
(
mgr
,
local_addr
,
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
examples/ws_ssl/ssl_wrapper.h
0 → 100644
View file @
83237a02
// 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: 2014-09-09 16:03:50 UTC $
#ifndef SSL_WRAPPER_HEADER_INCLUDED
#define SSL_WRAPPER_HEADER_INCLUDED
#ifdef __cplusplus
extern
"C"
{
#endif // __cplusplus
void
*
ssl_wrapper_init
(
const
char
*
listen_addr
,
const
char
*
target_addr
,
const
char
**
err_msg
);
void
ssl_wrapper_serve
(
void
*
,
volatile
int
*
stop_marker
);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // SSL_WRAPPER_HEADER_INCLUDED
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment