9
9
#include <zephyr/sys/util.h>
10
10
#include <zephyr/toolchain.h>
11
11
12
+ #include <ctype.h>
12
13
#include <stdint.h>
13
14
#include <stddef.h>
14
15
@@ -51,6 +52,7 @@ static int cmd_list(const struct shell *shell_ptr, size_t argc, char *argv[])
51
52
52
53
if (err ) {
53
54
shell_error (shell_ptr , "Failed to load settings: %d" , err );
55
+ err = - ENOEXEC ;
54
56
}
55
57
56
58
return err ;
@@ -74,6 +76,7 @@ static int settings_read_callback(const char *key,
74
76
void * param )
75
77
{
76
78
uint8_t buffer [SETTINGS_MAX_VAL_LEN ];
79
+ ssize_t i ;
77
80
ssize_t num_read_bytes = MIN (len , SETTINGS_MAX_VAL_LEN );
78
81
struct settings_read_callback_params * params = param ;
79
82
@@ -100,11 +103,13 @@ static int settings_read_callback(const char *key,
100
103
shell_hexdump (params -> shell_ptr , buffer , num_read_bytes );
101
104
break ;
102
105
case SETTINGS_VALUE_STRING :
103
- if (buffer [num_read_bytes - 1 ] != '\0' ) {
104
- shell_error (params -> shell_ptr , "Value is not a string" );
105
- return 0 ;
106
+ for (i = 0 ; i < num_read_bytes ; i ++ ) {
107
+ if (!isprint (buffer [i ])) {
108
+ shell_error (params -> shell_ptr , "Value is not a string" );
109
+ return 0 ;
110
+ }
106
111
}
107
- shell_print (params -> shell_ptr , "%s" , buffer );
112
+ shell_print (params -> shell_ptr , "%.*s" , ( int ) num_read_bytes , buffer );
108
113
break ;
109
114
}
110
115
@@ -138,7 +143,7 @@ static int cmd_read(const struct shell *shell_ptr, size_t argc, char *argv[])
138
143
err = settings_parse_type (argv [1 ], & value_type );
139
144
if (err ) {
140
145
shell_error (shell_ptr , "Invalid type: %s" , argv [1 ]);
141
- return err ;
146
+ return - EINVAL ;
142
147
}
143
148
}
144
149
@@ -152,9 +157,10 @@ static int cmd_read(const struct shell *shell_ptr, size_t argc, char *argv[])
152
157
153
158
if (err ) {
154
159
shell_error (shell_ptr , "Failed to load setting: %d" , err );
160
+ err = - ENOEXEC ;
155
161
} else if (!params .value_found ) {
156
- err = - ENOENT ;
157
162
shell_error (shell_ptr , "Setting not found" );
163
+ err = - ENOEXEC ;
158
164
}
159
165
160
166
return err ;
@@ -164,42 +170,39 @@ static int cmd_write(const struct shell *shell_ptr, size_t argc, char *argv[])
164
170
{
165
171
int err ;
166
172
uint8_t buffer [CONFIG_SHELL_CMD_BUFF_SIZE / 2 ];
167
- size_t buffer_len = 0 ;
173
+ const void * value ;
174
+ size_t value_len = 0 ;
168
175
enum settings_value_types value_type = SETTINGS_VALUE_HEX ;
169
176
170
177
if (argc > 3 ) {
171
178
err = settings_parse_type (argv [1 ], & value_type );
172
179
if (err ) {
173
180
shell_error (shell_ptr , "Invalid type: %s" , argv [1 ]);
174
- return err ;
181
+ return - EINVAL ;
175
182
}
176
183
}
177
184
178
185
switch (value_type ) {
179
186
case SETTINGS_VALUE_HEX :
180
- buffer_len = hex2bin ( argv [ argc - 1 ], strlen ( argv [ argc - 1 ]),
181
- buffer , sizeof (buffer ));
187
+ value = buffer ;
188
+ value_len = hex2bin ( argv [ argc - 1 ], strlen ( argv [ argc - 1 ]), buffer , sizeof (buffer ));
182
189
break ;
183
190
case SETTINGS_VALUE_STRING :
184
- buffer_len = strlen (argv [argc - 1 ]) + 1 ;
185
- if (buffer_len > sizeof (buffer )) {
186
- shell_error (shell_ptr , "%s is bigger than shell's buffer" , argv [argc - 1 ]);
187
- return - EINVAL ;
188
- }
189
-
190
- memcpy (buffer , argv [argc - 1 ], buffer_len );
191
+ value = argv [argc - 1 ];
192
+ value_len = strlen (argv [argc - 1 ]);
191
193
break ;
192
194
}
193
195
194
- if (buffer_len == 0 ) {
196
+ if (value_len == 0 ) {
195
197
shell_error (shell_ptr , "Failed to parse value" );
196
198
return - EINVAL ;
197
199
}
198
200
199
- err = settings_save_one (argv [argc - 2 ], buffer , buffer_len );
201
+ err = settings_save_one (argv [argc - 2 ], value , value_len );
200
202
201
203
if (err ) {
202
204
shell_error (shell_ptr , "Failed to write setting: %d" , err );
205
+ err = - ENOEXEC ;
203
206
}
204
207
205
208
return err ;
@@ -213,6 +216,7 @@ static int cmd_delete(const struct shell *shell_ptr, size_t argc, char *argv[])
213
216
214
217
if (err ) {
215
218
shell_error (shell_ptr , "Failed to delete setting: %d" , err );
219
+ err = - ENOEXEC ;
216
220
}
217
221
218
222
return err ;
0 commit comments