Skip to content

Commit

Permalink
Refactoring with libev
Browse files Browse the repository at this point in the history
Signed-off-by: Jianhui Zhao <jianhuizhao329@gmail.com>
  • Loading branch information
Jianhui Zhao committed Sep 7, 2018
1 parent 9d4c115 commit 59e7f85
Show file tree
Hide file tree
Showing 21 changed files with 2,125 additions and 467 deletions.
62 changes: 62 additions & 0 deletions cmake/Modules/FindCyaSSL.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
if(CYASSL_PREFER_STATIC_LIB)
set(CYASSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
if(WIN32)
set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})
else()
set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
endif()
endif()

if(UNIX)
find_package(PkgConfig QUIET)
pkg_check_modules(_WOLFSSL QUIET wolfssl)
endif()

find_path(WOLFSSL_INCLUDE_DIR NAMES wolfssl/version.h HINTS ${_WOLFSSL_INCLUDEDIR})
find_library(WOLFSSL_LIBRARY NAMES wolfssl HINTS ${_WOLFSSL_LIBDIR})
if(WOLFSSL_INCLUDE_DIR AND WOLFSSL_LIBRARY)
set(CYASSL_INCLUDE_DIR ${WOLFSSL_INCLUDE_DIR})
set(CYASSL_LIBRARY ${WOLFSSL_LIBRARY})
set(CYASSL_VERSION ${_WOLFSSL_VERSION})
set(CYASSL_IS_WOLFSSL ON)
else()
if(UNIX)
pkg_check_modules(_CYASSL QUIET cyassl)
endif()

find_path(CYASSL_INCLUDE_DIR NAMES cyassl/version.h HINTS ${_CYASSL_INCLUDEDIR})
find_library(CYASSL_LIBRARY NAMES cyassl HINTS ${_CYASSL_LIBDIR})
set(CYASSL_VERSION ${_CYASSL_VERSION})
set(CYASSL_IS_WOLFSSL OFF)
endif()

if(NOT CYASSL_VERSION AND CYASSL_INCLUDE_DIR)
if(CYASSL_IS_WOLFSSL)
file(STRINGS "${CYASSL_INCLUDE_DIR}/wolfssl/version.h" CYASSL_VERSION_STR REGEX "^#define[\t ]+LIBWOLFSSL_VERSION_STRING[\t ]+\"[^\"]+\"")
else()
file(STRINGS "${CYASSL_INCLUDE_DIR}/cyassl/version.h" CYASSL_VERSION_STR REGEX "^#define[\t ]+LIBCYASSL_VERSION_STRING[\t ]+\"[^\"]+\"")
endif()
if(CYASSL_VERSION_STR MATCHES "\"([^\"]+)\"")
set(CYASSL_VERSION "${CMAKE_MATCH_1}")
endif()
endif()

set(CYASSL_INCLUDE_DIRS ${CYASSL_INCLUDE_DIR})
set(CYASSL_LIBRARIES ${CYASSL_LIBRARY})

include(FindPackageHandleStandardArgs)

find_package_handle_standard_args(CyaSSL
REQUIRED_VARS
CYASSL_LIBRARY
CYASSL_INCLUDE_DIR
VERSION_VAR
CYASSL_VERSION
)

mark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY CYASSL_INCLUDE_DIR CYASSL_LIBRARY)

