Re: [libvirt] [PATCH v2] remote: Print ssh stderr on connection failure

2010-02-19 Thread Cole Robinson
On 02/18/2010 03:56 PM, Daniel Veillard wrote:
> On Thu, Feb 18, 2010 at 10:56:47AM -0500, Cole Robinson wrote:
>>
>> Signed-off-by: Cole Robinson 
>> ---
>>  src/remote/remote_driver.c |   38 +++---
>>  1 files changed, 35 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
>> index 13534ce..8914c39 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 errfd;/* File handle 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 errfd[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,22 @@ doRemoteOpen (virConnectPtr conn,
>>  goto failed;
>>  }
>>  
>> +if (pipe(errfd) == -1) {
>> +virReportSystemError(errno, "%s",
>> + _("unable to create socket pair"));
>> +goto failed;
>> +}
>> +
>>  if (virExec((const char**)cmd_argv, NULL, NULL,
>> -&pid, sv[1], &(sv[1]), NULL,
>> +&pid, sv[1], &(sv[1]), &(errfd[1]),
>>  VIR_EXEC_CLEAR_CAPS) < 0)
>>  goto failed;
>>  
>>  /* Parent continues here. */
>>  close (sv[1]);
>> +close (errfd[1]);
>>  priv->sock = sv[0];
>> +priv->errfd = errfd[0];
>>  priv->pid = pid;
>>  
>>  /* Do not set 'is_secure' flag since we can't guarentee
>> @@ -827,6 +837,12 @@ doRemoteOpen (virConnectPtr conn,
>>  goto failed;
>>  }
>>  
>> +if ((priv->errfd != -1) && virSetNonBlock(priv->errfd) < 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 +955,9 @@ doRemoteOpen (virConnectPtr conn,
>>  
>>   failed:
>>  /* Close the socket if we failed. */
>> +if (priv->errfd >= 0)
>> +close(priv->errfd);
>> +
>>  if (priv->sock >= 0) {
>>  if (priv->uses_tls && priv->session) {
>>  gnutls_bye (priv->session, GNUTLS_SHUT_RDWR);
>> @@ -986,6 +1005,7 @@ remoteAllocPrivateData(virConnectPtr conn)
>>  priv->localUses = 1;
>>  priv->watch = -1;
>>  priv->sock = -1;
>> +priv->errfd = -1;
>>  
>>  return priv;
>>  }
>> @@ -1408,6 +1428,7 @@ doRemoteClose (virConnectPtr conn, struct private_data 
>> *priv)
>>  sasl_dispose (&priv->saslconn);
>>  #endif
>>  close (priv->sock);
>> +close (priv->errfd);
>>  
>>  #ifndef WIN32
>>  if (priv->pid > 0) {
>> @@ -7785,12 +7806,23 @@ remoteIOReadBuffer(virConnectPtr conn,
>>  if (errno == EWOULDBLOCK)
>>  return 0;
>>  
>> +char errout[1024] = "\0";
>> +if (priv->errfd != -1) {
>> +saferead(priv->errfd, errout, sizeof(errout));
>> +}
>> +
>>  virReportSystemError(errno,
>> - "%s", _("cannot recv data"));
>> + _("cannot recv data: %s"), errout);
>> +
>>  } else {
>> +char errout[1024] = "\0";
>> +if (priv->errfd != -1) {
>> +saferead(priv->errfd, errout, sizeof(errout));
>> +}
>> +
>>  errorf (in_open ? NULL : conn,
>>  VIR_ERR_SYSTEM_ERROR,
>> -"%s", _("server closed connection"));
>> +_("server closed connection: %s"), errout);
>>  }
>>  return -1;
>>  }
> 
>   It would be nice if we could have a function to read and allocate from
> an fd instead of a static stack allocation, but it's not urgent,
> 
>   ACK,
> 

Thanks, pushed now.

- Cole

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2] remote: Print ssh stderr on connection failure

