mirror of
https://github.com/FRRouting/frr.git
synced 2025-04-30 13:37:17 +02:00

Start centralising startup & option parsing into the library. FRR_DAEMON_INFO is a bit weird, but it will become useful later (e.g. for killing the ZLOG_* enum, and having the daemon name available) Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
228 lines
5.2 KiB
C
228 lines
5.2 KiB
C
/*
|
|
PIM for Quagga
|
|
Copyright (C) 2008 Everton da Silva Marques
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; see the file COPYING; if not, write to the
|
|
Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
|
MA 02110-1301 USA
|
|
*/
|
|
|
|
#include <zebra.h>
|
|
|
|
#include "log.h"
|
|
#include "privs.h"
|
|
#include "version.h"
|
|
#include <getopt.h>
|
|
#include "command.h"
|
|
#include "thread.h"
|
|
#include <signal.h>
|
|
|
|
#include "memory.h"
|
|
#include "vrf.h"
|
|
#include "memory_vty.h"
|
|
#include "filter.h"
|
|
#include "vty.h"
|
|
#include "sigevent.h"
|
|
#include "version.h"
|
|
#include "prefix.h"
|
|
#include "plist.h"
|
|
#include "vrf.h"
|
|
#include "libfrr.h"
|
|
|
|
#include "pimd.h"
|
|
#include "pim_version.h"
|
|
#include "pim_signals.h"
|
|
#include "pim_zebra.h"
|
|
#include "pim_msdp.h"
|
|
#include "pim_iface.h"
|
|
#include "pim_rp.h"
|
|
|
|
extern struct host host;
|
|
|
|
char config_default[] = SYSCONFDIR PIMD_DEFAULT_CONFIG;
|
|
|
|
/* pimd options */
|
|
struct option longopts[] = {
|
|
{ "daemon", no_argument, NULL, 'd'},
|
|
{ "config_file", required_argument, NULL, 'f'},
|
|
{ "pid_file", required_argument, NULL, 'i'},
|
|
{ "socket", required_argument, NULL, 'z'},
|
|
{ 0 }
|
|
};
|
|
|
|
/* pimd privileges */
|
|
zebra_capabilities_t _caps_p [] =
|
|
{
|
|
ZCAP_NET_ADMIN,
|
|
ZCAP_SYS_ADMIN,
|
|
ZCAP_NET_RAW,
|
|
ZCAP_BIND,
|
|
};
|
|
|
|
/* pimd privileges to run with */
|
|
struct zebra_privs_t pimd_privs =
|
|
{
|
|
#if defined(FRR_USER) && defined(FRR_GROUP)
|
|
.user = FRR_USER,
|
|
.group = FRR_GROUP,
|
|
#endif
|
|
#ifdef VTY_GROUP
|
|
.vty_group = VTY_GROUP,
|
|
#endif
|
|
.caps_p = _caps_p,
|
|
.cap_num_p = sizeof(_caps_p)/sizeof(_caps_p[0]),
|
|
.cap_num_i = 0
|
|
};
|
|
|
|
const char *pid_file = PATH_PIMD_PID;
|
|
|
|
FRR_DAEMON_INFO(pimd, PIM,
|
|
.vty_port = PIMD_VTY_PORT,
|
|
|
|
.proghelp = "Implementation of the PIM routing protocol.",
|
|
|
|
.signals = pimd_signals,
|
|
.n_signals = 4 /* XXX array_size(pimd_signals) XXX*/,
|
|
|
|
.privs = &pimd_privs,
|
|
)
|
|
|
|
int main(int argc, char** argv, char** envp) {
|
|
int daemon_mode = 0;
|
|
char *config_file = NULL;
|
|
char *zebra_sock_path = NULL;
|
|
struct thread thread;
|
|
|
|
frr_preinit(&pimd_di, argc, argv);
|
|
frr_opt_add("df:i:z:", longopts,
|
|
" -d, --daemon Runs in daemon mode\n"
|
|
" -f, --config_file Set configuration file name\n"
|
|
" -i, --pid_file Set process identifier file name\n"
|
|
" -z, --socket Set path of zebra socket\n"
|
|
);
|
|
|
|
/* this while just reads the options */
|
|
while (1) {
|
|
int opt;
|
|
|
|
opt = frr_getopt(argc, argv, NULL);
|
|
|
|
if (opt == EOF)
|
|
break;
|
|
|
|
switch (opt) {
|
|
case 0:
|
|
break;
|
|
case 'd':
|
|
daemon_mode = 1;
|
|
break;
|
|
case 'f':
|
|
config_file = optarg;
|
|
break;
|
|
case 'i':
|
|
pid_file = optarg;
|
|
break;
|
|
case 'z':
|
|
zebra_sock_path = optarg;
|
|
break;
|
|
default:
|
|
frr_help_exit (1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
master = frr_init();
|
|
|
|
zlog_notice("Quagga %s " PIMD_PROGNAME " %s starting",
|
|
FRR_VERSION, PIMD_VERSION);
|
|
|
|
/*
|
|
* Initializations
|
|
*/
|
|
cmd_init(1);
|
|
vty_init(master);
|
|
memory_init();
|
|
vrf_init ();
|
|
access_list_init();
|
|
prefix_list_init ();
|
|
prefix_list_add_hook (pim_rp_prefix_list_update);
|
|
prefix_list_delete_hook (pim_rp_prefix_list_update);
|
|
|
|
pim_route_map_init ();
|
|
pim_init();
|
|
pim_msdp_init (master);
|
|
|
|
/*
|
|
* Initialize zclient "update" and "lookup" sockets
|
|
*/
|
|
pim_zebra_init(zebra_sock_path);
|
|
|
|
zlog_notice("Loading configuration - begin");
|
|
|
|
/* Get configuration file. */
|
|
vty_read_config(config_file, config_default);
|
|
|
|
/*
|
|
Starting from here zlog_* functions will log according configuration
|
|
*/
|
|
|
|
zlog_notice("Loading configuration - end");
|
|
|
|
/* Change to the daemon program. */
|
|
if (daemon_mode) {
|
|
if (daemon(0, 0)) {
|
|
zlog_warn("failed to daemonize");
|
|
}
|
|
}
|
|
|
|
/* Process ID file creation. */
|
|
pid_output(pid_file);
|
|
|
|
frr_vty_serv (PIM_VTYSH_PATH);
|
|
|
|
zlog_notice("Quagga %s " PIMD_PROGNAME " %s starting, VTY interface at port TCP %d",
|
|
FRR_VERSION, PIMD_VERSION, pimd_di.vty_port);
|
|
|
|
#ifdef PIM_DEBUG_BYDEFAULT
|
|
zlog_notice("PIM_DEBUG_BYDEFAULT: Enabling all debug commands");
|
|
PIM_DO_DEBUG_PIM_EVENTS;
|
|
PIM_DO_DEBUG_PIM_PACKETS;
|
|
PIM_DO_DEBUG_PIM_TRACE;
|
|
PIM_DO_DEBUG_IGMP_EVENTS;
|
|
PIM_DO_DEBUG_IGMP_PACKETS;
|
|
PIM_DO_DEBUG_IGMP_TRACE;
|
|
PIM_DO_DEBUG_ZEBRA;
|
|
#endif
|
|
|
|
#ifdef PIM_CHECK_RECV_IFINDEX_SANITY
|
|
zlog_notice("PIM_CHECK_RECV_IFINDEX_SANITY: will match sock/recv ifindex");
|
|
#ifdef PIM_REPORT_RECV_IFINDEX_MISMATCH
|
|
zlog_notice("PIM_REPORT_RECV_IFINDEX_MISMATCH: will report sock/recv ifindex mismatch");
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef PIM_UNEXPECTED_KERNEL_UPCALL
|
|
zlog_notice("PIM_UNEXPECTED_KERNEL_UPCALL: report unexpected kernel upcall");
|
|
#endif
|
|
|
|
while (thread_fetch(master, &thread))
|
|
thread_call(&thread);
|
|
|
|
zlog_err("%s %s: thread_fetch() returned NULL, exiting",
|
|
__FILE__, __PRETTY_FUNCTION__);
|
|
|
|
/* never reached */
|
|
return 0;
|
|
}
|