From d86641ed3ad5344d03e8aa307e555b25a6c0b544 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Thu, 27 Jul 2017 07:57:59 +0800 Subject: [PATCH] libevent: update to use static plugins and work with new libevent2 Plus fix broken indent style --- lib/libevent.c | 3 + test-server/test-server-libevent.c | 451 ++++++++++++++++++------------------- 2 files changed, 228 insertions(+), 226 deletions(-) diff --git a/lib/libevent.c b/lib/libevent.c index 98c62d6..bae04b4 100644 --- a/lib/libevent.c +++ b/lib/libevent.c @@ -39,12 +39,15 @@ lws_event_cb(evutil_socket_t sock_fd, short revents, void *ctx) if (revents & EV_TIMEOUT) return; + /* !!! EV_CLOSED doesn't exist in libevent2 */ +#if LIBEVENT_VERSION_NUMBER < 0x02000000 if (revents & EV_CLOSED) { event_del(lws_io->event_watcher); event_free(lws_io->event_watcher); return; } +#endif eventfd.fd = sock_fd; eventfd.events = 0; diff --git a/test-server/test-server-libevent.c b/test-server/test-server-libevent.c index 1d7aa3f..a18576b 100644 --- a/test-server/test-server-libevent.c +++ b/test-server/test-server-libevent.c @@ -1,7 +1,7 @@ /* * libwebsockets-test-server - libwebsockets test implementation * - * Copyright (C) 2011-2016 Andy Green + * Copyright (C) 2011-2017 Andy Green * * This file is made available under the Creative Commons CC0 1.0 * Universal Public Domain Dedication. @@ -34,6 +34,11 @@ char *resource_path = LOCAL_RESOURCE_PATH; char crl_path[1024] = ""; #endif +#define LWS_PLUGIN_STATIC +#include "../plugins/protocol_lws_mirror.c" +#include "../plugins/protocol_lws_status.c" +#include "../plugins/protocol_lws_meta.c" + /* singlethreaded version --> no locks */ void test_server_lock(int care) @@ -59,60 +64,53 @@ void test_server_unlock(int care) */ enum demo_protocols { - /* always first */ - PROTOCOL_HTTP = 0, + /* always first */ + PROTOCOL_HTTP = 0, - PROTOCOL_DUMB_INCREMENT, - PROTOCOL_LWS_MIRROR, + PROTOCOL_DUMB_INCREMENT, + PROTOCOL_LWS_MIRROR, + PROTOCOL_LWS_META, - /* always last */ - DEMO_PROTOCOL_COUNT + /* always last */ + DEMO_PROTOCOL_COUNT }; /* list of supported protocols and callbacks */ static struct lws_protocols protocols[] = { - /* first protocol must always be HTTP handler */ - - { - "http-only", /* name */ - callback_http, /* callback */ - sizeof (struct per_session_data__http), /* per_session_data_size */ - 0, /* max frame size / rx buffer */ - }, - { - "dumb-increment-protocol", - callback_dumb_increment, - sizeof(struct per_session_data__dumb_increment), - 10, - }, - { - "lws-mirror-protocol", - callback_lws_mirror, - sizeof(struct per_session_data__lws_mirror), - 128, - }, - { - "lws-status", - callback_lws_status, - sizeof(struct per_session_data__lws_status), - 128, - }, - { NULL, NULL, 0, 0 } /* terminator */ + /* first protocol must always be HTTP handler */ + + { + "http-only", /* name */ + callback_http, /* callback */ + sizeof (struct per_session_data__http), /* per_session_data_size */ + 0, /* max frame size / rx buffer */ + }, + { + "dumb-increment-protocol", + callback_dumb_increment, + sizeof(struct per_session_data__dumb_increment), + 10, + }, + + LWS_PLUGIN_PROTOCOL_MIRROR, + LWS_PLUGIN_PROTOCOL_LWS_STATUS, + LWS_PLUGIN_PROTOCOL_LWS_META, + { NULL, NULL, 0, 0 } /* terminator */ }; static const struct lws_extension exts[] = { - { - "permessage-deflate", - lws_extension_callback_pm_deflate, - "permessage-deflate; client_no_context_takeover; client_max_window_bits" - }, - { - "deflate-frame", - lws_extension_callback_pm_deflate, - "deflate_frame" - }, - { NULL, NULL, NULL /* terminator */ } + { + "permessage-deflate", + lws_extension_callback_pm_deflate, + "permessage-deflate; client_no_context_takeover; client_max_window_bits" + }, + { + "deflate-frame", + lws_extension_callback_pm_deflate, + "deflate_frame" + }, + { NULL, NULL, NULL /* terminator */ } }; /* this shows how to override the lws file operations. You don't need @@ -121,226 +119,227 @@ static const struct lws_extension exts[] = { */ static lws_fop_fd_t test_server_fops_open(const struct lws_plat_file_ops *fops, - const char *vfs_path, const char *vpath, - lws_fop_flags_t *flags) + const char *vfs_path, const char *vpath, + lws_fop_flags_t *flags) { - lws_fop_fd_t n; + lws_fop_fd_t n; - /* call through to original platform implementation */ - n = fops_plat.open(fops, vfs_path, vpath, flags); + /* call through to original platform implementation */ + n = fops_plat.open(fops, vfs_path, vpath, flags); - lwsl_notice("%s: opening %s, ret %p\n", __func__, vfs_path, n); + lwsl_notice("%s: opening %s, ret %p\n", __func__, vfs_path, n); - return n; + return n; } void signal_cb(evutil_socket_t sock_fd, short events, void *ctx) { - lwsl_notice("Signal caught, exiting...\n"); - force_exit = 1; - if (events & EV_SIGNAL) { - struct event_base *event_base_loop = event_get_base((struct event *) ctx); - event_base_loopbreak(event_base_loop); - } + struct event_base *event_base_loop = ctx; + + lwsl_notice("Signal caught, exiting...\n"); + force_exit = 1; + if (events & EV_SIGNAL) + event_base_loopbreak(event_base_loop); } static void ev_timeout_cb (evutil_socket_t sock_fd, short events, void *ctx) { - lws_callback_on_writable_all_protocol(context, - &protocols[PROTOCOL_DUMB_INCREMENT]); + lws_callback_on_writable_all_protocol(context, + &protocols[PROTOCOL_DUMB_INCREMENT]); } static struct option options[] = { - { "help", no_argument, NULL, 'h' }, - { "debug", required_argument, NULL, 'd' }, - { "port", required_argument, NULL, 'p' }, - { "ssl", no_argument, NULL, 's' }, - { "allow-non-ssl", no_argument, NULL, 'a' }, - { "interface", required_argument, NULL, 'i' }, - { "closetest", no_argument, NULL, 'c' }, - { "libevent", no_argument, NULL, 'e' }, + { "help", no_argument, NULL, 'h' }, + { "debug", required_argument, NULL, 'd' }, + { "port", required_argument, NULL, 'p' }, + { "ssl", no_argument, NULL, 's' }, + { "allow-non-ssl", no_argument, NULL, 'a' }, + { "interface", required_argument, NULL, 'i' }, + { "closetest", no_argument, NULL, 'c' }, + { "libevent", no_argument, NULL, 'e' }, #ifndef LWS_NO_DAEMONIZE - { "daemonize", no_argument, NULL, 'D' }, + { "daemonize", no_argument, NULL, 'D' }, #endif - { "resource_path", required_argument, NULL, 'r' }, - { NULL, 0, 0, 0 } + { "resource_path", required_argument, NULL, 'r' }, + { NULL, 0, 0, 0 } }; int main(int argc, char **argv) { - int sigs[] = { SIGINT, SIGKILL, SIGTERM, SIGSEGV, SIGFPE }; - struct event *signals[ARRAY_SIZE(sigs)]; - struct event_base *event_base_loop = event_base_new(); - struct lws_context_creation_info info; - char interface_name[128] = ""; - const char *iface = NULL; - struct event *timeout_watcher; - char cert_path[1024]; - char key_path[1024]; - int use_ssl = 0; - int opts = 0; - int n = 0; + int sigs[] = { SIGINT, SIGKILL, SIGTERM, SIGSEGV, SIGFPE }; + struct event *signals[ARRAY_SIZE(sigs)]; + struct event_base *event_base_loop = event_base_new(); + struct lws_context_creation_info info; + char interface_name[128] = ""; + const char *iface = NULL; + struct event *timeout_watcher; + char cert_path[1024]; + char key_path[1024]; + int use_ssl = 0; + int opts = 0; + int n = 0; #ifndef _WIN32 - int syslog_options = LOG_PID | LOG_PERROR; + int syslog_options = LOG_PID | LOG_PERROR; #endif #ifndef LWS_NO_DAEMONIZE - int daemonize = 0; + int daemonize = 0; #endif - /* - * take care to zero down the info struct, he contains random garbaage - * from the stack otherwise - */ - memset(&info, 0, sizeof info); - info.port = 7681; - - while (n >= 0) { - n = getopt_long(argc, argv, "eci:hsap:d:Dr:", options, NULL); - if (n < 0) - continue; - switch (n) { - case 'e': - opts |= LWS_SERVER_OPTION_LIBEVENT; - break; + /* + * take care to zero down the info struct, he contains random garbaage + * from the stack otherwise + */ + memset(&info, 0, sizeof info); + info.port = 7681; + + while (n >= 0) { + n = getopt_long(argc, argv, "eci:hsap:d:Dr:", options, NULL); + if (n < 0) + continue; + switch (n) { + case 'e': + opts |= LWS_SERVER_OPTION_LIBEVENT; + break; #ifndef LWS_NO_DAEMONIZE - case 'D': - daemonize = 1; - #ifndef _WIN32 - syslog_options &= ~LOG_PERROR; - #endif - break; + case 'D': + daemonize = 1; +#ifndef _WIN32 + syslog_options &= ~LOG_PERROR; #endif - case 'd': - debug_level = atoi(optarg); - break; - case 's': - use_ssl = 1; - break; - case 'a': - opts |= LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT; - break; - case 'p': - info.port = atoi(optarg); - break; - case 'i': - strncpy(interface_name, optarg, sizeof interface_name); - interface_name[(sizeof interface_name) - 1] = '\0'; - iface = interface_name; - break; - case 'c': - close_testing = 1; - fprintf(stderr, " Close testing mode -- closes on " - "client after 50 dumb increments" - "and suppresses lws_mirror spam\n"); - break; - case 'r': - resource_path = optarg; - printf("Setting resource path to \"%s\"\n", resource_path); - break; - case 'h': - fprintf(stderr, "Usage: test-server " - "[--port=

] [--ssl] " - "[-d ] " - "[--resource_path ]\n"); - exit(1); - } - } + break; +#endif + case 'd': + debug_level = atoi(optarg); + break; + case 's': + use_ssl = 1; + break; + case 'a': + opts |= LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT; + break; + case 'p': + info.port = atoi(optarg); + break; + case 'i': + strncpy(interface_name, optarg, sizeof interface_name); + interface_name[(sizeof interface_name) - 1] = '\0'; + iface = interface_name; + break; + case 'c': + close_testing = 1; + fprintf(stderr, " Close testing mode -- closes on " + "client after 50 dumb increments" + "and suppresses lws_mirror spam\n"); + break; + case 'r': + resource_path = optarg; + printf("Setting resource path to \"%s\"\n", resource_path); + break; + case 'h': + fprintf(stderr, "Usage: test-server " + "[--port=

] [--ssl] " + "[-d ] " + "[--resource_path ]\n"); + exit(1); + } + } #if !defined(LWS_NO_DAEMONIZE) && !defined(WIN32) - /* - * normally lock path would be /var/lock/lwsts or similar, to - * simplify getting started without having to take care about - * permissions or running as root, set to /tmp/.lwsts-lock - */ - if (daemonize && lws_daemonize("/tmp/.lwsts-lock")) { - fprintf(stderr, "Failed to daemonize\n"); - return 1; - } + /* + * normally lock path would be /var/lock/lwsts or similar, to + * simplify getting started without having to take care about + * permissions or running as root, set to /tmp/.lwsts-lock + */ + if (daemonize && lws_daemonize("/tmp/.lwsts-lock")) { + fprintf(stderr, "Failed to daemonize\n"); + return 1; + } #endif - for (n = 0; n < ARRAY_SIZE(sigs); n++) { - signals[n] = evsignal_new(event_base_loop, sigs[n], signal_cb, event_self_cbarg()); - evsignal_add(signals[n], NULL); - } + for (n = 0; n < ARRAY_SIZE(sigs); n++) { + signals[n] = evsignal_new(event_base_loop, sigs[n], signal_cb, event_base_loop); + + evsignal_add(signals[n], NULL); + } #ifndef _WIN32 - /* we will only try to log things according to our debug_level */ - setlogmask(LOG_UPTO (LOG_DEBUG)); - openlog("lwsts", syslog_options, LOG_DAEMON); + /* we will only try to log things according to our debug_level */ + setlogmask(LOG_UPTO (LOG_DEBUG)); + openlog("lwsts", syslog_options, LOG_DAEMON); #endif - /* tell the library what debug level to emit and to send it to syslog */ - lws_set_log_level(debug_level, lwsl_emit_syslog); - - lwsl_notice("libwebsockets test server libevent - license LGPL2.1+SLE\n"); - lwsl_notice("(C) Copyright 2010-2016 Andy Green \n"); - - printf("Using resource path \"%s\"\n", resource_path); - - info.iface = iface; - info.protocols = protocols; - info.extensions = exts; - - info.ssl_cert_filepath = NULL; - info.ssl_private_key_filepath = NULL; - - if (use_ssl) { - if (strlen(resource_path) > sizeof(cert_path) - 32) { - lwsl_err("resource path too long\n"); - return -1; - } - sprintf(cert_path, "%s/libwebsockets-test-server.pem", - resource_path); - if (strlen(resource_path) > sizeof(key_path) - 32) { - lwsl_err("resource path too long\n"); - return -1; - } - sprintf(key_path, "%s/libwebsockets-test-server.key.pem", - resource_path); - - info.ssl_cert_filepath = cert_path; - info.ssl_private_key_filepath = key_path; - - opts |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; - } - info.gid = -1; - info.uid = -1; - info.max_http_header_pool = 1; - info.options = opts | LWS_SERVER_OPTION_LIBEVENT; - - context = lws_create_context(&info); - if (context == NULL) { - lwsl_err("libwebsocket init failed\n"); - return -1; - } - - /* - * this shows how to override the lws file operations. You don't need - * to do any of this unless you have a reason (eg, want to serve - * compressed files without decompressing the whole archive) - */ - /* stash original platform fops */ - fops_plat = *(lws_get_fops(context)); - /* override the active fops */ - lws_get_fops(context)->open = test_server_fops_open; - - // Don't use the default Signal Event Watcher & Handler - lws_event_sigint_cfg(context, 0, NULL); - // Initialize the LWS with libevent loop - lws_event_initloop(context, event_base_loop, 0); - - timeout_watcher = evtimer_new(event_base_loop, ev_timeout_cb, NULL); - struct timeval tv = {0, 50000}; - evtimer_add(timeout_watcher, &tv); - event_base_dispatch(event_base_loop); - - lws_context_destroy(context); - lwsl_notice("libwebsockets-test-server exited cleanly\n"); + /* tell the library what debug level to emit and to send it to syslog */ + lws_set_log_level(debug_level, lwsl_emit_syslog); + + lwsl_notice("libwebsockets test server libevent - license LGPL2.1+SLE\n"); + lwsl_notice("(C) Copyright 2010-2016 Andy Green \n"); + + printf("Using resource path \"%s\"\n", resource_path); + + info.iface = iface; + info.protocols = protocols; + info.extensions = exts; + + info.ssl_cert_filepath = NULL; + info.ssl_private_key_filepath = NULL; + + if (use_ssl) { + if (strlen(resource_path) > sizeof(cert_path) - 32) { + lwsl_err("resource path too long\n"); + return -1; + } + sprintf(cert_path, "%s/libwebsockets-test-server.pem", + resource_path); + if (strlen(resource_path) > sizeof(key_path) - 32) { + lwsl_err("resource path too long\n"); + return -1; + } + sprintf(key_path, "%s/libwebsockets-test-server.key.pem", + resource_path); + + info.ssl_cert_filepath = cert_path; + info.ssl_private_key_filepath = key_path; + + opts |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; + } + info.gid = -1; + info.uid = -1; + info.max_http_header_pool = 1; + info.options = opts | LWS_SERVER_OPTION_LIBEVENT; + + context = lws_create_context(&info); + if (context == NULL) { + lwsl_err("libwebsocket init failed\n"); + return -1; + } + + /* + * this shows how to override the lws file operations. You don't need + * to do any of this unless you have a reason (eg, want to serve + * compressed files without decompressing the whole archive) + */ + /* stash original platform fops */ + fops_plat = *(lws_get_fops(context)); + /* override the active fops */ + lws_get_fops(context)->open = test_server_fops_open; + + // Don't use the default Signal Event Watcher & Handler + lws_event_sigint_cfg(context, 0, NULL); + // Initialize the LWS with libevent loop + lws_event_initloop(context, event_base_loop, 0); + + timeout_watcher = event_new(event_base_loop, -1, EV_PERSIST, ev_timeout_cb, NULL); + struct timeval tv = {0, 50000}; + evtimer_add(timeout_watcher, &tv); + event_base_dispatch(event_base_loop); + + lws_context_destroy(context); + lwsl_notice("libwebsockets-test-server exited cleanly\n"); #ifndef _WIN32 - closelog(); + closelog(); #endif - return 0; + return 0; } -- 2.7.4