@@ -67,8 +67,10 @@ static int s_num_validators;
67
67
static int load_config_file (const char * filename , const char * acl ,
68
68
bool check_try , bool delete_try ,
69
69
struct mgos_config * cfg );
70
- static bool load_config_defaults_internal (struct mgos_config * cfg ,
71
- bool check_try , bool delete_try );
70
+ static bool mgos_sys_config_load_level_internal (struct mgos_config * cfg ,
71
+ enum mgos_config_level level ,
72
+ bool check_try ,
73
+ bool delete_try );
72
74
73
75
void mgos_expand_mac_address_placeholders (char * str ) {
74
76
struct mg_str s = mg_mk_str (str );
@@ -92,32 +94,42 @@ void mgos_expand_placeholders(const struct mg_str src, struct mg_str *str) {
92
94
}
93
95
}
94
96
95
- static bool load_config_defaults_internal (struct mgos_config * cfg ,
96
- bool check_try , bool delete_try ) {
97
+ static bool mgos_sys_config_load_level_internal (struct mgos_config * cfg ,
98
+ enum mgos_config_level level ,
99
+ bool check_try ,
100
+ bool delete_try ) {
97
101
int i ;
98
102
char fname [sizeof (CONF_USER_FILE ) + 10 ];
99
103
memset (cfg , 0 , sizeof (* cfg ));
104
+ if (level > MGOS_CONFIG_LEVEL_USER ) return false;
100
105
memcpy (fname , CONF_USER_FILE , sizeof (CONF_USER_FILE ));
101
106
const char * acl = "*" ;
102
- for (i = 0 ; i < MGOS_CONFIG_LEVEL_USER ; i ++ ) {
107
+ for (i = 0 ; i <= ( int ) level ; i ++ ) {
103
108
fname [CONF_USER_FILE_NUM_IDX ] = '0' + i ;
109
+ /* Backward compat: load conf_vendor.json at level 5.5 */
110
+ if (i == 6 ) {
111
+ load_config_file (CONF_VENDOR_FILE , cfg -> conf_acl , false, false, cfg );
112
+ acl = cfg -> conf_acl ;
113
+ }
104
114
if (!load_config_file (fname , acl , check_try , delete_try , cfg )) {
105
115
/* conf0 must exist, everything else is optional. */
106
116
if (i == 0 ) return false;
107
117
}
108
118
acl = cfg -> conf_acl ;
109
- /* Backward compat: load conf_vendor.json at level 5.5 */
110
- if (i == 5 ) {
111
- load_config_file (CONF_VENDOR_FILE , cfg -> conf_acl , false, false, cfg );
112
- acl = cfg -> conf_acl ;
113
- }
114
119
}
115
120
return true;
116
121
}
117
122
123
+ bool mgos_sys_config_load_level (struct mgos_config * cfg ,
124
+ enum mgos_config_level level ) {
125
+ return mgos_sys_config_load_level_internal (cfg , level , true /* check_try */ ,
126
+ false /* delete_try */ );
127
+ }
128
+
118
129
bool load_config_defaults (struct mgos_config * cfg ) {
119
- return load_config_defaults_internal (cfg , true /* check_try */ ,
120
- false /* delete_try */ );
130
+ return mgos_sys_config_load_level_internal (cfg , MGOS_CONFIG_LEVEL_VENDOR_8 ,
131
+ true /* check_try */ ,
132
+ false /* delete_try */ );
121
133
}
122
134
123
135
bool mgos_config_validate (const struct mgos_config * cfg , char * * msg ) {
@@ -128,25 +140,31 @@ bool mgos_config_validate(const struct mgos_config *cfg, char **msg) {
128
140
return true;
129
141
}
130
142
131
- bool mgos_sys_config_save (const struct mgos_config * cfg , bool try_once ,
132
- char * * msg ) {
143
+ bool mgos_sys_config_save_level (const struct mgos_config * cfg ,
144
+ enum mgos_config_level level , bool try_once ,
145
+ char * * msg ) {
133
146
bool result = false;
134
- const char * fname , * try_fname ;
147
+ char fname [sizeof (CONF_USER_FILE ) + 10 ],
148
+ try_fname [sizeof (CONF_USER_FILE ) + 10 ];
135
149
struct mgos_config * defaults = calloc (1 , sizeof (* defaults ));
136
150
char * ptr = NULL ;
137
151
if (defaults == NULL ) goto clean ;
152
+ if (level > MGOS_CONFIG_LEVEL_USER ) goto clean ;
138
153
if (msg == NULL ) msg = & ptr ;
139
154
if (!mgos_config_validate (cfg , msg )) goto clean ;
140
- if (!load_config_defaults_internal ( defaults , true /* check_try */ ,
141
- false /* delete_try */ )) {
155
+ if (!mgos_sys_config_load_level (
156
+ defaults , ( enum mgos_config_level )((( int ) level ) - 1 ) )) {
142
157
* msg = strdup ("failed to load defaults" );
143
158
goto clean ;
144
159
}
145
- try_fname = CONF_USER_FILE CONF_FILE_TRY_SUFFIX ;
160
+ snprintf (fname , sizeof (fname ), "%s" , CONF_USER_FILE );
161
+ snprintf (try_fname , sizeof (try_fname ), "%s%s" , CONF_USER_FILE ,
162
+ CONF_FILE_TRY_SUFFIX );
163
+ fname [CONF_USER_FILE_NUM_IDX ] = '0' + level ;
164
+ try_fname [CONF_USER_FILE_NUM_IDX ] = '0' + level ;
146
165
if (try_once ) {
147
- fname = try_fname ;
166
+ strncpy ( fname , try_fname , sizeof ( fname )) ;
148
167
} else {
149
- fname = CONF_USER_FILE ;
150
168
/* Delete stale try file that may be there. */
151
169
remove (try_fname );
152
170
}
@@ -166,8 +184,13 @@ bool mgos_sys_config_save(const struct mgos_config *cfg, bool try_once,
166
184
return result ;
167
185
}
168
186
187
+ bool mgos_sys_config_save (const struct mgos_config * cfg , bool try_once ,
188
+ char * * msg ) {
189
+ return mgos_sys_config_save_level (cfg , MGOS_CONFIG_LEVEL_USER , try_once , msg );
190
+ }
191
+
169
192
bool save_cfg (const struct mgos_config * cfg , char * * msg ) {
170
- return mgos_sys_config_save (cfg , false, msg );
193
+ return mgos_sys_config_save_level (cfg , MGOS_CONFIG_LEVEL_USER , false, msg );
171
194
}
172
195
173
196
void mgos_config_reset (int level ) {
@@ -233,8 +256,9 @@ void mbedtls_debug_set_threshold(int threshold);
233
256
234
257
enum mgos_init_result mgos_sys_config_init (void ) {
235
258
/* Load system defaults - mandatory */
236
- if (!load_config_defaults_internal (& mgos_sys_config , true /* check_try */ ,
237
- true /* delete_try */ )) {
259
+ if (!mgos_sys_config_load_level_internal (
260
+ & mgos_sys_config , MGOS_CONFIG_LEVEL_VENDOR_8 , true /* check_try */ ,
261
+ true /* delete_try */ )) {
238
262
LOG (LL_ERROR , ("Failed to load config defaults" ));
239
263
return MGOS_INIT_CONFIG_LOAD_DEFAULTS_FAILED ;
240
264
}
0 commit comments