1 /*
2  * Copyright (c) 2018 Nordic Semiconductor ASA
3  * Copyright (c) 2015 Runtime Inc
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #ifndef __SETTINGS_PRIV_H_
9 #define __SETTINGS_PRIV_H_
10 
11 #include <sys/types.h>
12 #include <sys/slist.h>
13 #include <errno.h>
14 #include <settings/settings.h>
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 int settings_cli_register(void);
21 int settings_nmgr_register(void);
22 
23 struct mgmt_cbuf;
24 int settings_cbor_line(struct mgmt_cbuf *cb, char *name, int nlen, char *value,
25 		       int vlen);
26 
27 void settings_line_io_init(int (*read_cb)(void *ctx, off_t off, char *buf,
28 					  size_t *len),
29 			   int (*write_cb)(void *ctx, off_t off,
30 					   char const *buf, size_t len),
31 			   size_t (*get_len_cb)(void *ctx),
32 			   uint8_t io_rwbs);
33 
34 int settings_line_write(const char *name, const char *value, size_t val_len,
35 			off_t w_loc, void *cb_arg);
36 
37 /* Get len of record without alignment to write-block-size */
38 int settings_line_len_calc(const char *name, size_t val_len);
39 
40 int settings_line_dup_check_cb(const char *name, void *val_read_cb_ctx,
41 				off_t off, void *cb_arg);
42 
43 int settings_line_load_cb(const char *name, void *val_read_cb_ctx,
44 			   off_t off, void *cb_arg);
45 
46 typedef int (*line_load_cb)(const char *name, void *val_read_cb_ctx,
47 			     off_t off, void *cb_arg);
48 
49 struct settings_line_read_value_cb_ctx {
50 	void *read_cb_ctx;
51 	off_t off;
52 };
53 
54 struct settings_line_dup_check_arg {
55 	const char *name;
56 	const char *val;
57 	size_t val_len;
58 	int is_dup;
59 };
60 
61 #ifdef CONFIG_SETTINGS_ENCODE_LEN
62 /* in storage line contex */
63 struct line_entry_ctx {
64 	void *stor_ctx;
65 	off_t seek; /* offset of id-value pair within the file */
66 	size_t len; /* len of line without len value */
67 };
68 
69 int settings_next_line_ctx(struct line_entry_ctx *entry_ctx);
70 #endif
71 
72 /**
73  * Read RAW settings line entry data from the storage.
74  *
75  * @param seek offset form the line beginning.
76  * @param[out] out buffer for name
77  * @param[in] len_req size of <p>out</p> buffer
78  * @param[out] len_read length of read name
79  * @param[in] cb_arg settings line storage context expected by the
80  * <p>read_cb</p> implementatio
81  *
82  * @retval 0 on success,
83  * -ERCODE on storage errors
84  */
85 int settings_line_raw_read(off_t seek, char *out, size_t len_req,
86 			   size_t *len_read, void *cb_arg);
87 
88 /*
89  * @param val_off offset of the value-string.
90  * @param off from val_off (so within the value-string)
91  */
92 int settings_line_val_read(off_t val_off, off_t off, char *out, size_t len_req,
93 			   size_t *len_read, void *cb_arg);
94 
95 /**
96  * Read the settings line entry name from the storage.
97  *
98  * @param[out] out buffer for name
99  * @param[in] len_req size of <p>out</p> buffer
100  * @param[out] len_read length of read name
101  * @param[in] cb_arg settings line storage context expected by the
102  * <p>read_cb</p> implementation
103  *
104  * @retval 0 on read proper name,
105  * 1 on when read improper name,
106  * -ERCODE on storage errors
107  */
108 int settings_line_name_read(char *out, size_t len_req, size_t *len_read,
109 			    void *cb_arg);
110 
111 size_t settings_line_val_get_len(off_t val_off, void *read_cb_ctx);
112 
113 int settings_line_entry_copy(void *dst_ctx, off_t dst_off, void *src_ctx,
114 			off_t src_off, size_t len);
115 
116 void settings_line_io_init(int (*read_cb)(void *ctx, off_t off, char *buf,
117 					  size_t *len),
118 			  int (*write_cb)(void *ctx, off_t off, char const *buf,
119 					  size_t len),
120 			  size_t (*get_len_cb)(void *ctx),
121 			  uint8_t io_rwbs);
122 
123 
124 extern sys_slist_t settings_load_srcs;
125 extern sys_slist_t settings_handlers;
126 extern struct settings_store *settings_save_dst;
127 
128 #ifdef __cplusplus
129 }
130 #endif
131 
132 #endif /* __SETTINGS_PRIV_H_ */
133