if(CYASSL_PREFER_STATIC_LIB)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CYASSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
unset(CYASSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
endif()
29 changes: 29 additions & 0 deletions cmake/Modules/FindLibev.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# - Try to find libev
# Once done this will define
# LIBEV_FOUND - System has libev
# LIBEV_INCLUDE_DIR - The libev include directories
# LIBEV_LIBRARY - The libraries needed to use libev

find_path(LIBEV_INCLUDE_DIR ev.h)
find_library(LIBEV_LIBRARY ev PATH_SUFFIXES lib64)

if(LIBEV_INCLUDE_DIR)
file(STRINGS "${LIBEV_INCLUDE_DIR}/ev.h"
LIBEV_VERSION_MAJOR REGEX "^#define[ \t]+EV_VERSION_MAJOR[ \t]+[0-9]+")
file(STRINGS "${LIBEV_INCLUDE_DIR}/ev.h"
LIBEV_VERSION_MINOR REGEX "^#define[ \t]+EV_VERSION_MINOR[ \t]+[0-9]+")
string(REGEX REPLACE "[^0-9]+" "" LIBEV_VERSION_MAJOR "${LIBEV_VERSION_MAJOR}")
string(REGEX REPLACE "[^0-9]+" "" LIBEV_VERSION_MINOR "${LIBEV_VERSION_MINOR}")
set(LIBEV_VERSION "${LIBEV_VERSION_MAJOR}.${LIBEV_VERSION_MINOR}")
unset(LIBEV_VERSION_MINOR)
unset(LIBEV_VERSION_MAJOR)
endif()

include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LIBEV_FOUND to TRUE
# if all listed variables are TRUE and the requested version matches.
find_package_handle_standard_args(Libev REQUIRED_VARS
LIBEV_LIBRARY LIBEV_INCLUDE_DIR
VERSION_VAR LIBEV_VERSION)

mark_as_advanced(LIBEV_INCLUDE_DIR LIBEV_LIBRARY)
17 changes: 0 additions & 17 deletions cmake/Modules/FindLibubox.cmake

This file was deleted.

37 changes: 37 additions & 0 deletions cmake/Modules/FindMbedTLS.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
find_path(MBEDTLS_INCLUDE_DIR mbedtls/ssl.h)

find_library(MBEDTLS_LIBRARY mbedtls)
find_library(MBEDX509_LIBRARY mbedx509)
find_library(MBEDCRYPTO_LIBRARY mbedcrypto)

if(MBEDTLS_INCLUDE_DIR)
file(STRINGS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h"
MBEDTLS_VERSION_MAJOR REGEX "^#define[ \t]+MBEDTLS_VERSION_MAJOR[ \t]+[0-9]+")
file(STRINGS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h"
MBEDTLS_VERSION_MINOR REGEX "^#define[ \t]+MBEDTLS_VERSION_MINOR[ \t]+[0-9]+")
file(STRINGS "${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h"
MBEDTLS_VERSION_PATCH REGEX "^#define[ \t]+MBEDTLS_VERSION_PATCH[ \t]+[0-9]+")
string(REGEX REPLACE "[^0-9]+" "" MBEDTLS_VERSION_MAJOR "${MBEDTLS_VERSION_MAJOR}")
string(REGEX REPLACE "[^0-9]+" "" MBEDTLS_VERSION_MINOR "${MBEDTLS_VERSION_MINOR}")
string(REGEX REPLACE "[^0-9]+" "" MBEDTLS_VERSION_PATCH "${MBEDTLS_VERSION_PATCH}")
set(MBEDTLS_VERSION "${MBEDTLS_VERSION_MAJOR}.${MBEDTLS_VERSION_MINOR}.${MBEDTLS_VERSION_PATCH}")
unset(MBEDTLS_VERSION_MINOR)
unset(MBEDTLS_VERSION_MAJOR)
unset(MBEDTLS_VERSION_PATCH)
endif()

set(MBEDTLS_LIBRARIES "${MBEDTLS_LIBRARY}" "${MBEDX509_LIBRARY}" "${MBEDCRYPTO_LIBRARY}")

include(FindPackageHandleStandardArgs)

find_package_handle_standard_args(MbedTLS
REQUIRED_VARS
MBEDTLS_LIBRARY
MBEDX509_LIBRARY
MBEDCRYPTO_LIBRARY
MBEDTLS_INCLUDE_DIR
VERSION_VAR
MBEDTLS_VERSION
)

mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)
86 changes: 49 additions & 37 deletions example/helloworld.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,67 +17,80 @@
* USA
*/

#include <uwsc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

struct uwsc_client *gcl;
struct uloop_fd fd;
#include "uwsc.h"

