{
struct pollfd fds[2];
bool error = false;
+ int closeReason;
int ret;
fds[0].fd = virNetSocketGetFD(client->sock);
}
}
+ if (fds[0].revents & POLLHUP)
+ closeReason = VIR_CONNECT_CLOSE_REASON_EOF;
+ else
+ closeReason = VIR_CONNECT_CLOSE_REASON_ERROR;
+
if (fds[0].revents & POLLOUT) {
if (virNetClientIOHandleOutput(client) < 0) {
- virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
+ virNetClientMarkClose(client, closeReason);
error = true;
/* Fall through to process any pending data. */
}
if (fds[0].revents & POLLIN) {
if (virNetClientIOHandleInput(client) < 0) {
- virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
+ virNetClientMarkClose(client, closeReason);
error = true;
/* Fall through to process any pending data. */
}
if (fds[0].revents & POLLHUP) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("received hangup event on socket"));
- virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_EOF);
+ virNetClientMarkClose(client, closeReason);
goto error;
}
if (fds[0].revents & POLLERR) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("received error event on socket"));
- virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
+ virNetClientMarkClose(client, closeReason);
goto error;
}
}
void *opaque)
{
virNetClientPtr client = opaque;
+ int closeReason;
virObjectLock(client);
VIR_DEBUG("Event fired %p %d", sock, events);
+ if (events & VIR_EVENT_HANDLE_HANGUP)
+ closeReason = VIR_CONNECT_CLOSE_REASON_EOF;
+ else
+ closeReason = VIR_CONNECT_CLOSE_REASON_ERROR;
+
if (events & VIR_EVENT_HANDLE_WRITABLE) {
if (virNetClientIOHandleOutput(client) < 0)
- virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
+ virNetClientMarkClose(client, closeReason);
}
if (events & VIR_EVENT_HANDLE_READABLE) {
if (virNetClientIOHandleInput(client) < 0)
- virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
+ virNetClientMarkClose(client, closeReason);
}
if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) {
VIR_DEBUG("VIR_EVENT_HANDLE_HANGUP or "
"VIR_EVENT_HANDLE_ERROR encountered");
- virNetClientMarkClose(client,
- (events & VIR_EVENT_HANDLE_HANGUP) ?
- VIR_CONNECT_CLOSE_REASON_EOF :
- VIR_CONNECT_CLOSE_REASON_ERROR);
+ virNetClientMarkClose(client, closeReason);
goto done;
}