summaryrefslogtreecommitdiff
path: root/zebra/main.c
diff options
context:
space:
mode:
authorDenis Ovsienko <linux@pilot.org.ua>2007-09-14 13:31:52 +0000
committerDenis Ovsienko <linux@pilot.org.ua>2007-09-14 13:31:52 +0000
commit91b7351d4e150bbc60786f0facb911fa2c598553 (patch)
treefe5885f6a514a000cac903a105e1c7386b2c4df1 /zebra/main.c
parent2d844524ad9431ea1e53336dfcfebd3ee6520cb7 (diff)
+ fixed bug #402: now the second zebra process doesn't destroy routes
of the first one before dying + we are not going to receive routing messages originated by old_pid, because rib_sweep_route() is called after damon() now. This will allow to drop old_pid completely soon.
Diffstat (limited to 'zebra/main.c')
-rw-r--r--zebra/main.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/zebra/main.c b/zebra/main.c
index 7d895799..2f966523 100644
--- a/zebra/main.c
+++ b/zebra/main.c
@@ -346,11 +346,13 @@ main (int argc, char **argv)
zebra_snmp_init ();
#endif /* HAVE_SNMP */
- /* Clean up self inserted route. */
- if (! keep_kernel_mode)
- rib_sweep_route ();
-
- /* Configuration file read*/
+ /* Process the configuration file. Among other configuration
+ * directives we can meet those installing static routes. Such
+ * requests will not be executed immediately, but queued in
+ * zebra->ribq structure until we enter the main execution loop.
+ * The notifications from kernel will show originating PID equal
+ * to that after daemon() completes (if ever called).
+ */
vty_read_config (config_file, config_default);
/* Don't start execution if we are in dry-run mode */
@@ -374,6 +376,17 @@ main (int argc, char **argv)
/* Output pid of zebra. */
pid_output (pid_file);
+ /* After we have successfully acquired the pidfile, we can be sure
+ * about being the only copy of zebra process, which is submitting
+ * changes to the FIB.
+ * Clean up zebra-originated routes. The requests will be sent to OS
+ * immediately, so originating PID in notifications from kernel
+ * will be equal to the current getpid(). To know about such routes,
+ * we have to have route_read() called before.
+ */
+ if (! keep_kernel_mode)
+ rib_sweep_route ();
+
/* Needed for BSD routing socket. */
pid = getpid ();