[libvirt] [PATCH 10/10] Check and handle select() errors from waitsocket().
Daniel P. Berrange
berrange at redhat.com
Thu Jan 3 19:39:47 UTC 2013
On Thu, Jan 03, 2013 at 02:16:22PM -0500, John Ferlan wrote:
> ---
> src/phyp/phyp_driver.c | 42 ++++++++++++++++++++++++++++++++----------
> 1 file changed, 32 insertions(+), 10 deletions(-)
>
> diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
> index 8e26b0c..2dabd19 100644
> --- a/src/phyp/phyp_driver.c
> +++ b/src/phyp/phyp_driver.c
> @@ -76,7 +76,6 @@ static int
> waitsocket(int socket_fd, LIBSSH2_SESSION * session)
> {
> struct timeval timeout;
> - int rc;
> fd_set fd;
> fd_set *writefd = NULL;
> fd_set *readfd = NULL;
> @@ -98,9 +97,7 @@ waitsocket(int socket_fd, LIBSSH2_SESSION * session)
> if (dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)
> writefd = &fd;
>
> - rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);
> -
> - return rc;
> + return select(socket_fd + 1, readfd, writefd, NULL, &timeout);
> }
>
> /* this function is the layer that manipulates the ssh channel itself
> @@ -131,7 +128,11 @@ phypExec(LIBSSH2_SESSION *session, const char *cmd, int *exit_status,
> while ((channel = libssh2_channel_open_session(session)) == NULL &&
> libssh2_session_last_error(session, NULL, NULL, 0) ==
> LIBSSH2_ERROR_EAGAIN) {
> - waitsocket(sock, session);
> + if (waitsocket(sock, session) < 0 && errno != EINTR) {
> + virReportSystemError(errno, "%s",
> + _("unable to wait on libssh2 socket"));
> + goto err;
> + }
> }
>
> if (channel == NULL) {
> @@ -140,7 +141,11 @@ phypExec(LIBSSH2_SESSION *session, const char *cmd, int *exit_status,
>
> while ((rc = libssh2_channel_exec(channel, cmd)) ==
> LIBSSH2_ERROR_EAGAIN) {
> - waitsocket(sock, session);
> + if (waitsocket(sock, session) < 0 && errno != EINTR) {
> + virReportSystemError(errno, "%s",
> + _("unable to wait on libssh2 socket"));
> + goto err;
> + }
> }
>
> if (rc != 0) {
> @@ -161,7 +166,11 @@ phypExec(LIBSSH2_SESSION *session, const char *cmd, int *exit_status,
> /* this is due to blocking that would occur otherwise so we loop on
> * this condition */
> if (rc == LIBSSH2_ERROR_EAGAIN) {
> - waitsocket(sock, session);
> + if (waitsocket(sock, session) < 0 && errno != EINTR) {
> + virReportSystemError(errno, "%s",
> + _("unable to wait on libssh2 socket"));
> + goto err;
> + }
> } else {
> break;
> }
> @@ -170,7 +179,11 @@ phypExec(LIBSSH2_SESSION *session, const char *cmd, int *exit_status,
> exitcode = 127;
>
> while ((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) {
> - waitsocket(sock, session);
> + if (waitsocket(sock, session) < 0 && errno != EINTR) {
> + virReportSystemError(errno, "%s",
> + _("unable to wait on libssh2 socket"));
> + goto err;
> + }
> }
>
> if (rc == 0) {
> @@ -735,7 +748,11 @@ phypUUIDTable_Pull(virConnectPtr conn)
> LIBSSH2_ERROR_EAGAIN) {
> goto err;
> } else {
> - waitsocket(sock, session);
> + if (waitsocket(sock, session) < 0 && errno != EINTR) {
> + virReportSystemError(errno, "%s",
> + _("unable to wait on libssh2 socket"));
> + goto err;
> + }
> }
> }
> } while (!channel);
> @@ -769,7 +786,12 @@ phypUUIDTable_Pull(virConnectPtr conn)
> /* this is due to blocking that would occur otherwise
> * so we loop on this condition */
>
> - waitsocket(sock, session); /* now we wait */
> + /* now we wait */
> + if (waitsocket(sock, session) < 0 && errno != EINTR) {
> + virReportSystemError(errno, "%s",
> + _("unable to wait on libssh2 socket"));
> + goto err;
> + }
> continue;
> }
> break;
ACK
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list