summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorMasahisa Kojima <[email protected]>2023-11-10 13:25:35 +0900
committerIlias Apalodimas <[email protected]>2023-11-18 10:08:08 +0200
commit8cf18da1a971dbfe121c1fc1836bb4af942d06dc (patch)
tree256a204decb4fa30ee039ba73401fd7481369c95 /net
parent04592adbdb997081acccdd7191a9bd661a791d91 (diff)
net: wget: add wget with dns utility function
Current wget takes the target uri in this format: "<http server ip>:<file path>" e.g.) 192.168.1.1:/bar The http server ip address must be resolved before calling wget. This commit adds the utility function runs wget with dhs. User can call wget with the uri like "http://foo/bar". Signed-off-by: Masahisa Kojima <[email protected]> Reviewed-by: Ilias Apalodimas <[email protected]> Reviewed-by: Ramon Fried <[email protected]> Reviewed-by: Simon Glass <[email protected]> Signed-off-by: Ilias Apalodimas <[email protected]>
Diffstat (limited to 'net')
-rw-r--r--net/wget.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/net/wget.c b/net/wget.c
index 6f97eb1d125..2087146b377 100644
--- a/net/wget.c
+++ b/net/wget.c
@@ -15,6 +15,7 @@
#include <net.h>
#include <net/tcp.h>
#include <net/wget.h>
+#include <stdlib.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -512,3 +513,56 @@ void wget_start(void)
wget_send(TCP_SYN, 0, 0, 0);
}
+
+#if (IS_ENABLED(CONFIG_CMD_DNS))
+int wget_with_dns(ulong dst_addr, char *uri)
+{
+ int ret;
+ char *s, *host_name, *file_name, *str_copy;
+
+ /*
+ * Download file using wget.
+ *
+ * U-Boot wget takes the target uri in this format.
+ * "<http server ip>:<file path>" e.g.) 192.168.1.1:/sample/test.iso
+ * Need to resolve the http server ip address before starting wget.
+ */
+ str_copy = strdup(uri);
+ if (!str_copy)
+ return -ENOMEM;
+
+ s = str_copy + strlen("http://");
+ host_name = strsep(&s, "/");
+ if (!s) {
+ log_err("Error: invalied uri, no file path\n");
+ ret = -EINVAL;
+ goto out;
+ }
+ file_name = s;
+
+ /* TODO: If the given uri has ip address for the http server, skip dns */
+ net_dns_resolve = host_name;
+ net_dns_env_var = "httpserverip";
+ if (net_loop(DNS) < 0) {
+ log_err("Error: dns lookup of %s failed, check setup\n", net_dns_resolve);
+ ret = -EINVAL;
+ goto out;
+ }
+ s = env_get("httpserverip");
+ if (!s) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ strlcpy(net_boot_file_name, s, sizeof(net_boot_file_name));
+ strlcat(net_boot_file_name, ":/", sizeof(net_boot_file_name)); /* append '/' which is removed by strsep() */
+ strlcat(net_boot_file_name, file_name, sizeof(net_boot_file_name));
+ image_load_addr = dst_addr;
+ ret = net_loop(WGET);
+
+out:
+ free(str_copy);
+
+ return ret;
+}
+#endif