mrc0mmand / rpms / libguestfs

Forked from rpms/libguestfs 3 years ago
Clone
Blob Blame History Raw
From 6440601758720bd1390e768a8f26f313d7bb4ca9 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 7 Jun 2016 14:50:47 +0100
Subject: [PATCH] p2v: Print full curl error when failing to fetch SSH identify
 URL (RHBZ#1343423).

(cherry picked from commit 0e0a350c02b9c4d7a4108d2743ee1a61ce88a1f1)
---
 p2v/ssh.c | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/p2v/ssh.c b/p2v/ssh.c
index c4d7e2e..ce2b17b 100644
--- a/p2v/ssh.c
+++ b/p2v/ssh.c
@@ -45,6 +45,7 @@
 #include <inttypes.h>
 #include <unistd.h>
 #include <errno.h>
+#include <error.h>
 #include <locale.h>
 #include <assert.h>
 #include <libintl.h>
@@ -168,11 +169,18 @@ static int
 curl_download (const char *url, const char *local_file)
 {
   char curl_config_file[] = "/tmp/curl.XXXXXX";
+  char error_file[] = "/tmp/curlerr.XXXXXX";
+  CLEANUP_FREE char *error_message = NULL;
   int fd, r;
   size_t i, len;
   FILE *fp;
   CLEANUP_FREE char *curl_cmd = NULL;
 
+  fd = mkstemp (error_file);
+  if (fd == -1)
+    error (EXIT_FAILURE, errno, "mkstemp: %s", error_file);
+  close (fd);
+
   /* Use a secure curl config file because escaping is easier. */
   fd = mkstemp (curl_config_file);
   if (fd == -1) {
@@ -201,8 +209,8 @@ curl_download (const char *url, const char *local_file)
   fclose (fp);
 
   /* Run curl to download the URL to a file. */
-  if (asprintf (&curl_cmd, "curl -f -o %s -K %s",
-                local_file, curl_config_file) == -1) {
+  if (asprintf (&curl_cmd, "curl -f -s -S -o %s -K %s 2>%s",
+                local_file, curl_config_file, error_file) == -1) {
     perror ("asprintf");
     exit (EXIT_FAILURE);
   }
@@ -216,17 +224,20 @@ curl_download (const char *url, const char *local_file)
 
   /* Did curl subprocess fail? */
   if (WIFEXITED (r) && WEXITSTATUS (r) != 0) {
-    /* XXX Better error handling.  The codes can be looked up in
-     * the curl(1) man page.
-     */
-    set_ssh_error ("%s: curl error %d", url, WEXITSTATUS (r));
+    if (read_whole_file (error_file, &error_message, NULL) == 0)
+      set_ssh_error ("%s: %s", url, error_message);
+    else
+      set_ssh_error ("%s: curl error %d", url, WEXITSTATUS (r));
+    unlink (error_file);
     return -1;
   }
   else if (!WIFEXITED (r)) {
     set_ssh_error ("curl subprocess got a signal (%d)", r);
+    unlink (error_file);
     return -1;
   }
 
+  unlink (error_file);
   return 0;
 }
 
-- 
2.7.4