introduce this param in callback fix server close on client socket
Signed-off-by: Andy Green <andy@warmcat.com>
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index d4db3f3..ec1e482 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -80,15 +80,16 @@
struct libwebsocket *wsi)
{
int n;
+ int old_state;
unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + 2 +
LWS_SEND_BUFFER_POST_PADDING];
if (!wsi)
return;
- n = wsi->state;
+ old_state = wsi->state;
- if (n == WSI_STATE_DEAD_SOCKET)
+ if (old_state == WSI_STATE_DEAD_SOCKET)
return;
/* remove this fd from wsi mapping hashtable */
@@ -111,7 +112,7 @@
/* remove also from external POLL support via protocol 0 */
- this->protocols[0].callback(wsi,
+ this->protocols[0].callback(this, wsi,
LWS_CALLBACK_DEL_POLL_FD, (void *)(long)wsi->sock, NULL, 0);
/*
@@ -122,7 +123,7 @@
* WSI_STATE_RETURNED_CLOSE_ALREADY and we will skip this
*/
- if (n == WSI_STATE_ESTABLISHED)
+ if (old_state == WSI_STATE_ESTABLISHED)
libwebsocket_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING], 0,
LWS_WRITE_CLOSE);
@@ -130,8 +131,8 @@
/* tell the user it's all over for this guy */
- if (wsi->protocol->callback && n == WSI_STATE_ESTABLISHED)
- wsi->protocol->callback(wsi, LWS_CALLBACK_CLOSED,
+ if (wsi->protocol->callback && old_state == WSI_STATE_ESTABLISHED)
+ wsi->protocol->callback(this, wsi, LWS_CALLBACK_CLOSED,
wsi->user_space, NULL, 0);
/* free up his allocations */
@@ -317,7 +318,7 @@
* yet so we issue this to protocols[0]
*/
- if ((this->protocols[0].callback)(wsi,
+ if ((this->protocols[0].callback)(this, wsi,
LWS_CALLBACK_FILTER_NETWORK_CONNECTION,
(void*)(long)accept_fd, NULL, 0)) {
fprintf(stderr, "Callback denied network connection\n");
@@ -420,7 +421,7 @@
this->fds[this->fds_count++].fd = accept_fd;
/* external POLL support via protocol 0 */
- this->protocols[0].callback(new_wsi,
+ this->protocols[0].callback(this, new_wsi,
LWS_CALLBACK_ADD_POLL_FD,
(void *)(long)accept_fd, NULL, POLLIN);
@@ -469,7 +470,7 @@
this->fds[this->fds_count++].fd = accept_fd;
/* external POLL support via protocol 0 */
- this->protocols[0].callback(new_wsi,
+ this->protocols[0].callback(this, new_wsi,
LWS_CALLBACK_ADD_POLL_FD,
(void *)(long)accept_fd, NULL, POLLIN);
@@ -497,11 +498,11 @@
pollfd->events &= ~POLLOUT;
/* external POLL support via protocol 0 */
- this->protocols[0].callback(wsi,
+ this->protocols[0].callback(this, wsi,
LWS_CALLBACK_CLEAR_MODE_POLL_FD,
(void *)(long)wsi->sock, NULL, POLLOUT);
- wsi->protocol->callback(wsi,
+ wsi->protocol->callback(this, wsi,
LWS_CALLBACK_CLIENT_WRITEABLE,
wsi->user_space,
NULL, 0);
@@ -553,7 +554,7 @@
/* broadcast it to this connection */
- new_wsi->protocol->callback(new_wsi,
+ new_wsi->protocol->callback(this, new_wsi,
LWS_CALLBACK_BROADCAST,
new_wsi->user_space,
buf + LWS_SEND_BUFFER_PRE_PADDING, len);
@@ -568,7 +569,7 @@
if (pollfd->revents & (POLLERR | POLLHUP)) {
- debug("Session Socket %p (fd=%d) dead\n",
+ fprintf(stderr, "Session Socket %p (fd=%d) dead\n",
(void *)wsi, pollfd->fd);
libwebsocket_close_and_free_session(this, wsi);
@@ -582,11 +583,11 @@
pollfd->events &= ~POLLOUT;
/* external POLL support via protocol 0 */
- this->protocols[0].callback(wsi,
+ this->protocols[0].callback(this, wsi,
LWS_CALLBACK_CLEAR_MODE_POLL_FD,
(void *)(long)wsi->sock, NULL, POLLOUT);
- wsi->protocol->callback(wsi,
+ wsi->protocol->callback(this, wsi,
LWS_CALLBACK_CLIENT_WRITEABLE,
wsi->user_space,
NULL, 0);
@@ -713,7 +714,7 @@
if (n == 0) /* poll timeout */
return 0;
- if (n < 0 || this->fds[0].revents & (POLLERR | POLLHUP)) {
+ if (n < 0) {
/*
fprintf(stderr, "Listen Socket dead\n");
*/
@@ -738,9 +739,9 @@
*/
int
-libwebsocket_callback_on_writable(struct libwebsocket *wsi)
+libwebsocket_callback_on_writable(struct libwebsocket_context *this,
+ struct libwebsocket *wsi)
{
- struct libwebsocket_context *this = wsi->protocol->owning_server;
int n;
for (n = 0; n < this->fds_count; n++)
@@ -750,7 +751,7 @@
}
/* external POLL support via protocol 0 */
- this->protocols[0].callback(wsi,
+ this->protocols[0].callback(this, wsi,
LWS_CALLBACK_SET_MODE_POLL_FD,
(void *)(long)wsi->sock, NULL, POLLOUT);
@@ -782,7 +783,7 @@
wsi = this->fd_hashtable[n].wsi[m];
if (wsi->protocol == protocol)
- libwebsocket_callback_on_writable(wsi);
+ libwebsocket_callback_on_writable(this, wsi);
}
}
@@ -833,12 +834,12 @@
if (enable)
/* external POLL support via protocol 0 */
- this->protocols[0].callback(wsi,
+ this->protocols[0].callback(this, wsi,
LWS_CALLBACK_SET_MODE_POLL_FD,
(void *)(long)wsi->sock, NULL, POLLIN);
else
/* external POLL support via protocol 0 */
- this->protocols[0].callback(wsi,
+ this->protocols[0].callback(this, wsi,
LWS_CALLBACK_CLEAR_MODE_POLL_FD,
(void *)(long)wsi->sock, NULL, POLLIN);
@@ -1154,7 +1155,7 @@
this->fds[this->fds_count++].events = POLLIN;
/* external POLL support via protocol 0 */
- this->protocols[0].callback(wsi,
+ this->protocols[0].callback(this, wsi,
LWS_CALLBACK_ADD_POLL_FD,
(void *)(long)sockfd, NULL, POLLIN);
@@ -1232,7 +1233,7 @@
this->fds_count++;
/* external POLL support via protocol 0 */
- this->protocols[0].callback(wsi,
+ this->protocols[0].callback(this, wsi,
LWS_CALLBACK_ADD_POLL_FD,
(void *)(long)fd, NULL, POLLIN);
}
@@ -1395,7 +1396,7 @@
if (wsi->protocol != protocol)
continue;
- wsi->protocol->callback(wsi,
+ wsi->protocol->callback(this, wsi,
LWS_CALLBACK_BROADCAST,
wsi->user_space,
buf, len);