diff --git a/lib/libev.c b/lib/libev.c index eff7197f3..8cda4483c 100644 --- a/lib/libev.c +++ b/lib/libev.c @@ -57,6 +57,21 @@ libwebsocket_sigint_cb(struct ev_loop *loop, ev_break(loop, EVBREAK_ALL); } +LWS_VISIBLE int libwebsocket_sigint_cfg( + struct libwebsocket_context *context, + int use_ev_sigint, + lws_ev_signal_cb* cb) +{ + context->use_ev_sigint = use_ev_sigint; + if( cb ) { + context->lws_ev_sigint_cb = cb; + } + else { + context->lws_ev_sigint_cb = &libwebsocket_sigint_cb; + }; + return 0; +}; + LWS_VISIBLE int libwebsocket_initloop( struct libwebsocket_context *context, @@ -80,8 +95,12 @@ libwebsocket_initloop( ev_io_init(w_accept, libwebsocket_accept_cb, context->listen_service_fd, EV_READ); ev_io_start(context->io_loop,w_accept); - ev_signal_init(w_sigint, libwebsocket_sigint_cb, SIGINT); - ev_signal_start(context->io_loop,w_sigint); + + /* Register the signal watcher unless the user has indicated otherwise: */ + if( context->use_ev_sigint ) { + ev_signal_init(w_sigint, context->lws_ev_sigint_cb, SIGINT); + ev_signal_start(context->io_loop,w_sigint); + }; backend = ev_backend(loop); switch (backend) { diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index b253d9284..67d57ce68 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -1137,6 +1137,14 @@ lws_add_http_header_status(struct libwebsocket_context *context, LWS_EXTERN int lws_http_transaction_completed(struct libwebsocket *wsi); #ifdef LWS_USE_LIBEV +typedef void (lws_ev_signal_cb)(EV_P_ struct ev_signal *w, int revents); + +LWS_VISIBLE LWS_EXTERN int +libwebsocket_sigint_cfg( + struct libwebsocket_context *context, + int use_ev_sigint, + lws_ev_signal_cb* cb); + LWS_VISIBLE LWS_EXTERN int libwebsocket_initloop( struct libwebsocket_context *context, struct ev_loop *loop); diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index a862234ac..6fb88a7c7 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -432,6 +432,8 @@ struct libwebsocket_context { struct ev_loop* io_loop; struct lws_io_watcher w_accept; struct lws_signal_watcher w_sigint; + lws_ev_signal_cb* lws_ev_sigint_cb; + int use_ev_sigint; #endif /* LWS_USE_LIBEV */ int max_fds; int listen_port;