diff --git a/src/websockets.c b/src/websockets.c index 4b9d4222..ac966876 100644 --- a/src/websockets.c +++ b/src/websockets.c @@ -605,24 +605,47 @@ static int callback_http( break; case LWS_CALLBACK_ADD_POLL_FD: - case LWS_CALLBACK_DEL_POLL_FD: - case LWS_CALLBACK_CHANGE_MODE_POLL_FD: HASH_FIND(hh_sock, db.contexts_by_sock, &pollargs->fd, sizeof(pollargs->fd), mosq); if(mosq){ - if(pollargs->events & POLLOUT){ + if(pollargs->events & LWS_POLLOUT){ mux__add_out(mosq); mosq->ws_want_write = true; }else{ mux__remove_out(mosq); } }else{ - if(reason == LWS_CALLBACK_ADD_POLL_FD && (pollargs->events & POLLIN)){ + if(pollargs->events & POLLIN){ /* Assume this is a new listener */ listeners__add_websockets(lws_get_context(wsi), pollargs->fd); } } break; + case LWS_CALLBACK_DEL_POLL_FD: + HASH_FIND(hh_sock, db.contexts_by_sock, &pollargs->fd, sizeof(pollargs->fd), mosq); + if(mosq){ + mux__delete(mosq); + }else{ + return 1; + } + break; + + case LWS_CALLBACK_CHANGE_MODE_POLL_FD: + HASH_FIND(hh_sock, db.contexts_by_sock, &pollargs->fd, sizeof(pollargs->fd), mosq); + if(mosq){ + if(pollargs->events & LWS_POLLHUP){ + return 1; + }else if(pollargs->events & LWS_POLLOUT){ + mux__add_out(mosq); + mosq->ws_want_write = true; + }else{ + mux__remove_out(mosq); + } + }else{ + return 1; + } + break; + #ifdef WITH_TLS case LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION: if(!len || (SSL_get_verify_result((SSL*)in) != X509_V_OK)){