diff options
Diffstat (limited to 'ldpd/ldpd.c')
| -rw-r--r-- | ldpd/ldpd.c | 175 |
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); } |
