[settings] Avoid duplicate settings block names
authorMichael Brown <mcb30@etherboot.org>
Sat, 31 Jan 2009 07:32:20 +0000 (07:32 +0000)
committerMichael Brown <mcb30@etherboot.org>
Sat, 31 Jan 2009 07:32:20 +0000 (07:32 +0000)
Automatically unregister any settings with the same name (and position
within the settings tree) as a newly registered settings block.

This functionality is generalised out from dhcp.c.

src/core/settings.c

index 09033bd..2c886fd 100644 (file)
@@ -183,12 +183,17 @@ static void reprioritise_settings ( struct settings *settings ) {
  * @ret rc             Return status code
  */
 int register_settings ( struct settings *settings, struct settings *parent ) {
+       struct settings *old_settings;
 
        /* NULL parent => add to settings root */
        assert ( settings != NULL );
        if ( parent == NULL )
                parent = &settings_root;
 
+       /* Remove any existing settings with the same name */
+       if ( ( old_settings = find_child_settings ( parent, settings->name ) ))
+               unregister_settings ( old_settings );
+
        /* Add to list of settings */
        ref_get ( settings->refcnt );
        ref_get ( parent->refcnt );