frr/tests/helpers/c/main.c
Christian Hopps e8648a0c72 lib: add flag to have libyang load internal ietf-yang-library module
Mgmtd makes use of libyang's internal ietf-yang-library module to add
support for said module to FRR management. Previously, mgmtd was loading
this module explicitly; however, that required that libyang's
`ietf-yang-library.yang` module definition file be co-located with FRR's
yang files so that it (and ietf-datastore.yang) would be found when
searched for by libyang using FRRs search path. This isn't always the
case depending on how the user compiles and installs libyang so mgmtd
was failing to run in some cases.

Instead of doing it the above way we simply tell libyang to load it's
internal version of ietf-yang-library when we initialize the libyang
context.

This required adding a boolean to a couple of the init functions which
is why so many files are touched (although all the changes are minimal).

Signed-off-by: Christian Hopps <chopps@labn.net>
2024-10-07 03:32:44 +00:00

176 lines
3.4 KiB
C

// SPDX-License-Identifier: GPL-2.0-or-later
/*
*/
#include <zebra.h>
#include <sys/stat.h>
#include <lib/version.h>
#include "debug.h"
#include "getopt.h"
#include "frrevent.h"
#include "vty.h"
#include "command.h"
#include "memory.h"
#include "lib_vty.h"
extern void test_init(void);
struct event_loop *master;
struct option longopts[] = {{"daemon", no_argument, NULL, 'd'},
{"config_file", required_argument, NULL, 'f'},
{"help", no_argument, NULL, 'h'},
{"vty_addr", required_argument, NULL, 'A'},
{"vty_port", required_argument, NULL, 'P'},
{"version", no_argument, NULL, 'v'},
{0}};
DEFUN (daemon_exit,
daemon_exit_cmd,
"daemon-exit",
"Make the daemon exit\n")
{
exit(0);
}
static int timer_count;
static void test_timer(struct event *thread)
{
int *count = EVENT_ARG(thread);
printf("run %d of timer\n", (*count)++);
event_add_timer(master, test_timer, count, 5, NULL);
}
static void test_timer_init(void)
{
event_add_timer(master, test_timer, &timer_count, 10, NULL);
}
static void test_vty_init(void)
{
install_element(VIEW_NODE, &daemon_exit_cmd);
}
/* Help information display. */
static void usage(char *progname, int status)
{
if (status != 0)
fprintf(stderr, "Try `%s --help' for more information.\n",
progname);
else {
printf("Usage : %s [OPTION...]\n\
Daemon which does 'slow' things.\n\n\
-d, --daemon Runs in daemon mode\n\
-f, --config_file Set configuration file name\n\
-A, --vty_addr Set vty's bind address\n\
-P, --vty_port Set vty's port number\n\
-v, --version Print program version\n\
-h, --help Display this help and exit\n\
\n\
Report bugs to %s\n",
progname, FRR_BUG_ADDRESS);
}
exit(status);
}
/* main routine. */
int main(int argc, char **argv)
{
char *p;
char *vty_addr = NULL;
int vty_port = 4000;
int daemon_mode = 0;
char *progname;
struct event thread;
char *config_file = NULL;
/* Set umask before anything for security */
umask(0027);
/* get program name */
progname = ((p = strrchr(argv[0], '/')) ? ++p : argv[0]);
/* master init. */
master = event_master_create(NULL);
while (1) {
int opt;
opt = getopt_long(argc, argv, "dhf:A:P:v", longopts, 0);
if (opt == EOF)
break;
switch (opt) {
case 0:
break;
case 'f':
config_file = optarg;
break;
case 'd':
daemon_mode = 1;
break;
case 'A':
vty_addr = optarg;
break;
case 'P':
/* Deal with atoi() returning 0 on failure */
if (strcmp(optarg, "0") == 0) {
vty_port = 0;
break;
}
vty_port = atoi(optarg);
vty_port = (vty_port ? vty_port : 4000);
break;
case 'v':
print_version(progname);
exit(0);
break;
case 'h':
usage(progname, 0);
break;
default:
usage(progname, 1);
break;
}
}
/* Library inits. */
cmd_init(1);
vty_init(master, false);
lib_cmd_init();
debug_init();
nb_init(master, NULL, 0, false, false);
/* OSPF vty inits. */
test_vty_init();
/* Change to the daemon program. */
if (daemon_mode && daemon(0, 0) < 0) {
fprintf(stderr, "daemon failed: %s", strerror(errno));
exit(1);
}
/* Create VTY socket */
vty_serv_start(vty_addr, vty_port, "/tmp/.heavy.sock");
/* Configuration file read*/
if (!config_file)
usage(progname, 1);
vty_read_config(NULL, config_file, NULL);
test_timer_init();
test_init();
/* Fetch next active thread. */
while (event_fetch(master, &thread))
event_call(&thread);
/* Not reached. */
exit(0);
}