2010-02-18 Thread Daniel Veillard
On Thu, Feb 18, 2010 at 10:56:47AM -0500, Cole Robinson wrote:
> 
> Signed-off-by: Cole Robinson 
> ---
>  src/remote/remote_driver.c |   38 +++---
>  1 files changed, 35 insertions(+), 3 deletions(-)
> 
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index 13534ce..8914c39 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 errfd;/* File handle 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 errfd[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,22 @@ doRemoteOpen (virConnectPtr conn,
>  goto failed;
>  }
>  
> +if (pipe(errfd) == -1) {
> +virReportSystemError(errno, "%s",
> + _("unable to create socket pair"));
> +goto failed;
> +}
> +
>  if (virExec((const char**)cmd_argv, NULL, NULL,
> -&pid, sv[1], &(sv[1]), NULL,
> +&pid, sv[1], &(sv[1]), &(errfd[1]),
>  VIR_EXEC_CLEAR_CAPS) < 0)
>  goto failed;
>  
>  /* Parent continues here. */
>  close (sv[1]);
> +close (errfd[1]);
>  priv->sock = sv[0];
> +priv->errfd = errfd[0];
>  priv->pid = pid;
>  
>  /* Do not set 'is_secure' flag since we can't guarentee
> @@ -827,6 +837,12 @@ doRemoteOpen (virConnectPtr conn,
>  goto failed;
>  }
>  
> +if ((priv->errfd != -1) && virSetNonBlock(priv->errfd) < 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 +955,9 @@ doRemoteOpen (virConnectPtr conn,
>  
>   failed:
>  /* Close the socket if we failed. */
> +if (priv->errfd >= 0)
> +close(priv->errfd);
> +
>  if (priv->sock >= 0) {
>  if (priv->uses_tls && priv->session) {
>  gnutls_bye (priv->session, GNUTLS_SHUT_RDWR);
> @@ -986,6 +1005,7 @@ remoteAllocPrivateData(virConnectPtr conn)
>  priv->localUses = 1;
>  priv->watch = -1;
>  priv->sock = -1;
> +priv->errfd = -1;
>  
>  return priv;
>  }
> @@ -1408,6 +1428,7 @@ doRemoteClose (virConnectPtr conn, struct private_data 
> *priv)
>  sasl_dispose (&priv->saslconn);
>  #endif
>  close (priv->sock);
> +close (priv->errfd);
>  
>  #ifndef WIN32
>  if (priv->pid > 0) {
> @@ -7785,12 +7806,23 @@ remoteIOReadBuffer(virConnectPtr conn,
>  if (errno == EWOULDBLOCK)
>  return 0;
>  
> +char errout[1024] = "\0";
> +if (priv->errfd != -1) {
> +saferead(priv->errfd, errout, sizeof(errout));
> +}
> +
>  virReportSystemError(errno,
> - "%s", _("cannot recv data"));
> + _("cannot recv data: %s"), errout);
> +
>  } else {
> +char errout[1024] = "\0";
> +if (priv->errfd != -1) {
> +saferead(priv->errfd, errout, sizeof(errout));
> +}
> +
>  errorf (in_open ? NULL : conn,
>  VIR_ERR_SYSTEM_ERROR,
> -"%s", _("server closed connection"));
> +_("server closed connection: %s"), errout);
>  }
>  return -1;
>  }

  It would be nice if we could have a function to read and allocate from
an fd instead of a static stack allocation, but it's not urgent,

  ACK,

Daniel

-- 
Daniel Veillard  | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
dan...@veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2] remote: Print ssh stderr on connection failure

2010-02-18 Thread Cole Robinson

Signed-off-by: Cole Robinson 
---
 src/remote/remote_driver.c |   38 +++---
 1 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 13534ce..8914c39 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 errfd;/* File handle 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 errfd[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,22 @@ doRemoteOpen (virConnectPtr conn,
 goto failed;
 }
 
+if (pipe(errfd) == -1) {
+virReportSystemError(errno, "%s",
+ _("unable to create socket pair"));
+goto failed;
+}
+
 if (virExec((const char**)cmd_argv, NULL, NULL,
-&pid, sv[1], &(sv[1]), NULL,
+&pid, sv[1], &(sv[1]), &(errfd[1]),
 VIR_EXEC_CLEAR_CAPS) < 0)
 goto failed;
 
 /* Parent continues here. */
 close (sv[1]);
+close (errfd[1]);
 priv->sock = sv[0];
+priv->errfd = errfd[0];
 priv->pid = pid;
 
 /* Do not set 'is_secure' flag since we can't guarentee
@@ -827,6 +837,12 @@ doRemoteOpen (virConnectPtr conn,
 goto failed;
 }
 
+if ((priv->errfd != -1) && virSetNonBlock(priv->errfd) < 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 +955,9 @@ doRemoteOpen (virConnectPtr conn,
 
  failed:
 /* Close the socket if we failed. */
+if (priv->errfd >= 0)
+close(priv->errfd);
+
 if (priv->sock >= 0) {
 if (priv->uses_tls && priv->session) {
 gnutls_bye (priv->session, GNUTLS_SHUT_RDWR);
@@ -986,6 +1005,7 @@ remoteAllocPrivateData(virConnectPtr conn)
 priv->localUses = 1;
 priv->watch = -1;
 priv->sock = -1;
+priv->errfd = -1;
 
 return priv;
 }
@@ -1408,6 +1428,7 @@ doRemoteClose (virConnectPtr conn, struct private_data 
*priv)
 sasl_dispose (&priv->saslconn);
 #endif
 close (priv->sock);
+close (priv->errfd);
 
 #ifndef WIN32
 if (priv->pid > 0) {
@@ -7785,12 +7806,23 @@ remoteIOReadBuffer(virConnectPtr conn,
 if (errno == EWOULDBLOCK)
 return 0;
 
+char errout[1024] = "\0";
+if (priv->errfd != -1) {
+saferead(priv->errfd, errout, sizeof(errout));
+}
+
 virReportSystemError(errno,
- "%s", _("cannot recv data"));
+ _("cannot recv data: %s"), errout);
+
 } else {
+char errout[1024] = "\0";
+if (priv->errfd != -1) {
+saferead(priv->errfd, errout, sizeof(errout));
+}
+
 errorf (in_open ? NULL : conn,
 VIR_ERR_SYSTEM_ERROR,
-"%s", _("server closed connection"));
+_("server closed connection: %s"), errout);
 }
 return -1;
 }
-- 
1.6.5.2

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list