int errfd;
bool client;
bool ownsFd;
+ bool quietEOF;
/* Event callback fields */
virNetSocketIOFunc func;
_("Cannot recv data"));
ret = -1;
} else if (ret == 0) {
- if (errout)
- virReportSystemError(EIO,
- _("End of file while reading data: %s"), errout);
- else
- virReportSystemError(EIO, "%s",
- _("End of file while reading data"));
- ret = -1;
+ if (sock->quietEOF) {
+ VIR_DEBUG("socket='%p' EOF while reading: errout='%s'",
+ socket, NULLSTR(errout));
+
+ ret = -2;
+ } else {
+ if (errout)
+ virReportSystemError(EIO,
+ _("End of file while reading data: %s"),
+ errout);
+ else
+ virReportSystemError(EIO, "%s",
+ _("End of file while reading data"));
+
+ ret = -1;
+ }
}
VIR_FREE(errout);
virObjectUnlock(sock);
}
+
+
+/**
+ * virNetSocketSetQuietEOF:
+ * @sock: socket object pointer
+ *
+ * Disables reporting I/O errors as a virError when @socket is closed while
+ * reading data.
+ */
+void
+virNetSocketSetQuietEOF(virNetSocketPtr sock)
+{
+ sock->quietEOF = true;
+}
int virNetSocketSetBlocking(virNetSocketPtr sock,
bool blocking);
+void virNetSocketSetQuietEOF(virNetSocketPtr sock);
+
ssize_t virNetSocketRead(virNetSocketPtr sock, char *buf, size_t len);
ssize_t virNetSocketWrite(virNetSocketPtr sock, const char *buf, size_t len);