On 02/18/2010 09:44 AM, Daniel P. Berrange wrote: > On Fri, Feb 12, 2010 at 10:32:16AM -0500, Cole Robinson wrote: >> --- >> src/remote/remote_driver.c | 37 ++++++++++++++++++++++++++++++++++--- >> 1 files changed, 34 insertions(+), 3 deletions(-) >> >> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c >> index 13534ce..7f92fd0 100644 >> --- a/src/remote/remote_driver.c >> +++ b/src/remote/remote_driver.c >> @@ -154,6 +154,7 @@ struct private_data { >> virMutex lock; >> >> int sock; /* Socket. */ >> + int errsock; /* Socket connected to remote stderr */ >> int watch; /* File handle watch */ >> pid_t pid; /* PID of tunnel process */ >> int uses_tls; /* TLS enabled on socket? */ >> @@ -783,6 +784,7 @@ doRemoteOpen (virConnectPtr conn, >> case trans_ext: { >> pid_t pid; >> int sv[2]; >> + int errsock[2]; >> >> /* Fork off the external process. Use socketpair to create a private >> * (unnamed) Unix domain socket to the child process so we don't have >> @@ -794,14 +796,21 @@ doRemoteOpen (virConnectPtr conn, >> goto failed; >> } >> >> + if (socketpair (PF_UNIX, SOCK_STREAM, 0, errsock) == -1) { >> + virReportSystemError(errno, "%s", >> + _("unable to create socket pair")); >> + goto failed; >> + } > > I think you just want pipe() here, since this does not want to > be a bi-directional channel. > >> + >> if (virExec((const char**)cmd_argv, NULL, NULL, >> - &pid, sv[1], &(sv[1]), NULL, >> + &pid, sv[1], &(sv[1]), &(errsock[1]), >> VIR_EXEC_CLEAR_CAPS) < 0) >> goto failed; >> >> /* Parent continues here. */ >> close (sv[1]); >> priv->sock = sv[0]; >> + priv->errsock = errsock[0]; >> priv->pid = pid; >> >> /* Do not set 'is_secure' flag since we can't guarentee >> @@ -827,6 +836,12 @@ doRemoteOpen (virConnectPtr conn, >> goto failed; >> } >> >> + if ((priv->errsock != -1) && virSetNonBlock(priv->errsock) < 0) { >> + virReportSystemError(errno, "%s", >> + _("unable to make socket non-blocking")); >> + goto failed; >> + } >> + >> if (pipe(wakeupFD) < 0) { >> virReportSystemError(errno, "%s", >> _("unable to make pipe")); >> @@ -939,6 +954,9 @@ doRemoteOpen (virConnectPtr conn, >> >> failed: >> /* Close the socket if we failed. */ >> + if (priv->errsock >= 0) >> + close(priv->errsock); >> + >> if (priv->sock >= 0) { >> if (priv->uses_tls && priv->session) { >> gnutls_bye (priv->session, GNUTLS_SHUT_RDWR); >> @@ -986,6 +1004,7 @@ remoteAllocPrivateData(virConnectPtr conn) >> priv->localUses = 1; >> priv->watch = -1; >> priv->sock = -1; >> + priv->errsock = -1; >> >> return priv; >> } >> @@ -1408,6 +1427,7 @@ doRemoteClose (virConnectPtr conn, struct private_data *priv) >> sasl_dispose (&priv->saslconn); >> #endif >> close (priv->sock); >> + close (priv->errsock); >> >> #ifndef WIN32 >> if (priv->pid > 0) { >> @@ -7785,12 +7805,23 @@ remoteIOReadBuffer(virConnectPtr conn, >> if (errno == EWOULDBLOCK) >> return 0; >> >> + char errout[1024] = "\0"; >> + if (priv->errsock) { > > Should be priv->errsock != -1 > >> + recv(priv->errsock, errout, sizeof(errout), 0); >> + } >> + >> virReportSystemError(errno, >> - "%s", _("cannot recv data")); >> + _("cannot recv data: %s"), errout); >> + >> } else { >> + char errout[1024] = "\0"; >> + if (priv->errsock) { > > Likewise here > >> + recv(priv->errsock, errout, sizeof(errout), 0); >> + } >> + >> errorf (in_open ? NULL : conn, >> VIR_ERR_SYSTEM_ERROR, >> - "%s", _("server closed connection")); >> + _("server closed connection: %s"), errout); >> } >> return -1; >> } >> -- > > > Daniel Thanks, I've sent an updated version. - Cole -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list