[zebra] do not touch socket before pidfile locking

Move zserv socket creation code into zebra_zserv_socket_init() and
call it only after pidfile lock has been acquired exclusively. This
keeps subsequent zebra daemons from deleting the working socket of
an already running process (bug #403).
This commit is contained in:
Denis Ovsienko 2009-07-24 20:45:31 +04:00
parent 5b40b1b57e
commit 97be79f9d3
3 changed files with 15 additions and 7 deletions

View File

@ -382,6 +382,9 @@ main (int argc, char **argv)
/* Needed for BSD routing socket. */ /* Needed for BSD routing socket. */
pid = getpid (); pid = getpid ();
/* This must be done only after locking pidfile (bug #403). */
zebra_zserv_socket_init ();
/* Make vty server socket. */ /* Make vty server socket. */
vty_serv_sock (vty_addr, vty_port, ZEBRA_VTYSH_PATH); vty_serv_sock (vty_addr, vty_port, ZEBRA_VTYSH_PATH);

View File

@ -1704,13 +1704,6 @@ zebra_init (void)
/* Client list init. */ /* Client list init. */
zebrad.client_list = list_new (); zebrad.client_list = list_new ();
/* Make zebra server socket. */
#ifdef HAVE_TCP_ZEBRA
zebra_serv ();
#else
zebra_serv_un (ZEBRA_SERV_PATH);
#endif /* HAVE_TCP_ZEBRA */
/* Install configuration write function. */ /* Install configuration write function. */
install_node (&table_node, config_write_table); install_node (&table_node, config_write_table);
install_node (&forwarding_node, config_write_forwarding); install_node (&forwarding_node, config_write_forwarding);
@ -1737,3 +1730,14 @@ zebra_init (void)
/* Route-map */ /* Route-map */
zebra_route_map_init (); zebra_route_map_init ();
} }
/* Make zebra server socket, wiping any existing one (see bug #403). */
void
zebra_zserv_socket_init (void)
{
#ifdef HAVE_TCP_ZEBRA
zebra_serv ();
#else
zebra_serv_un (ZEBRA_SERV_PATH);
#endif /* HAVE_TCP_ZEBRA */
}

View File

@ -89,6 +89,7 @@ struct zebra_t
/* Prototypes. */ /* Prototypes. */
extern void zebra_init (void); extern void zebra_init (void);
extern void zebra_if_init (void); extern void zebra_if_init (void);
extern void zebra_zserv_socket_init (void);
extern void hostinfo_get (void); extern void hostinfo_get (void);
extern void rib_init (void); extern void rib_init (void);
extern void interface_list (void); extern void interface_list (void);