[libvirt] [PATCH 3/4] remote: Print ssh stderr on connection failure
Cole Robinson
crobinso at redhat.com
Thu Feb 18 15:57:26 UTC 2010
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
More information about the libvir-list
mailing list