From 6440601758720bd1390e768a8f26f313d7bb4ca9 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" 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 #include #include +#include #include #include #include @@ -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; } -- 1.8.3.1