diff options
Diffstat (limited to 'hscript/util.cc')
-rw-r--r-- | hscript/util.cc | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/hscript/util.cc b/hscript/util.cc new file mode 100644 index 0000000..4a991c5 --- /dev/null +++ b/hscript/util.cc @@ -0,0 +1,61 @@ +/* + * util.cc - Implementation of useful utility routines + * libhscript, the HorizonScript library for + * Project Horizon + * + * Copyright (c) 2019 Adélie Linux and contributors. All rights reserved. + * This code is licensed under the AGPL 3.0 license, as noted in the + * LICENSE-code file in the root directory of this repository. + * + * SPDX-License-Identifier: AGPL-3.0-only + */ + +#include <string> +#ifdef HAVE_LIBCURL +# include <cstdio> /* fopen */ +# include <cstring> /* strerror */ +# include <curl/curl.h> /* curl_* */ +# include <errno.h> /* errno */ +#endif /* HAVE_LIBCURL */ +#include "util/output.hh" + +#ifdef HAVE_LIBCURL +bool download_file(const std::string &url, const std::string &path) { + CURL *curl = curl_easy_init(); + CURLcode result; + bool return_code = false; + char errbuf[CURL_ERROR_SIZE]; + FILE *fp; + + if(curl == nullptr) { + output_error("internal", "trouble initialising cURL library"); + return false; + } + + fp = fopen(path.c_str(), "w"); + if(fp == nullptr) { + output_error("internal", "couldn't open " + path + " for writing", + strerror(errno)); + curl_easy_cleanup(curl); + return false; + } + + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); + + result = curl_easy_perform(curl); + if(result == CURLE_OK) { + return_code = true; + } else { + output_error("curl", "couldn't download file", errbuf); + } + curl_easy_cleanup(curl); + return return_code; +} +#else /* !HAVE_LIBCURL */ +bool download_file(const std::string &url, const std::string &path) { + output_error("internal", "can't download without linking to cURL"); + return false; +} +#endif /* HAVE_LIBCURL */ |