diff --git a/repos/libports/run/fetchurl.run b/repos/libports/run/fetchurl.run new file mode 100644 index 0000000000..38a5ea3db0 --- /dev/null +++ b/repos/libports/run/fetchurl.run @@ -0,0 +1,87 @@ +# +# \brief Test of 'fetchurl +# \author Emery Hemingway +# \date 2016-06-05 +# + +set build_components { + core init + app/fetchurl + drivers/nic + drivers/timer +} + +source ${genode_dir}/repos/base/run/platform_drv.inc +append_platform_drv_build_components + +build $build_components + +create_boot_directory + +append config { + + + + + + + + + + + + + + + + } + +append_platform_drv_config + +append config { + + + + + + + + + + + + + + + + + +} + +install_config $config + +# generic modules +set boot_modules { + core init ld.lib.so + curl.lib.so + fetchurl + libc.lib.so + libc.lib.so + libcrypto.lib.so + libm.lib.so + libssh.lib.so + libssl.lib.so + lwip.lib.so + nic_drv + timer + zlib.lib.so +} + +# platform-specific modules +append_platform_drv_boot_modules + +build_boot_image $boot_modules + +append qemu_args " -nographic -net nic,model=e1000 -net user" + +run_genode_until {child "fetchurl" exited with exit value 0} 120 diff --git a/repos/libports/src/app/fetchurl/README b/repos/libports/src/app/fetchurl/README new file mode 100644 index 0000000000..740bcf88e4 --- /dev/null +++ b/repos/libports/src/app/fetchurl/README @@ -0,0 +1,18 @@ +A small frontend to the libcURL library. + +Configuration +------------- + +! +! +! +! +! +! +! +! + +Optionally, you can use a proxy: + +! url; + Genode::Path<256> path; + CURLcode res = CURLE_OK; + + curl_global_init(CURL_GLOBAL_DEFAULT); + + Genode::Xml_node config_node = config.xml(); + + bool verbose = config_node.attribute_value("verbose", false); + + config_node.for_each_sub_node("fetch", [&] (Genode::Xml_node node) { + + if (res != CURLE_OK) return; + try { + node.attribute("url").value(&url); + node.attribute("path").value(path.base(), path.capacity()); + } catch (...) { Genode::error("error reading 'fetch' node"); return; } + + char const *out_path = path.base(); + + int fd = open(out_path, O_CREAT | O_RDWR); + if (fd == -1) { + switch (errno) { + case EACCES: + Genode::error("permission denied at ", out_path); break; + case EEXIST: + Genode::error(out_path, " already exists"); break; + case EISDIR: + Genode::error(out_path, " is a directory"); break; + case ENOSPC: + Genode::error("cannot create ", out_path, ", out of space"); break; + } + env.parent().exit(errno); + return; + } + + CURL *curl = curl_easy_init(); + if (!curl) { + Genode::error("failed to initialize libcurl"); + res = CURLE_FAILED_INIT; + return; + } + + Stats stats(timer, url.string()); + + curl_easy_setopt(curl, CURLOPT_URL, url.string()); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); + + curl_easy_setopt(curl, CURLOPT_VERBOSE, verbose); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, true); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &fd); + + curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback); + curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &stats); + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L); + + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); + + /* check for optional proxy configuration */ + try { + Genode::String<256> proxy; + node.attribute("proxy").value(&proxy); + curl_easy_setopt(curl, CURLOPT_PROXY, proxy.string()); + } catch (...) { } + + Libc::with_libc([&]() { + res = curl_easy_perform(curl); + close(fd); + + if (res != CURLE_OK) + Genode::error(curl_easy_strerror(res)); + + curl_easy_cleanup(curl); + }); + }); + + curl_global_cleanup(); + + Genode::warning("SSL certificates not verified"); + + env.parent().exit(res ^ CURLE_OK); +} + diff --git a/repos/libports/src/app/fetchurl/target.mk b/repos/libports/src/app/fetchurl/target.mk new file mode 100644 index 0000000000..cce4d49d24 --- /dev/null +++ b/repos/libports/src/app/fetchurl/target.mk @@ -0,0 +1,3 @@ +TARGET = fetchurl +LIBS += curl lwip libc_lwip libc_lwip_nic_dhcp libc +SRC_CC = component.cc \ No newline at end of file