/* Copyright (c) 2019 Laczen
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <errno.h>
#include <string.h>

#include <settings/settings.h>
#include "settings_priv.h"

static ssize_t settings_runtime_read_cb(void *cb_arg, void *data, size_t len)
{
	memcpy(data, cb_arg, len);
	return len;
}

int settings_runtime_set(const char *name, void *data, size_t len)
{
	struct settings_handler *ch;
	char name1[SETTINGS_MAX_NAME_LEN + SETTINGS_EXTRA_LEN];
	char *name_argv[SETTINGS_MAX_DIR_DEPTH];
	int name_argc;

	strncpy(name1, name, sizeof(name1));
	ch = settings_parse_and_lookup(name1, &name_argc, name_argv);
	if (!ch) {
		return -EINVAL;
	}

	return ch->h_set(name_argc - 1, &name_argv[1], len,
			 settings_runtime_read_cb, data);
}

int settings_runtime_get(const char *name, void *data, size_t len)
{
	struct settings_handler *ch;
	char name1[SETTINGS_MAX_NAME_LEN + SETTINGS_EXTRA_LEN];
	char *name_argv[SETTINGS_MAX_DIR_DEPTH];
	int name_argc;

	strncpy(name1, name, sizeof(name1));
	ch = settings_parse_and_lookup(name1, &name_argc, name_argv);
	if (!ch) {
		return -EINVAL;
	}

	return ch->h_get(name_argc - 1, &name_argv[1], data, len);
}

int settings_runtime_commit(const char *name)
{
	struct settings_handler *ch;
	char name1[SETTINGS_MAX_NAME_LEN + SETTINGS_EXTRA_LEN];
	char *name_argv[SETTINGS_MAX_DIR_DEPTH];
	int name_argc;

	strncpy(name1, name, sizeof(name1));
	ch = settings_parse_and_lookup(name1, &name_argc, name_argv);
	if (!ch) {
		return -EINVAL;
	}
	if (ch->h_commit) {
		return ch->h_commit();
	} else {
		return 0;
	}
}
