|  | @@ -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 */
 |