1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-30 00:00:16 +01:00

libevent: update to use static plugins and work with new libevent2

Plus fix broken indent style
This commit is contained in:
Andy Green 2017-07-27 07:57:59 +08:00
parent 41c15511eb
commit d86641ed3a
2 changed files with 214 additions and 212 deletions

View file

@ -39,12 +39,15 @@ lws_event_cb(evutil_socket_t sock_fd, short revents, void *ctx)
if (revents & EV_TIMEOUT) if (revents & EV_TIMEOUT)
return; return;
/* !!! EV_CLOSED doesn't exist in libevent2 */
#if LIBEVENT_VERSION_NUMBER < 0x02000000
if (revents & EV_CLOSED) if (revents & EV_CLOSED)
{ {
event_del(lws_io->event_watcher); event_del(lws_io->event_watcher);
event_free(lws_io->event_watcher); event_free(lws_io->event_watcher);
return; return;
} }
#endif
eventfd.fd = sock_fd; eventfd.fd = sock_fd;
eventfd.events = 0; eventfd.events = 0;

View file

@ -1,7 +1,7 @@
/* /*
* libwebsockets-test-server - libwebsockets test implementation * libwebsockets-test-server - libwebsockets test implementation
* *
* Copyright (C) 2011-2016 Andy Green <andy@warmcat.com> * Copyright (C) 2011-2017 Andy Green <andy@warmcat.com>
* *
* This file is made available under the Creative Commons CC0 1.0 * This file is made available under the Creative Commons CC0 1.0
* Universal Public Domain Dedication. * Universal Public Domain Dedication.
@ -34,6 +34,11 @@ char *resource_path = LOCAL_RESOURCE_PATH;
char crl_path[1024] = ""; char crl_path[1024] = "";
#endif #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 */ /* singlethreaded version --> no locks */
void test_server_lock(int care) void test_server_lock(int care)
@ -59,60 +64,53 @@ void test_server_unlock(int care)
*/ */
enum demo_protocols { enum demo_protocols {
/* always first */ /* always first */
PROTOCOL_HTTP = 0, PROTOCOL_HTTP = 0,
PROTOCOL_DUMB_INCREMENT, PROTOCOL_DUMB_INCREMENT,
PROTOCOL_LWS_MIRROR, PROTOCOL_LWS_MIRROR,
PROTOCOL_LWS_META,
/* always last */ /* always last */
DEMO_PROTOCOL_COUNT DEMO_PROTOCOL_COUNT
}; };
/* list of supported protocols and callbacks */ /* list of supported protocols and callbacks */
static struct lws_protocols protocols[] = { static struct lws_protocols protocols[] = {
/* first protocol must always be HTTP handler */ /* first protocol must always be HTTP handler */
{ {
"http-only", /* name */ "http-only", /* name */
callback_http, /* callback */ callback_http, /* callback */
sizeof (struct per_session_data__http), /* per_session_data_size */ sizeof (struct per_session_data__http), /* per_session_data_size */
0, /* max frame size / rx buffer */ 0, /* max frame size / rx buffer */
}, },
{ {
"dumb-increment-protocol", "dumb-increment-protocol",
callback_dumb_increment, callback_dumb_increment,
sizeof(struct per_session_data__dumb_increment), sizeof(struct per_session_data__dumb_increment),
10, 10,
}, },
{
"lws-mirror-protocol", LWS_PLUGIN_PROTOCOL_MIRROR,
callback_lws_mirror, LWS_PLUGIN_PROTOCOL_LWS_STATUS,
sizeof(struct per_session_data__lws_mirror), LWS_PLUGIN_PROTOCOL_LWS_META,
128, { NULL, NULL, 0, 0 } /* terminator */
},
{
"lws-status",
callback_lws_status,
sizeof(struct per_session_data__lws_status),
128,
},
{ NULL, NULL, 0, 0 } /* terminator */
}; };
static const struct lws_extension exts[] = { static const struct lws_extension exts[] = {
{ {
"permessage-deflate", "permessage-deflate",
lws_extension_callback_pm_deflate, lws_extension_callback_pm_deflate,
"permessage-deflate; client_no_context_takeover; client_max_window_bits" "permessage-deflate; client_no_context_takeover; client_max_window_bits"
}, },
{ {
"deflate-frame", "deflate-frame",
lws_extension_callback_pm_deflate, lws_extension_callback_pm_deflate,
"deflate_frame" "deflate_frame"
}, },
{ NULL, NULL, NULL /* terminator */ } { NULL, NULL, NULL /* terminator */ }
}; };
/* this shows how to override the lws file operations. You don't need /* 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 static lws_fop_fd_t
test_server_fops_open(const struct lws_plat_file_ops *fops, test_server_fops_open(const struct lws_plat_file_ops *fops,
const char *vfs_path, const char *vpath, const char *vfs_path, const char *vpath,
lws_fop_flags_t *flags) lws_fop_flags_t *flags)
{ {
lws_fop_fd_t n; lws_fop_fd_t n;
/* call through to original platform implementation */ /* call through to original platform implementation */
n = fops_plat.open(fops, vfs_path, vpath, flags); 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) void signal_cb(evutil_socket_t sock_fd, short events, void *ctx)
{ {
lwsl_notice("Signal caught, exiting...\n"); struct event_base *event_base_loop = ctx;
force_exit = 1;
if (events & EV_SIGNAL) { lwsl_notice("Signal caught, exiting...\n");
struct event_base *event_base_loop = event_get_base((struct event *) ctx); force_exit = 1;
event_base_loopbreak(event_base_loop); if (events & EV_SIGNAL)
} event_base_loopbreak(event_base_loop);
} }
static void static void
ev_timeout_cb (evutil_socket_t sock_fd, short events, void *ctx) ev_timeout_cb (evutil_socket_t sock_fd, short events, void *ctx)
{ {
lws_callback_on_writable_all_protocol(context, lws_callback_on_writable_all_protocol(context,
&protocols[PROTOCOL_DUMB_INCREMENT]); &protocols[PROTOCOL_DUMB_INCREMENT]);
} }
static struct option options[] = { static struct option options[] = {
{ "help", no_argument, NULL, 'h' }, { "help", no_argument, NULL, 'h' },
{ "debug", required_argument, NULL, 'd' }, { "debug", required_argument, NULL, 'd' },
{ "port", required_argument, NULL, 'p' }, { "port", required_argument, NULL, 'p' },
{ "ssl", no_argument, NULL, 's' }, { "ssl", no_argument, NULL, 's' },
{ "allow-non-ssl", no_argument, NULL, 'a' }, { "allow-non-ssl", no_argument, NULL, 'a' },
{ "interface", required_argument, NULL, 'i' }, { "interface", required_argument, NULL, 'i' },
{ "closetest", no_argument, NULL, 'c' }, { "closetest", no_argument, NULL, 'c' },
{ "libevent", no_argument, NULL, 'e' }, { "libevent", no_argument, NULL, 'e' },
#ifndef LWS_NO_DAEMONIZE #ifndef LWS_NO_DAEMONIZE
{ "daemonize", no_argument, NULL, 'D' }, { "daemonize", no_argument, NULL, 'D' },
#endif #endif
{ "resource_path", required_argument, NULL, 'r' }, { "resource_path", required_argument, NULL, 'r' },
{ NULL, 0, 0, 0 } { NULL, 0, 0, 0 }
}; };
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int sigs[] = { SIGINT, SIGKILL, SIGTERM, SIGSEGV, SIGFPE }; int sigs[] = { SIGINT, SIGKILL, SIGTERM, SIGSEGV, SIGFPE };
struct event *signals[ARRAY_SIZE(sigs)]; struct event *signals[ARRAY_SIZE(sigs)];
struct event_base *event_base_loop = event_base_new(); struct event_base *event_base_loop = event_base_new();
struct lws_context_creation_info info; struct lws_context_creation_info info;
char interface_name[128] = ""; char interface_name[128] = "";
const char *iface = NULL; const char *iface = NULL;
struct event *timeout_watcher; struct event *timeout_watcher;
char cert_path[1024]; char cert_path[1024];
char key_path[1024]; char key_path[1024];
int use_ssl = 0; int use_ssl = 0;
int opts = 0; int opts = 0;
int n = 0; int n = 0;
#ifndef _WIN32 #ifndef _WIN32
int syslog_options = LOG_PID | LOG_PERROR; int syslog_options = LOG_PID | LOG_PERROR;
#endif #endif
#ifndef LWS_NO_DAEMONIZE #ifndef LWS_NO_DAEMONIZE
int daemonize = 0; int daemonize = 0;
#endif #endif
/* /*
* take care to zero down the info struct, he contains random garbaage * take care to zero down the info struct, he contains random garbaage
* from the stack otherwise * from the stack otherwise
*/ */
memset(&info, 0, sizeof info); memset(&info, 0, sizeof info);
info.port = 7681; info.port = 7681;
while (n >= 0) { while (n >= 0) {
n = getopt_long(argc, argv, "eci:hsap:d:Dr:", options, NULL); n = getopt_long(argc, argv, "eci:hsap:d:Dr:", options, NULL);
if (n < 0) if (n < 0)
continue; continue;
switch (n) { switch (n) {
case 'e': case 'e':
opts |= LWS_SERVER_OPTION_LIBEVENT; opts |= LWS_SERVER_OPTION_LIBEVENT;
break; break;
#ifndef LWS_NO_DAEMONIZE #ifndef LWS_NO_DAEMONIZE
case 'D': case 'D':
daemonize = 1; daemonize = 1;
#ifndef _WIN32 #ifndef _WIN32
syslog_options &= ~LOG_PERROR; syslog_options &= ~LOG_PERROR;
#endif
break;
#endif #endif
case 'd': break;
debug_level = atoi(optarg); #endif
break; case 'd':
case 's': debug_level = atoi(optarg);
use_ssl = 1; break;
break; case 's':
case 'a': use_ssl = 1;
opts |= LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT; break;
break; case 'a':
case 'p': opts |= LWS_SERVER_OPTION_ALLOW_NON_SSL_ON_SSL_PORT;
info.port = atoi(optarg); break;
break; case 'p':
case 'i': info.port = atoi(optarg);
strncpy(interface_name, optarg, sizeof interface_name); break;
interface_name[(sizeof interface_name) - 1] = '\0'; case 'i':
iface = interface_name; strncpy(interface_name, optarg, sizeof interface_name);
break; interface_name[(sizeof interface_name) - 1] = '\0';
case 'c': iface = interface_name;
close_testing = 1; break;
fprintf(stderr, " Close testing mode -- closes on " case 'c':
"client after 50 dumb increments" close_testing = 1;
"and suppresses lws_mirror spam\n"); fprintf(stderr, " Close testing mode -- closes on "
break; "client after 50 dumb increments"
case 'r': "and suppresses lws_mirror spam\n");
resource_path = optarg; break;
printf("Setting resource path to \"%s\"\n", resource_path); case 'r':
break; resource_path = optarg;
case 'h': printf("Setting resource path to \"%s\"\n", resource_path);
fprintf(stderr, "Usage: test-server " break;
"[--port=<p>] [--ssl] " case 'h':
"[-d <log bitfield>] " fprintf(stderr, "Usage: test-server "
"[--resource_path <path>]\n"); "[--port=<p>] [--ssl] "
exit(1); "[-d <log bitfield>] "
} "[--resource_path <path>]\n");
} exit(1);
}
}
#if !defined(LWS_NO_DAEMONIZE) && !defined(WIN32) #if !defined(LWS_NO_DAEMONIZE) && !defined(WIN32)
/* /*
* normally lock path would be /var/lock/lwsts or similar, to * normally lock path would be /var/lock/lwsts or similar, to
* simplify getting started without having to take care about * simplify getting started without having to take care about
* permissions or running as root, set to /tmp/.lwsts-lock * permissions or running as root, set to /tmp/.lwsts-lock
*/ */
if (daemonize && lws_daemonize("/tmp/.lwsts-lock")) { if (daemonize && lws_daemonize("/tmp/.lwsts-lock")) {
fprintf(stderr, "Failed to daemonize\n"); fprintf(stderr, "Failed to daemonize\n");
return 1; return 1;
} }
#endif #endif
for (n = 0; n < ARRAY_SIZE(sigs); n++) { for (n = 0; n < ARRAY_SIZE(sigs); n++) {
signals[n] = evsignal_new(event_base_loop, sigs[n], signal_cb, event_self_cbarg()); signals[n] = evsignal_new(event_base_loop, sigs[n], signal_cb, event_base_loop);
evsignal_add(signals[n], NULL);
} evsignal_add(signals[n], NULL);
}
#ifndef _WIN32 #ifndef _WIN32
/* we will only try to log things according to our debug_level */ /* we will only try to log things according to our debug_level */
setlogmask(LOG_UPTO (LOG_DEBUG)); setlogmask(LOG_UPTO (LOG_DEBUG));
openlog("lwsts", syslog_options, LOG_DAEMON); openlog("lwsts", syslog_options, LOG_DAEMON);
#endif #endif
/* tell the library what debug level to emit and to send it to syslog */ /* tell the library what debug level to emit and to send it to syslog */
lws_set_log_level(debug_level, lwsl_emit_syslog); lws_set_log_level(debug_level, lwsl_emit_syslog);
lwsl_notice("libwebsockets test server libevent - license LGPL2.1+SLE\n"); lwsl_notice("libwebsockets test server libevent - license LGPL2.1+SLE\n");
lwsl_notice("(C) Copyright 2010-2016 Andy Green <andy@warmcat.com>\n"); lwsl_notice("(C) Copyright 2010-2016 Andy Green <andy@warmcat.com>\n");
printf("Using resource path \"%s\"\n", resource_path); printf("Using resource path \"%s\"\n", resource_path);
info.iface = iface; info.iface = iface;
info.protocols = protocols; info.protocols = protocols;
info.extensions = exts; info.extensions = exts;
info.ssl_cert_filepath = NULL; info.ssl_cert_filepath = NULL;
info.ssl_private_key_filepath = NULL; info.ssl_private_key_filepath = NULL;
if (use_ssl) { if (use_ssl) {
if (strlen(resource_path) > sizeof(cert_path) - 32) { if (strlen(resource_path) > sizeof(cert_path) - 32) {
lwsl_err("resource path too long\n"); lwsl_err("resource path too long\n");
return -1; return -1;
} }
sprintf(cert_path, "%s/libwebsockets-test-server.pem", sprintf(cert_path, "%s/libwebsockets-test-server.pem",
resource_path); resource_path);
if (strlen(resource_path) > sizeof(key_path) - 32) { if (strlen(resource_path) > sizeof(key_path) - 32) {
lwsl_err("resource path too long\n"); lwsl_err("resource path too long\n");
return -1; return -1;
} }
sprintf(key_path, "%s/libwebsockets-test-server.key.pem", sprintf(key_path, "%s/libwebsockets-test-server.key.pem",
resource_path); resource_path);
info.ssl_cert_filepath = cert_path; info.ssl_cert_filepath = cert_path;
info.ssl_private_key_filepath = key_path; info.ssl_private_key_filepath = key_path;
opts |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; opts |= LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
} }
info.gid = -1; info.gid = -1;
info.uid = -1; info.uid = -1;
info.max_http_header_pool = 1; info.max_http_header_pool = 1;
info.options = opts | LWS_SERVER_OPTION_LIBEVENT; info.options = opts | LWS_SERVER_OPTION_LIBEVENT;
context = lws_create_context(&info); context = lws_create_context(&info);
if (context == NULL) { if (context == NULL) {
lwsl_err("libwebsocket init failed\n"); lwsl_err("libwebsocket init failed\n");
return -1; return -1;
} }
/* /*
* this shows how to override the lws file operations. You don't need * 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 * to do any of this unless you have a reason (eg, want to serve
* compressed files without decompressing the whole archive) * compressed files without decompressing the whole archive)
*/ */
/* stash original platform fops */ /* stash original platform fops */
fops_plat = *(lws_get_fops(context)); fops_plat = *(lws_get_fops(context));
/* override the active fops */ /* override the active fops */
lws_get_fops(context)->open = test_server_fops_open; lws_get_fops(context)->open = test_server_fops_open;
// Don't use the default Signal Event Watcher & Handler // Don't use the default Signal Event Watcher & Handler
lws_event_sigint_cfg(context, 0, NULL); lws_event_sigint_cfg(context, 0, NULL);
// Initialize the LWS with libevent loop // Initialize the LWS with libevent loop
lws_event_initloop(context, event_base_loop, 0); lws_event_initloop(context, event_base_loop, 0);
timeout_watcher = evtimer_new(event_base_loop, ev_timeout_cb, NULL); timeout_watcher = event_new(event_base_loop, -1, EV_PERSIST, ev_timeout_cb, NULL);
struct timeval tv = {0, 50000}; struct timeval tv = {0, 50000};
evtimer_add(timeout_watcher, &tv); evtimer_add(timeout_watcher, &tv);
event_base_dispatch(event_base_loop); event_base_dispatch(event_base_loop);
lws_context_destroy(context); lws_context_destroy(context);
lwsl_notice("libwebsockets-test-server exited cleanly\n"); lwsl_notice("libwebsockets-test-server exited cleanly\n");
#ifndef _WIN32 #ifndef _WIN32
closelog(); closelog();
#endif #endif
return 0; return 0;
} }