int ret;
virNetMessagePtr msg;
virNetMessageError rerr;
+ virErrorPtr origErr = virSaveLastError();
memset(&rerr, 0, sizeof(rerr));
stream->closed = true;
virStreamEventRemoveCallback(stream->st);
virStreamAbort(stream->st);
- if (events & VIR_STREAM_EVENT_HANGUP)
- virReportError(VIR_ERR_RPC,
- "%s", _("stream had unexpected termination"));
- else
- virReportError(VIR_ERR_RPC,
- "%s", _("stream had I/O failure"));
+ if (origErr && origErr->code != VIR_ERR_OK) {
+ virSetError(origErr);
+ virFreeError(origErr);
+ } else {
+ if (events & VIR_STREAM_EVENT_HANGUP)
+ virReportError(VIR_ERR_RPC,
+ "%s", _("stream had unexpected termination"));
+ else
+ virReportError(VIR_ERR_RPC,
+ "%s", _("stream had I/O failure"));
+ }
msg = virNetMessageNew(false);
if (!msg) {
/* Thread data */
virThreadPtr thread;
virCond threadCond;
- int threadErr;
+ virErrorPtr threadErr;
bool threadQuit;
bool threadAbort;
bool threadDoRead;
virFDStreamDataPtr fdst = obj;
VIR_DEBUG("obj=%p", fdst);
+ virFreeError(fdst->threadErr);
virFDStreamMsgQueueFree(&fdst->msg);
}
return;
}
- if (fdst->threadErr)
+ if (fdst->threadErr) {
events |= VIR_STREAM_EVENT_ERROR;
+ virSetError(fdst->threadErr);
+ }
cb = fdst->cb;
cbopaque = fdst->opaque;
return;
error:
- fdst->threadErr = errno;
+ fdst->threadErr = virSaveLastError();
goto cleanup;
}