|
@@ -1063,6 +1063,10 @@ int fetchf_setting ( struct settings *settings, struct setting *setting,
|
1063
|
1063
|
goto err_exists;
|
1064
|
1064
|
}
|
1065
|
1065
|
|
|
1066
|
+ /* Sanity check */
|
|
1067
|
+ assert ( setting->type != NULL );
|
|
1068
|
+ assert ( setting->type->format != NULL );
|
|
1069
|
+
|
1066
|
1070
|
/* Format setting */
|
1067
|
1071
|
if ( ( ret = setting->type->format ( raw, raw_len, buf, len ) ) < 0 )
|
1068
|
1072
|
goto err_format;
|
|
@@ -1093,6 +1097,10 @@ int storef_setting ( struct settings *settings, struct setting *setting,
|
1093
|
1097
|
if ( ( ! value ) || ( ! value[0] ) )
|
1094
|
1098
|
return delete_setting ( settings, setting );
|
1095
|
1099
|
|
|
1100
|
+ /* Sanity check */
|
|
1101
|
+ assert ( setting->type != NULL );
|
|
1102
|
+ assert ( setting->type->parse != NULL );
|
|
1103
|
+
|
1096
|
1104
|
/* Get raw value length */
|
1097
|
1105
|
raw_len = setting->type->parse ( value, NULL, 0 );
|
1098
|
1106
|
if ( raw_len < 0 ) {
|
|
@@ -1188,7 +1196,6 @@ static struct setting_type * find_setting_type ( const char *name ) {
|
1188
|
1196
|
* @v get_child Function to find or create child settings block
|
1189
|
1197
|
* @v settings Settings block to fill in
|
1190
|
1198
|
* @v setting Setting to fill in
|
1191
|
|
- * @v default_type Default type to use, if none specified
|
1192
|
1199
|
* @ret rc Return status code
|
1193
|
1200
|
*
|
1194
|
1201
|
* Interprets a name of the form
|
|
@@ -1203,8 +1210,7 @@ parse_setting_name ( char *name,
|
1203
|
1210
|
struct settings * ( * get_child )
|
1204
|
1211
|
( struct settings *settings,
|
1205
|
1212
|
const char *name ),
|
1206
|
|
- struct settings **settings, struct setting *setting,
|
1207
|
|
- struct setting_type *default_type ) {
|
|
1213
|
+ struct settings **settings, struct setting *setting ) {
|
1208
|
1214
|
char *settings_name;
|
1209
|
1215
|
char *setting_name;
|
1210
|
1216
|
char *type_name;
|
|
@@ -1215,7 +1221,6 @@ parse_setting_name ( char *name,
|
1215
|
1221
|
*settings = &settings_root;
|
1216
|
1222
|
memset ( setting, 0, sizeof ( *setting ) );
|
1217
|
1223
|
setting->name = "";
|
1218
|
|
- setting->type = default_type;
|
1219
|
1224
|
|
1220
|
1225
|
/* Split name into "[settings_name/]setting_name[:type_name]" */
|
1221
|
1226
|
if ( ( setting_name = strchr ( name, '/' ) ) != NULL ) {
|
|
@@ -1313,10 +1318,13 @@ int store_named_setting ( const char *name, struct setting_type *default_type,
|
1313
|
1318
|
|
1314
|
1319
|
/* Parse setting name */
|
1315
|
1320
|
if ( ( rc = parse_setting_name ( tmp_name, autovivify_child_settings,
|
1316
|
|
- &settings, &setting,
|
1317
|
|
- default_type ) ) != 0 )
|
|
1321
|
+ &settings, &setting ) ) != 0 )
|
1318
|
1322
|
return rc;
|
1319
|
1323
|
|
|
1324
|
+ /* Apply default type if necessary */
|
|
1325
|
+ if ( ! setting.type )
|
|
1326
|
+ setting.type = default_type;
|
|
1327
|
+
|
1320
|
1328
|
/* Store setting */
|
1321
|
1329
|
if ( ( rc = store_setting ( settings, &setting, data, len ) ) != 0 )
|
1322
|
1330
|
return rc;
|
|
@@ -1344,10 +1352,13 @@ int storef_named_setting ( const char *name, struct setting_type *default_type,
|
1344
|
1352
|
|
1345
|
1353
|
/* Parse setting name */
|
1346
|
1354
|
if ( ( rc = parse_setting_name ( tmp_name, autovivify_child_settings,
|
1347
|
|
- &settings, &setting,
|
1348
|
|
- default_type ) ) != 0 )
|
|
1355
|
+ &settings, &setting ) ) != 0 )
|
1349
|
1356
|
return rc;
|
1350
|
1357
|
|
|
1358
|
+ /* Apply default type if necessary */
|
|
1359
|
+ if ( ! setting.type )
|
|
1360
|
+ setting.type = default_type;
|
|
1361
|
+
|
1351
|
1362
|
/* Store setting */
|
1352
|
1363
|
if ( ( rc = storef_setting ( settings, &setting, value ) ) != 0 )
|
1353
|
1364
|
return rc;
|
|
@@ -1380,7 +1391,7 @@ int fetchf_named_setting ( const char *name,
|
1380
|
1391
|
|
1381
|
1392
|
/* Parse setting name */
|
1382
|
1393
|
if ( ( rc = parse_setting_name ( tmp_name, find_child_settings,
|
1383
|
|
- &settings, &setting, NULL ) ) != 0 )
|
|
1394
|
+ &settings, &setting ) ) != 0 )
|
1384
|
1395
|
return rc;
|
1385
|
1396
|
|
1386
|
1397
|
/* Fetch setting */
|