1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2020 NetDEF, Inc.
*/
#include <zebra.h>
#include <lib/version.h>
#include "getopt.h"
#include "frrevent.h"
#include "command.h"
#include "log.h"
#include "memory.h"
#include "privs.h"
#include "sigevent.h"
#include "libfrr.h"
#include "vrf.h"
#include "filter.h"
#include "pathd.h"
#include "path_nb.h"
#include "path_zebra.h"
#include "path_errors.h"
#include "path_ted.h"
char backup_config_file[256];
zebra_capabilities_t _caps_p[] = {};
struct zebra_privs_t pathd_privs = {
#if defined(FRR_USER) && defined(FRR_GROUP)
.user = FRR_USER,
.group = FRR_GROUP,
#endif
#if defined(VTY_GROUP)
.vty_group = VTY_GROUP,
#endif
.caps_p = _caps_p,
.cap_num_p = array_size(_caps_p),
.cap_num_i = 0};
struct option longopts[] = {{0}};
/* Master of threads. */
struct event_loop *master;
static struct frr_daemon_info pathd_di;
/* SIGHUP handler. */
static void sighup(void)
{
zlog_info("SIGHUP received");
/* Reload config file. */
vty_read_config(NULL, pathd_di.config_file, config_default);
}
/* SIGINT / SIGTERM handler. */
static FRR_NORETURN void sigint(void)
{
zlog_notice("Terminating on signal");
zlog_notice("Unregister from opaque,etc ");
pathd_shutdown();
exit(0);
}
/* SIGUSR1 handler. */
static void sigusr1(void)
{
zlog_rotate();
}
struct frr_signal_t path_signals[] = {
{
.signal = SIGHUP,
.handler = &sighup,
},
{
.signal = SIGUSR1,
.handler = &sigusr1,
},
{
.signal = SIGINT,
.handler = &sigint,
},
{
.signal = SIGTERM,
.handler = &sigint,
},
};
static const struct frr_yang_module_info *pathd_yang_modules[] = {
&frr_filter_info,
&frr_interface_info,
&frr_pathd_info,
};
/* clang-format off */
FRR_DAEMON_INFO(pathd, PATH,
.vty_port = PATH_VTY_PORT,
.proghelp = "Implementation of PATH.",
.signals = path_signals,
.n_signals = array_size(path_signals),
.privs = &pathd_privs,
.yang_modules = pathd_yang_modules,
.n_yang_modules = array_size(pathd_yang_modules),
);
/* clang-format on */
int main(int argc, char **argv, char **envp)
{
frr_preinit(&pathd_di, argc, argv);
frr_opt_add("", longopts, "");
while (1) {
int opt;
opt = frr_getopt(argc, argv, NULL);
if (opt == EOF)
break;
switch (opt) {
case 0:
break;
default:
frr_help_exit(1);
}
}
master = frr_init();
access_list_init();
path_error_init();
path_zebra_init(master);
path_cli_init();
path_ted_init(master);
frr_config_fork();
frr_run(master);
/* Not reached. */
return 0;
}
|