diff --git a/conf/conf.c b/conf/conf.c index 11c136e7..4e31de29 100644 --- a/conf/conf.c +++ b/conf/conf.c @@ -201,6 +201,23 @@ config_free(struct config *c) rfree(c->pool); } +/** + * config_free_old - free stored old configuration + * + * This function frees the old configuration (%old_config) that is saved for the + * purpose of undo. It is useful before parsing a new config when reconfig is + * requested, to avoid keeping three (perhaps memory-heavy) configs together. + */ +void +config_free_old(void) +{ + tm_stop(config_timer); + undo_available = 0; + + config_free(old_config); + old_config = NULL; +} + void config_add_obstacle(struct config *c) { diff --git a/conf/conf.h b/conf/conf.h index 5ec924b0..b409750e 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -70,6 +70,7 @@ struct config *config_alloc(const char *name); int config_parse(struct config *); int cli_parse(struct config *); void config_free(struct config *); +void config_free_old(void); int config_commit(struct config *, int type, uint timeout); int config_confirm(void); int config_undo(void); diff --git a/doc/bird.sgml b/doc/bird.sgml index c78b8300..47848f82 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -1173,6 +1173,11 @@ This argument can be omitted if there exists only a single instance. restarted otherwise. Changes in filters usually lead to restart of affected protocols. + The previous configuration is saved and the user can switch back to it + with command. The + old saved configuration is released (even if the reconfiguration attempt + fails due to e.g. a syntax error). + If