On Fri, Sep 22, 2023 at 04:11:13PM +0900, Masahisa Kojima wrote: > 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 <masahisa.koj...@linaro.org> > --- > include/net.h | 9 +++++++++ > net/wget.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 63 insertions(+) > > diff --git a/include/net.h b/include/net.h > index e254df7d7f..57889d8b7a 100644 > --- a/include/net.h > +++ b/include/net.h > @@ -926,4 +926,13 @@ void eth_set_enable_bootdevs(bool enable); > static inline void eth_set_enable_bootdevs(bool enable) {} > #endif > > +/** > + * wget_with_dns() - runs dns host IP address resulution before wget > + * > + * @dst_addr: destination address to download the file > + * @uri: uri string of target file of wget > + * Return: downloaded file size, negative if failed > + */ > +int wget_with_dns(ulong dst_addr, char *uri); > + > #endif /* __NET_H__ */ > diff --git a/net/wget.c b/net/wget.c > index a48a8cb624..4801e28eb9 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; > > @@ -504,3 +505,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 > -- > 2.34.1 >
This can be done better when we integrate LWIP but for now Reviewed-by: Ilias Apalodimas <ilias.apalodi...@linaro.org>