summaryrefslogtreecommitdiff
path: root/ldpd/ldpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldpd/ldpd.c')
-rw-r--r--ldpd/ldpd.c175
1 files changed, 28 insertions, 147 deletions
diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c
index 4e79f8b8ab..98ea5ca53e 100644
--- a/ldpd/ldpd.c
+++ b/ldpd/ldpd.c
@@ -40,8 +40,8 @@
#include "zclient.h"
#include "vrf.h"
#include "filter.h"
-#include "sockopt.h"
#include "qobj.h"
+#include "libfrr.h"
static void ldpd_shutdown(void);
static pid_t start_child(enum ldpd_process, char *, int, int,
@@ -90,12 +90,6 @@ static pid_t lde_pid;
/* Master of threads. */
struct thread_master *master;
-/* Process ID saved for use by init system */
-static const char *pid_file = PATH_LDPD_PID;
-
-/* Configuration filename and directory. */
-static char config_default[] = SYSCONFDIR LDP_DEFAULT_CONFIG;
-
/* ldpd privileges */
static zebra_capabilities_t _caps_p [] =
{
@@ -117,63 +111,17 @@ struct zebra_privs_t ldpd_privs =
.cap_num_i = 0
};
-/* VTY Socket prefix */
-char vty_sock_path[MAXPATHLEN] = LDP_VTYSH_PATH;
-
/* CTL Socket path */
char ctl_sock_path[MAXPATHLEN] = LDPD_SOCKET;
/* LDPd options. */
-#define OPTION_VTYSOCK 1000
#define OPTION_CTLSOCK 1001
static 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'},
- { "dryrun", no_argument, NULL, 'C'},
- { "help", no_argument, NULL, 'h'},
- { "vty_addr", required_argument, NULL, 'A'},
- { "vty_port", required_argument, NULL, 'P'},
- { "vty_socket", required_argument, NULL, OPTION_VTYSOCK},
{ "ctl_socket", required_argument, NULL, OPTION_CTLSOCK},
- { "user", required_argument, NULL, 'u'},
- { "group", required_argument, NULL, 'g'},
- { "version", no_argument, NULL, 'v'},
{ 0 }
};
-/* Help information display. */
-static void __attribute__ ((noreturn))
-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 manages LDP.\n\n\
--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\
--A, --vty_addr Set vty's bind address\n\
--P, --vty_port Set vty's port number\n\
- --vty_socket Override vty socket path\n\
- --ctl_socket Override ctl socket path\n\
--u, --user User to run as\n\
--g, --group Group to run as\n\
--v, --version Print program version\n\
--C, --dryrun Check configuration for validity and exit\n\
--h, --help Display this help and exit\n\
-\n\
-Report bugs to %s\n", progname, FRR_BUG_ADDRESS);
- }
-
- exit(status);
-}
-
/* SIGHUP handler. */
static void
sighup(void)
@@ -193,7 +141,7 @@ sigint(void)
static void
sigusr1(void)
{
- zlog_rotate(NULL);
+ zlog_rotate();
}
static struct quagga_signal_t ldp_signals[] =
@@ -216,6 +164,17 @@ static struct quagga_signal_t ldp_signals[] =
}
};
+FRR_DAEMON_INFO(ldpd, LDP,
+ .vty_port = LDP_VTY_PORT,
+
+ .proghelp = "Implementation of the LDP protocol.",
+
+ .signals = ldp_signals,
+ .n_signals = array_size(ldp_signals),
+
+ .privs = &ldpd_privs,
+)
+
int
main(int argc, char *argv[])
{
@@ -223,36 +182,25 @@ main(int argc, char *argv[])
int lflag = 0, eflag = 0;
int pipe_parent2ldpe[2], pipe_parent2ldpe_sync[2];
int pipe_parent2lde[2], pipe_parent2lde_sync[2];
- char *p;
- char *vty_addr = NULL;
- int vty_port = LDP_VTY_PORT;
char *ctl_sock_custom_path = NULL;
char *ctl_sock_name;
- int daemon_mode = 0;
const char *user = NULL;
const char *group = NULL;
- char *config_file = NULL;
- char *progname;
- struct thread thread;
- int dryrun = 0;
ldpd_process = PROC_MAIN;
- /* Set umask before anything for security */
- umask(0027);
-
- /* get program name */
- progname = ((p = strrchr(argv[0], '/')) ? ++p : argv[0]);
-
saved_argv0 = argv[0];
if (saved_argv0 == NULL)
saved_argv0 = (char *)"ldpd";
+ frr_preinit(&ldpd_di, argc, argv);
+ frr_opt_add("LE", longopts,
+ " --ctl_socket Override ctl socket path\n");
+
while (1) {
int opt;
- opt = getopt_long(argc, argv, "df:i:z:hA:P:u:g:vCLE",
- longopts, 0);
+ opt = frr_getopt(argc, argv, NULL);
if (opt == EOF)
break;
@@ -260,37 +208,6 @@ main(int argc, char *argv[])
switch (opt) {
case 0:
break;
- case 'd':
- daemon_mode = 1;
- break;
- case 'f':
- config_file = optarg;
- break;
- case 'A':
- vty_addr = optarg;
- break;
- case 'i':
- pid_file = optarg;
- break;
- case 'z':
- zclient_serv_path_set(optarg);
- break;
- case 'P':
- /*
- * Deal with atoi() returning 0 on failure, and ldpd
- * not listening on ldpd port.
- */
- if (strcmp(optarg, "0") == 0) {
- vty_port = 0;
- break;
- }
- vty_port = atoi(optarg);
- if (vty_port <= 0 || vty_port > 0xffff)
- vty_port = LDP_VTY_PORT;
- break;
- case OPTION_VTYSOCK:
- set_socket_path(vty_sock_path, LDP_VTYSH_PATH, optarg, sizeof (vty_sock_path));
- break;
case OPTION_CTLSOCK:
ctl_sock_name = strrchr(LDPD_SOCKET, '/');
if (ctl_sock_name)
@@ -310,22 +227,6 @@ main(int argc, char *argv[])
strlcat(ctl_sock_path, ctl_sock_name,
sizeof(ctl_sock_path));
break;
- case 'u':
- user = optarg;
- break;
- case 'g':
- group = optarg;
- break;
- case 'v':
- print_version(progname);
- exit(0);
- break;
- case 'C':
- dryrun = 1;
- break;
- case 'h':
- usage(progname, 0);
- break;
case 'L':
lflag = 1;
break;
@@ -333,24 +234,27 @@ main(int argc, char *argv[])
eflag = 1;
break;
default:
- usage(progname, 1);
+ frr_help_exit(1);
break;
}
}
+ user = ldpd_privs.user;
+ group = ldpd_privs.group;
+
argc -= optind;
argv += optind;
if (argc > 0 || (lflag && eflag))
- usage(progname, 1);
+ frr_help_exit(1);
/* check for root privileges */
if (geteuid() != 0) {
errno = EPERM;
- perror(progname);
+ perror(ldpd_di.progname);
exit(1);
}
- zlog_default = openzlog(progname, ZLOG_LDP, 0,
+ openzlog(ldpd_di.progname, "LDP", 0,
LOG_CONS | LOG_NDELAY | LOG_PID, LOG_DAEMON);
if (lflag)
@@ -371,19 +275,11 @@ main(int argc, char *argv[])
/* Get configuration file. */
ldpd_conf = config_new_empty();
ldp_config_reset_main(ldpd_conf, NULL);
- vty_read_config(config_file, config_default);
- /* Start execution only if not in dry-run mode */
- if (dryrun)
- exit(0);
+ frr_config_fork();
QOBJ_REG (ldpd_conf, ldpd_conf);
- if (daemon_mode && daemon(0, 0) < 0) {
- log_warn("LDPd daemon failed");
- exit(1);
- }
-
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipe_parent2ldpe) == -1)
fatal("socketpair");
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC,
@@ -418,10 +314,6 @@ main(int argc, char *argv[])
user, group, ctl_sock_custom_path);
/* drop privileges */
- if (user)
- ldpd_privs.user = user;
- if (group)
- ldpd_privs.group = group;
zprivs_init(&ldpd_privs);
/* setup signal handler */
@@ -471,18 +363,7 @@ main(int argc, char *argv[])
if (ldpd_conf->ipv6.flags & F_LDPD_AF_ENABLED)
main_imsg_send_net_sockets(AF_INET6);
- /* Process id file create. */
- pid_output(pid_file);
-
- /* Create VTY socket */
- vty_serv_sock(vty_addr, vty_port, vty_sock_path);
-
- /* Print banner. */
- log_notice("LDPd %s starting: vty@%d", FRR_VERSION, vty_port);
-
- /* Fetch next active thread. */
- while (thread_fetch(master, &thread))
- thread_call(&thread);
+ frr_run(master);
/* NOTREACHED */
return (0);
@@ -526,7 +407,7 @@ ldpd_shutdown(void)
ldp_zebra_destroy();
zprivs_terminate(&ldpd_privs);
thread_master_free(master);
- closezlog(zlog_default);
+ closezlog();
exit(0);
}