Loading...
// SPDX-License-Identifier: GPL-2.0

#include <dm/uclass.h>
#include <env.h>
#include <net-common.h>
#include <linux/time.h>
#include <rtc.h>

void copy_filename(char *dst, const char *src, int size)
{
	if (src && *src && (*src == '"')) {
		++src;
		--size;
	}

	while ((--size > 0) && src && *src && (*src != '"'))
		*dst++ = *src++;
	*dst = '\0';
}

struct wget_http_info default_wget_info = {
	.method = WGET_HTTP_METHOD_GET,
	.set_bootdev = true,
};

struct wget_http_info *wget_info;

int wget_request(ulong dst_addr, char *uri, struct wget_http_info *info)
{
	wget_info = info ? info : &default_wget_info;
	return wget_do_request(dst_addr, uri);
}

struct in_addr env_get_ip(char *var)
{
	return string_to_ip(env_get(var));
}

void net_sntp_set_rtc(u32 seconds)
{
	struct rtc_time tm;
	struct udevice *dev;
	int ret;

	rtc_to_tm(seconds, &tm);

	ret = uclass_get_device(UCLASS_RTC, 0, &dev);
	if (ret)
		printf("SNTP: cannot find RTC: err=%d\n", ret);
	else
		dm_rtc_set(dev, &tm);

	printf("Date: %4d-%02d-%02d Time: %2d:%02d:%02d\n",
	       tm.tm_year, tm.tm_mon, tm.tm_mday,
	       tm.tm_hour, tm.tm_min, tm.tm_sec);
}

#if defined(CONFIG_CMD_DHCP)
int dhcp_run(ulong addr, const char *fname, bool autoload)
{
	char *dhcp_argv[] = {"dhcp", NULL, (char *)fname, NULL};
	struct cmd_tbl cmdtp = {};	/* dummy */
	char file_addr[17];
	int old_autoload;
	int ret, result;

	log_debug("addr=%lx, fname=%s, autoload=%d\n", addr, fname, autoload);
	old_autoload = env_get_yesno("autoload");
	ret = env_set("autoload", autoload ? "y" : "n");
	if (ret)
		return log_msg_ret("en1", -EINVAL);

	if (autoload) {
		sprintf(file_addr, "%lx", addr);
		dhcp_argv[1] = file_addr;
	}

	result = do_dhcp(&cmdtp, 0, !autoload ? 1 : fname ? 3 : 2, dhcp_argv);

	ret = env_set("autoload", old_autoload == -1 ? NULL :
		      old_autoload ? "y" : "n");
	if (ret)
		return log_msg_ret("en2", -EINVAL);

	if (result)
		return log_msg_ret("res", -ENOENT);

	return 0;
}
#endif

#if defined(CONFIG_CMD_TFTPBOOT)
int tftpb_run(ulong addr, const char *fname)
{
	char *tftp_argv[] = {"tftpboot", NULL, (char *)fname, NULL};
	struct cmd_tbl cmdtp = {};      /* dummy */
	char file_addr[17] = {0};

	log_debug("addr=%lx, fname=%s\n", addr, fname);
	sprintf(file_addr, "%lx", addr);
	tftp_argv[1] = file_addr;

	int result = do_tftpb(&cmdtp, 0, fname ? 3 : 2, tftp_argv);

	if (result)
		return log_msg_ret("res", -ENOENT);

	return 0;
}

#endif