void fd_handler(struct uloop_fd *u, unsigned int events)
static void stdin_read_cb(struct ev_loop *loop, struct ev_io *w, int revents)
{
struct uwsc_client *cl = w->data;
char buf[128] = "";
int n;

n = read(u->fd, buf, sizeof(buf));
n = read(w->fd, buf, sizeof(buf));
if (n > 1) {
buf[n - 1] = 0;
printf("You input:[%s]\n", buf);

/* Note: the buf to be sent will be modified by the send function */
gcl->send(gcl, buf, strlen(buf) + 1, WEBSOCKET_OP_TEXT);
cl->send(cl, buf, strlen(buf) + 1, UWSC_OP_TEXT);
}
}

static void uwsc_onopen(struct uwsc_client *cl)
{
static struct ev_io stdin_watcher;

uwsc_log_info("onopen\n");

fd.fd = STDIN_FILENO;
fd.cb = fd_handler;
uloop_fd_add(&fd, ULOOP_READ);
stdin_watcher.data = cl;

ev_io_init(&stdin_watcher, stdin_read_cb, STDIN_FILENO, EV_READ);
ev_io_start(cl->loop, &stdin_watcher);

/* Send Ping per 10s */
cl->set_ping_interval(cl, 10);
}

static void uwsc_onmessage(struct uwsc_client *cl, void *data, uint64_t len, enum websocket_op op)
static void uwsc_onmessage(struct uwsc_client *cl, void *data, size_t len, bool binary)
{
if (op == WEBSOCKET_OP_BINARY) {
uint64_t i;
printf("Recv:");

if (binary) {
size_t i;
uint8_t *p = data;

for (i = 0; i < len; i++) {
printf("%02hhX ", p[i]);
if (i % 16 == 0 && i > 0)
puts("");
}
puts("");
} else if (op == WEBSOCKET_OP_TEXT) {
printf("recv:[%s]\n", (char *)data);
} else {
printf("[%.*s]\n", (int)len, (char *)data);
}
}

static void uwsc_onerror(struct uwsc_client *cl)
static void uwsc_onerror(struct uwsc_client *cl, int err, const char *msg)
{
uwsc_log_info("onerror:%d: %s\n", err, msg);
ev_break(cl->loop, EVBREAK_ALL);
}

static void uwsc_onclose(struct uwsc_client *cl, int code, const char *reason)
{
uwsc_log_info("onerror:%d\n", cl->error);
uwsc_log_info("onclose:%d: %s\n", code, reason);
ev_break(cl->loop, EVBREAK_ALL);
}

static void uwsc_onclose(struct uwsc_client *cl)
static void signal_cb(struct ev_loop *loop, ev_signal *w, int revents)
{
uwsc_log_info("onclose\n");
uloop_end();
if (w->signum == SIGINT) {
ev_break(loop, EVBREAK_ALL);
uwsc_log_info("Normal quit\n");
}
}

static void usage(const char *prog)
Expand All @@ -94,14 +107,16 @@ static void usage(const char *prog)
int main(int argc, char **argv)
{
int opt;
struct uwsc_client *cl;
struct ev_loop *loop = EV_DEFAULT;
const char *url = "ws://localhost:8080/ws";
const char *crt_file = NULL;
bool verify = true;
bool verbose = false;
struct ev_signal signal_watcher;

while ((opt = getopt(argc, argv, "u:nc:v")) != -1) {
switch (opt)
{
switch (opt) {
case 'u':
url = optarg;
break;
Expand All @@ -122,25 +137,22 @@ int main(int argc, char **argv)
if (!verbose)
uwsc_log_threshold(LOG_ERR);

uloop_init();

gcl = uwsc_new_ssl(url, crt_file, verify);
if (!gcl) {
uloop_done();
cl = uwsc_new_ssl_v2(url, crt_file, verify, loop);
if (!cl)
return -1;
}

gcl->onopen = uwsc_onopen;
gcl->onmessage = uwsc_onmessage;
gcl->onerror = uwsc_onerror;
gcl->onclose = uwsc_onclose;

uloop_run();
cl->onopen = uwsc_onopen;
cl->onmessage = uwsc_onmessage;
cl->onerror = uwsc_onerror;
cl->onclose = uwsc_onclose;

ev_signal_init(&signal_watcher, signal_cb, SIGINT);
ev_signal_start(loop, &signal_watcher);

gcl->send(gcl, NULL, 0, WEBSOCKET_OP_CLOSE);
gcl->free(gcl);
ev_run(loop, 0);

uloop_done();
cl->send(cl, NULL, 0, UWSC_OP_CLOSE);
free(cl);

return 0;
}
48 changes: 41 additions & 7 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,52 @@ set(UWSC_VERSION_MINOR 0)
set(UWSC_VERSION_PATCH 5)

# Check the third party Libraries
find_package(Libubox REQUIRED)
find_package(Libev REQUIRED)

include_directories(${CMAKE_CURRENT_BINARY_DIR} ${LIBUBOX_INCLUDE_DIR})
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${LIBEV_INCLUDE_DIR})

set(EXTRA_LIBS ${LIBUBOX_LIBRARY} dl)
set(SOURCE_FILES uwsc.c log.c utils.c)
set(EXTRA_LIBS ${LIBEV_LIBRARY} dl)
set(SOURCE_FILES uwsc.c log.c utils.c buffer.c sha1.c base64.c ssl.c)

set(UWSC_SSL_SUPPORT_CONFIG 1)
option(UWSC_SSL_SUPPORT "SSL support" ON)

set(UWSC_SSL_NAME OFF)
set(UWSC_HAVE_OPENSSL_CONFIG 0)
set(UWSC_HAVE_CYASSL_CONFIG 0)
set(UWSC_HAVE_MBEDTLS_CONFIG 0)

if(NOT UWSC_SSL_SUPPORT)
set(UWSC_SSL_SUPPORT_CONFIG 0)
else()
find_package(OpenSSL)
find_package(CyaSSL)
find_package(MbedTLS)

if(OPENSSL_FOUND)
set(UWSC_HAVE_OPENSSL_CONFIG 1)
include_directories(${OPENSSL_INCLUDE_DIR})
list(APPEND EXTRA_LIBS ${OPENSSL_LIBRARIES})
set(UWSC_SSL_NAME "OpenSSL")
elseif(CYASSL_FOUND)
set(UWSC_HAVE_CYASSL_CONFIG 1)
include_directories(${CYASSL_INCLUDE_DIR})
list(APPEND EXTRA_LIBS ${CYASSL_LIBRARIES})
set(UWSC_SSL_NAME "WolfSSL(CyaSSL)")
elseif(MBEDTLS_FOUND)
set(UWSC_HAVE_MBEDTLS_CONFIG 1)
include_directories(${MBEDTLS_INCLUDE_DIR})
list(APPEND EXTRA_LIBS ${MBEDTLS_LIBRARIES})
set(UWSC_SSL_NAME "MbedTLS(PolarSSL)")
else()
set(UWSC_SSL_SUPPORT OFF)
set(UWSC_SSL_SUPPORT_CONFIG 0)
message(WARNING "No available SSL libraries found")
endif()

if(UWSC_SSL_NAME)
message(STATUS "Select ${UWSC_SSL_NAME} as the SSL backend")
endif()
endif()

add_library(uwsc SHARED ${SOURCE_FILES})
Expand All @@ -33,6 +67,8 @@ install(
${CMAKE_CURRENT_BINARY_DIR}/config.h
${CMAKE_CURRENT_SOURCE_DIR}/log.h
${CMAKE_CURRENT_SOURCE_DIR}/uwsc.h
${CMAKE_CURRENT_SOURCE_DIR}/buffer.h
${CMAKE_CURRENT_SOURCE_DIR}/ssl.h
DESTINATION
include/uwsc
)
Expand All @@ -42,7 +78,5 @@ install(
DESTINATION lib
)

message("")
message(STATUS "UWSC_VERSION: ${UWSC_VERSION_MAJOR}.${UWSC_VERSION_MINOR}.${UWSC_VERSION_PATCH}")
message(STATUS "UWSC_SSL_SUPPORT: ${UWSC_SSL_SUPPORT}")
message("")
message(STATUS "UWSC_SSL_SUPPORT: ${UWSC_SSL_NAME}")
Loading

0 comments on commit 59e7f85

Please sign in to comment.