Make FileError say what path the problem was with.
[dcpomatic.git] / src / lib / internet.cc
index 615ced7892a9037a4509c71fe1d16a94cda1e6be..e0af49b6698e64c75148ec5ecfddee14e1c75969 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -22,6 +22,7 @@
 #include "compose.hpp"
 #include "exceptions.h"
 #include "cross.h"
+#include "util.h"
 #include <curl/curl.h>
 #include <zip.h>
 #include <boost/function.hpp>
@@ -47,16 +48,19 @@ get_from_url_data (void* buffer, size_t size, size_t nmemb, void* stream)
 }
 
 optional<string>
-get_from_url (string url, bool pasv, ScopedTemporary& temp)
+get_from_url (string url, bool pasv, bool skip_pasv_ip, ScopedTemporary& temp)
 {
        CURL* curl = curl_easy_init ();
        curl_easy_setopt (curl, CURLOPT_URL, url.c_str());
 
-       FILE* f = temp.open ("w");
+       FILE* f = temp.open ("wb");
        curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, get_from_url_data);
        curl_easy_setopt (curl, CURLOPT_WRITEDATA, f);
        curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0);
        curl_easy_setopt (curl, CURLOPT_FTP_USE_EPRT, 0);
+       if (skip_pasv_ip) {
+               curl_easy_setopt (curl, CURLOPT_FTP_SKIP_PASV_IP, 1);
+       }
        if (!pasv) {
                curl_easy_setopt (curl, CURLOPT_FTPPORT, "-");
        }
@@ -76,10 +80,10 @@ get_from_url (string url, bool pasv, ScopedTemporary& temp)
 }
 
 optional<string>
-get_from_url (string url, bool pasv, function<void (boost::filesystem::path)> load)
+get_from_url (string url, bool pasv, bool skip_pasv_ip, function<void (boost::filesystem::path)> load)
 {
        ScopedTemporary temp;
-       optional<string> e = get_from_url (url, pasv, temp);
+       optional<string> e = get_from_url (url, pasv, skip_pasv_ip, temp);
        if (e) {
                return e;
        }
@@ -92,11 +96,11 @@ get_from_url (string url, bool pasv, function<void (boost::filesystem::path)> lo
  *  @param load Function passed a (temporary) filesystem path of the unpacked file.
  */
 optional<string>
-get_from_zip_url (string url, string file, bool pasv, function<void (boost::filesystem::path)> load)
+get_from_zip_url (string url, string file, bool pasv, bool skip_pasv_ip, function<void (boost::filesystem::path)> load)
 {
        /* Download the ZIP file to temp_zip */
        ScopedTemporary temp_zip;
-       optional<string> e = get_from_url (url, pasv, temp_zip);
+       optional<string> e = get_from_url (url, pasv, skip_pasv_ip, temp_zip);
        if (e) {
                return e;
        }
@@ -120,9 +124,10 @@ get_from_zip_url (string url, string file, bool pasv, function<void (boost::file
        }
 
        zip_error_t error;
+       zip_error_init (&error);
        zip_t* zip = zip_open_from_source (zip_source, ZIP_RDONLY, &error);
        if (!zip) {
-               return String::compose (_("Could not open downloaded ZIP file (%1: %2)"), error.sys_err, error.str ? error.str : "");
+               return String::compose (_("Could not open downloaded ZIP file (%1:%2: %3)"), error.zip_err, error.sys_err, error.str ? error.str : "");
        }
 
 #else
@@ -139,7 +144,7 @@ get_from_zip_url (string url, string file, bool pasv, function<void (boost::file
        char buffer[4096];
        while (true) {
                int const N = zip_fread (file_in_zip, buffer, sizeof (buffer));
-               fwrite (buffer, 1, N, f);
+               checked_fwrite (buffer, N, f, temp_cert.file());
                if (N < int (sizeof (buffer))) {
                        break;
                }