mirror of https://gitee.com/openkylin/libvirt.git
virStream*All: Report error if a callback fails
All of these four functions (virStreamRecvAll, virStreamSendAll, virStreamSparseRecvAll, virStreamSparseSendAll) take one or more callback functions that handle various aspects of streams. However, if any of them fails no error is reported therefore caller does not know what went wrong. At the same time, we silently presumed callbacks to set errno on failure. With this change we should document it explicitly as the error is not properly reported. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
5b62dacb70
commit
5b16a499f8
|
@ -82,7 +82,10 @@ int virStreamRecvHole(virStreamPtr,
|
|||
* of bytes. The callback will continue to be
|
||||
* invoked until it indicates the end of the source
|
||||
* has been reached by returning 0. A return value
|
||||
* of -1 at any time will abort the send operation
|
||||
* of -1 at any time will abort the send operation.
|
||||
*
|
||||
* Please note that for more accurate error reporting the
|
||||
* callback should set appropriate errno on failure.
|
||||
*
|
||||
* Returns the number of bytes filled, 0 upon end
|
||||
* of file, or -1 upon error
|
||||
|
@ -119,6 +122,9 @@ int virStreamSendAll(virStreamPtr st,
|
|||
* This function should not adjust the current position within
|
||||
* the file.
|
||||
*
|
||||
* Please note that for more accurate error reporting the
|
||||
* callback should set appropriate errno on failure.
|
||||
*
|
||||
* Returns 0 on success,
|
||||
* -1 upon error
|
||||
*/
|
||||
|
@ -142,6 +148,9 @@ typedef int (*virStreamSourceHoleFunc)(virStreamPtr st,
|
|||
* processing the hole in the stream source and then return.
|
||||
* A return value of -1 at any time will abort the send operation.
|
||||
*
|
||||
* Please note that for more accurate error reporting the
|
||||
* callback should set appropriate errno on failure.
|
||||
*
|
||||
* Returns 0 on success,
|
||||
* -1 upon error.
|
||||
*/
|
||||
|
@ -176,6 +185,9 @@ int virStreamSparseSendAll(virStreamPtr st,
|
|||
* has been reached. A return value of -1 at any time
|
||||
* will abort the receive operation
|
||||
*
|
||||
* Please note that for more accurate error reporting the
|
||||
* callback should set appropriate errno on failure.
|
||||
*
|
||||
* Returns the number of bytes consumed or -1 upon
|
||||
* error
|
||||
*/
|
||||
|
@ -203,6 +215,9 @@ int virStreamRecvAll(virStreamPtr st,
|
|||
* hole in the stream target and then return. A return value of
|
||||
* -1 at any time will abort the receive operation.
|
||||
*
|
||||
* Please note that for more accurate error reporting the
|
||||
* callback should set appropriate errno on failure.
|
||||
*
|
||||
* Returns 0 on success,
|
||||
* -1 upon error
|
||||
*/
|
||||
|
|
|
@ -569,7 +569,7 @@ virStreamInData(virStreamPtr stream,
|
|||
*
|
||||
* Returns -1 upon any error, with virStreamAbort() already
|
||||
* having been called, so the caller need only call
|
||||
* virStreamFree()
|
||||
* virStreamFree().
|
||||
*/
|
||||
int
|
||||
virStreamSendAll(virStreamPtr stream,
|
||||
|
@ -595,11 +595,17 @@ virStreamSendAll(virStreamPtr stream,
|
|||
if (VIR_ALLOC_N(bytes, want) < 0)
|
||||
goto cleanup;
|
||||
|
||||
errno = 0;
|
||||
for (;;) {
|
||||
int got, offset = 0;
|
||||
|
||||
got = (handler)(stream, bytes, want, opaque);
|
||||
if (got < 0)
|
||||
if (got < 0) {
|
||||
if (errno == 0)
|
||||
errno = EIO;
|
||||
virReportSystemError(errno, "%s", _("send handler failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
if (got == 0)
|
||||
break;
|
||||
while (offset < got) {
|
||||
|
@ -728,6 +734,7 @@ int virStreamSparseSendAll(virStreamPtr stream,
|
|||
if (VIR_ALLOC_N(bytes, bufLen) < 0)
|
||||
goto cleanup;
|
||||
|
||||
errno = 0;
|
||||
for (;;) {
|
||||
int inData, got, offset = 0;
|
||||
long long sectionLen;
|
||||
|
@ -735,16 +742,22 @@ int virStreamSparseSendAll(virStreamPtr stream,
|
|||
const unsigned int skipFlags = 0;
|
||||
|
||||
if (!dataLen) {
|
||||
if (holeHandler(stream, &inData, §ionLen, opaque) < 0)
|
||||
if (holeHandler(stream, &inData, §ionLen, opaque) < 0) {
|
||||
if (errno == 0)
|
||||
errno = EIO;
|
||||
virReportSystemError(errno, "%s", _("send holeHandler failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!inData && sectionLen) {
|
||||
if (virStreamSendHole(stream, sectionLen, skipFlags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (skipHandler(stream, sectionLen, opaque) < 0) {
|
||||
if (errno == 0)
|
||||
errno = EIO;
|
||||
virReportSystemError(errno, "%s",
|
||||
_("unable to skip hole"));
|
||||
_("send skipHandler failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
continue;
|
||||
|
@ -757,8 +770,13 @@ int virStreamSparseSendAll(virStreamPtr stream,
|
|||
want = dataLen;
|
||||
|
||||
got = (handler)(stream, bytes, want, opaque);
|
||||
if (got < 0)
|
||||
if (got < 0) {
|
||||
if (errno == 0)
|
||||
errno = EIO;
|
||||
virReportSystemError(errno, "%s",
|
||||
_("send handler failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
if (got == 0)
|
||||
break;
|
||||
while (offset < got) {
|
||||
|
@ -854,8 +872,10 @@ virStreamRecvAll(virStreamPtr stream,
|
|||
if (VIR_ALLOC_N(bytes, want) < 0)
|
||||
goto cleanup;
|
||||
|
||||
errno = 0;
|
||||
for (;;) {
|
||||
int got, offset = 0;
|
||||
|
||||
got = virStreamRecv(stream, bytes, want);
|
||||
if (got < 0)
|
||||
goto cleanup;
|
||||
|
@ -864,8 +884,13 @@ virStreamRecvAll(virStreamPtr stream,
|
|||
while (offset < got) {
|
||||
int done;
|
||||
done = (handler)(stream, bytes + offset, got - offset, opaque);
|
||||
if (done < 0)
|
||||
if (done < 0) {
|
||||
if (errno == 0)
|
||||
errno = EIO;
|
||||
virReportSystemError(errno, "%s",
|
||||
_("recv handler failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
offset += done;
|
||||
}
|
||||
}
|
||||
|
@ -968,6 +993,7 @@ virStreamSparseRecvAll(virStreamPtr stream,
|
|||
if (VIR_ALLOC_N(bytes, want) < 0)
|
||||
goto cleanup;
|
||||
|
||||
errno = 0;
|
||||
for (;;) {
|
||||
int got, offset = 0;
|
||||
long long holeLen;
|
||||
|
@ -978,8 +1004,12 @@ virStreamSparseRecvAll(virStreamPtr stream,
|
|||
if (virStreamRecvHole(stream, &holeLen, holeFlags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (holeHandler(stream, holeLen, opaque) < 0)
|
||||
if (holeHandler(stream, holeLen, opaque) < 0) {
|
||||
if (errno == 0)
|
||||
errno = EIO;
|
||||
virReportSystemError(errno, "%s", _("recv holeHandler failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
continue;
|
||||
} else if (got < 0) {
|
||||
goto cleanup;
|
||||
|
@ -989,8 +1019,12 @@ virStreamSparseRecvAll(virStreamPtr stream,
|
|||
while (offset < got) {
|
||||
int done;
|
||||
done = (handler)(stream, bytes + offset, got - offset, opaque);
|
||||
if (done < 0)
|
||||
if (done < 0) {
|
||||
if (errno == 0)
|
||||
errno = EIO;
|
||||
virReportSystemError(errno, "%s", _("recv handler failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
offset += done;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue