diff options
| author | David Lamparter <equinox@opensourcerouting.org> | 2016-11-13 16:02:23 +0900 |
|---|---|---|
| committer | David Lamparter <equinox@opensourcerouting.org> | 2017-03-07 23:07:20 +0100 |
| commit | 4f04a76b717fc4881a547f582a02a4d06d356c47 (patch) | |
| tree | 90951be570b6de3889da7c5358b1fe2f998d4acd /ospf6d/ospf6_main.c | |
| parent | ae6ba9ba043652bde3b0000f5299eff31d351ee3 (diff) | |
*: add frr_init() infrastructure
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>
Diffstat (limited to 'ospf6d/ospf6_main.c')
| -rw-r--r-- | ospf6d/ospf6_main.c | 131 |
1 files changed, 25 insertions, 106 deletions
diff --git a/ospf6d/ospf6_main.c b/ospf6d/ospf6_main.c index f85580fa59..f7df47cacb 100644 --- a/ospf6d/ospf6_main.c +++ b/ospf6d/ospf6_main.c @@ -39,7 +39,7 @@ #include "zclient.h" #include "vrf.h" #include "bfd.h" -#include "sockopt.h" +#include "libfrr.h" #include "ospf6d.h" #include "ospf6_top.h" @@ -52,9 +52,6 @@ /* Default configuration file name for ospf6d. */ #define OSPF6_DEFAULT_CONFIG "ospf6d.conf" -/* VTY Socket prefix */ -char vty_sock_path[MAXPATHLEN] = OSPF6_VTYSH_PATH; - /* Default port values. */ #define OSPF6_VTY_PORT 2606 @@ -82,30 +79,19 @@ struct zebra_privs_t ospf6d_privs = }; /* ospf6d options, we use GNU getopt library. */ -#define OPTION_VTYSOCK 1000 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'}, - { "vty_addr", required_argument, NULL, 'A'}, - { "vty_port", required_argument, NULL, 'P'}, - { "vty_socket", required_argument, NULL, OPTION_VTYSOCK}, - { "user", required_argument, NULL, 'u'}, - { "group", required_argument, NULL, 'g'}, - { "version", no_argument, NULL, 'v'}, { "dryrun", no_argument, NULL, 'C'}, - { "help", no_argument, NULL, 'h'}, { 0 } }; /* Configuration file and directory. */ char config_default[] = SYSCONFDIR OSPF6_DEFAULT_CONFIG; -/* ospf6d program name. */ -char *progname; - /* is daemon? */ int daemon_mode = 0; @@ -115,35 +101,6 @@ struct thread_master *master; /* Process ID saved for use by init system */ const char *pid_file = PATH_OSPF6D_PID; -/* 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\n\ -Daemon which manages OSPF version 3.\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\ --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); -} - static void __attribute__ ((noreturn)) ospf6_exit (int status) { @@ -231,32 +188,39 @@ struct quagga_signal_t ospf6_signals[] = }, }; +FRR_DAEMON_INFO(ospf6d, OSPF6, + .vty_port = OSPF6_VTY_PORT, + + .proghelp = "Implementation of the OSPFv3 routing protocol.", + + .signals = ospf6_signals, + .n_signals = array_size(ospf6_signals), + + .privs = &ospf6d_privs, +) + /* Main routine of ospf6d. Treatment of argument and starting ospf finite state machine is handled here. */ int main (int argc, char *argv[], char *envp[]) { - char *p; int opt; - char *vty_addr = NULL; - int vty_port = 0; char *config_file = NULL; struct thread thread; int dryrun = 0; - /* Set umask before anything for security */ - umask (0027); - - /* Preserve name of myself. */ - progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]); - - /* Seed random number for LSA ID */ - srandom (time(NULL)); + frr_preinit (&ospf6d_di, argc, argv); + frr_opt_add ("df:i:z:C", 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" + " -C, --dryrun Check configuration for validity and exit\n"); /* Command line argument treatment. */ while (1) { - opt = getopt_long (argc, argv, "df:i:z:hp:A:P:u:g:vC", longopts, 0); + opt = frr_getopt (argc, argv, NULL); if (opt == EOF) break; @@ -271,48 +235,17 @@ main (int argc, char *argv[], char *envp[]) 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 ospf6d not - listening on ospf6d port... */ - if (strcmp(optarg, "0") == 0) - { - vty_port = 0; - break; - } - vty_port = atoi (optarg); - if (vty_port <= 0 || vty_port > 0xffff) - vty_port = OSPF6_VTY_PORT; - break; - case OPTION_VTYSOCK: - set_socket_path(vty_sock_path, OSPF6_VTYSH_PATH, optarg, sizeof (vty_sock_path)); - break; - case 'u': - ospf6d_privs.user = optarg; - break; - case 'g': - ospf6d_privs.group = optarg; - break; - case 'v': - print_version (progname); - exit (0); - break; case 'C': dryrun = 1; break; - case 'h': - usage (progname, 0); - break; default: - usage (progname, 1); + frr_help_exit (1); break; } } @@ -320,24 +253,13 @@ main (int argc, char *argv[], char *envp[]) if (geteuid () != 0) { errno = EPERM; - perror (progname); + perror (ospf6d_di.progname); exit (1); } /* thread master */ - master = thread_master_create (); - - /* Initializations. */ - zlog_default = openzlog (progname, ZLOG_OSPF6, 0, - LOG_CONS|LOG_NDELAY|LOG_PID, - LOG_DAEMON); - zprivs_init (&ospf6d_privs); -#if defined(HAVE_CUMULUS) - zlog_set_level (NULL, ZLOG_DEST_SYSLOG, zlog_default->default_lvl); -#endif + master = frr_init (); - /* initialize zebra libraries */ - signal_init (master, array_size(ospf6_signals), ospf6_signals); cmd_init (1); vty_init (master); memory_init (); @@ -364,14 +286,11 @@ main (int argc, char *argv[], char *envp[]) /* pid file create */ pid_output (pid_file); - /* Make ospf6 vty socket. */ - if (!vty_port) - vty_port = OSPF6_VTY_PORT; - vty_serv_sock (vty_addr, vty_port, vty_sock_path); + frr_vty_serv (OSPF6_VTYSH_PATH); /* Print start message */ zlog_notice ("OSPF6d (Quagga-%s ospf6d-%s) starts: vty@%d", - FRR_VERSION, OSPF6_DAEMON_VERSION,vty_port); + FRR_VERSION, OSPF6_DAEMON_VERSION, ospf6d_di.vty_port); /* Start finite state machine, here we go! */ while (thread_fetch (master, &thread)) |
