1 /* Copyright (c) 2019 Laczen
2  *
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #include <errno.h>
7 #include <string.h>
8 #include <sys/util.h>
9 
10 #include <settings/settings.h>
11 #include "settings_priv.h"
12 
13 struct read_cb_arg {
14 	const void *data;
15 	size_t len;
16 };
17 
settings_runtime_read_cb(void * cb_arg,void * data,size_t len)18 static ssize_t settings_runtime_read_cb(void *cb_arg, void *data, size_t len)
19 {
20 	struct read_cb_arg *arg = (struct read_cb_arg *)cb_arg;
21 
22 	memcpy(data, arg->data, MIN(arg->len, len));
23 	return MIN(arg->len, len);
24 }
25 
settings_runtime_set(const char * name,const void * data,size_t len)26 int settings_runtime_set(const char *name, const void *data, size_t len)
27 {
28 	struct settings_handler_static *ch;
29 	const char *name_key;
30 	struct read_cb_arg arg;
31 
32 	ch = settings_parse_and_lookup(name, &name_key);
33 	if (!ch) {
34 		return -EINVAL;
35 	}
36 
37 	arg.data = data;
38 	arg.len = len;
39 	return ch->h_set(name_key, len, settings_runtime_read_cb, (void *)&arg);
40 }
41 
settings_runtime_get(const char * name,void * data,size_t len)42 int settings_runtime_get(const char *name, void *data, size_t len)
43 {
44 	struct settings_handler_static *ch;
45 	const char *name_key;
46 
47 	ch = settings_parse_and_lookup(name, &name_key);
48 	if (!ch) {
49 		return -EINVAL;
50 	}
51 
52 	if (!ch->h_get) {
53 		return -ENOTSUP;
54 	}
55 
56 	return ch->h_get(name_key, data, len);
57 }
58 
settings_runtime_commit(const char * name)59 int settings_runtime_commit(const char *name)
60 {
61 	struct settings_handler_static *ch;
62 	const char *name_key;
63 
64 	ch = settings_parse_and_lookup(name, &name_key);
65 	if (!ch) {
66 		return -EINVAL;
67 	}
68 
69 	if (ch->h_commit) {
70 		return ch->h_commit();
71 	} else {
72 		return 0;
73 	}
74 }
75