diff options
Diffstat (limited to 'isisd/isis_main.c')
| -rw-r--r-- | isisd/isis_main.c | 188 |
1 files changed, 25 insertions, 163 deletions
diff --git a/isisd/isis_main.c b/isisd/isis_main.c index 1b9fa68051..a6ad424ace 100644 --- a/isisd/isis_main.c +++ b/isisd/isis_main.c @@ -38,8 +38,8 @@ #include "plist.h" #include "zclient.h" #include "vrf.h" -#include "sockopt.h" #include "qobj.h" +#include "libfrr.h" #include "isisd/dict.h" #include "isisd/isis_constants.h" @@ -82,41 +82,13 @@ struct zebra_privs_t isisd_privs = { }; /* isisd options */ -#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 ISISD_DEFAULT_CONFIG; -char *config_file = NULL; - -/* isisd program name. */ -char *progname; - -/* VTY Socket prefix */ -char vty_sock_path[MAXPATHLEN] = ISIS_VTYSH_PATH; - -int daemon_mode = 0; - /* Master of threads. */ struct thread_master *master; -/* Process ID saved for use by init system */ -const char *pid_file = PATH_ISISD_PID; - /* for reload */ char _cwd[MAXPATHLEN]; char _progpath[MAXPATHLEN]; @@ -134,36 +106,6 @@ void sigterm(void); void sigusr1(void); -/* Help information display. */ -static void -usage (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 IS-IS routing\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); -} - - void reload () { @@ -213,7 +155,7 @@ void sigusr1 (void) { zlog_debug ("SIGUSR1 received"); - zlog_rotate (NULL); + zlog_rotate(); } struct quagga_signal_t isisd_signals[] = @@ -236,28 +178,26 @@ struct quagga_signal_t isisd_signals[] = }, }; +FRR_DAEMON_INFO(isisd, ISIS, + .vty_port = ISISD_VTY_PORT, + + .proghelp = "Implementation of the IS-IS routing protocol.", + .copyright = "Copyright (c) 2001-2002 Sampo Saaristo," + " Ofer Wald and Hannes Gredler", + + .signals = isisd_signals, + .n_signals = array_size(isisd_signals), + + .privs = &isisd_privs, +) + /* * Main routine of isisd. Parse arguments and handle IS-IS state machine. */ int main (int argc, char **argv, char **envp) { - char *p; - int opt, vty_port = ISISD_VTY_PORT; - struct thread thread; - char *config_file = NULL; - char *vty_addr = NULL; - int dryrun = 0; - - /* Get the programname without the preceding path. */ - progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]); - - zlog_default = openzlog (progname, ZLOG_ISIS, 0, - LOG_CONS | LOG_NDELAY | LOG_PID, LOG_DAEMON); - zprivs_init (&isisd_privs); -#if defined(HAVE_CUMULUS) - zlog_set_level (NULL, ZLOG_DEST_SYSLOG, zlog_default->default_lvl); -#endif + int opt; /* for reload */ _argc = argc; @@ -274,10 +214,13 @@ main (int argc, char **argv, char **envp) else snprintf (_progpath, sizeof (_progpath), "%s", argv[0]); + frr_preinit (&isisd_di, argc, argv); + frr_opt_add ("", longopts, ""); + /* Command line argument treatment. */ while (1) { - opt = getopt_long (argc, argv, "df:i:z:hA:p:P:u:g:vC", longopts, 0); + opt = frr_getopt (argc, argv, NULL); if (opt == EOF) break; @@ -286,74 +229,19 @@ main (int argc, char **argv, char **envp) { case 0: break; - case 'd': - daemon_mode = 1; - break; - case 'f': - config_file = optarg; - break; - case 'i': - pid_file = optarg; - break; - case 'z': - zclient_serv_path_set (optarg); - break; - case 'A': - vty_addr = optarg; - break; - case 'P': - /* Deal with atoi() returning 0 on failure, and isisd not - listening on isisd port... */ - if (strcmp (optarg, "0") == 0) - { - vty_port = 0; - break; - } - vty_port = atoi (optarg); - vty_port = (vty_port ? vty_port : ISISD_VTY_PORT); - break; - case OPTION_VTYSOCK: - set_socket_path(vty_sock_path, ISIS_VTYSH_PATH, optarg, sizeof (vty_sock_path)); - break; - case 'u': - isisd_privs.user = optarg; - break; - case 'g': - isisd_privs.group = optarg; - break; - case 'v': - printf ("ISISd version %s\n", ISISD_VERSION); - printf ("Copyright (c) 2001-2002 Sampo Saaristo," - " Ofer Wald and Hannes Gredler\n"); - print_version ("Zebra"); - exit (0); - break; - case 'C': - dryrun = 1; - break; - case 'h': - usage (0); - break; default: - usage (1); + frr_help_exit (1); break; } } + vty_config_lockless (); /* thread master */ - master = thread_master_create (); - - /* random seed from time */ - srandom (time (NULL)); + master = frr_init (); /* * initializations */ - signal_init (master, array_size (isisd_signals), isisd_signals); - cmd_init (1); - vty_config_lockless (); - vty_init (master); - memory_init (); access_list_init(); vrf_init (); prefix_list_init(); @@ -369,34 +257,8 @@ main (int argc, char **argv, char **envp) isis_zebra_init(master); - /* parse config file */ - /* this is needed three times! because we have interfaces before the areas */ - vty_read_config (config_file, config_default); - - /* Start execution only if not in dry-run mode */ - if (dryrun) - return(0); - - /* demonize */ - if (daemon_mode && daemon (0, 0) < 0) - { - zlog_err("ISISd daemon failed: %s", strerror(errno)); - return (1); - } - - /* Process ID file creation. */ - if (pid_file[0] != '\0') - pid_output (pid_file); - - /* Make isis vty socket. */ - vty_serv_sock (vty_addr, vty_port, vty_sock_path); - - /* Print banner. */ - zlog_notice ("Quagga-ISISd %s starting: vty@%d", FRR_VERSION, vty_port); - - /* Start finite state machine. */ - while (thread_fetch (master, &thread)) - thread_call (&thread); + frr_config_fork (); + frr_run (master); /* Not reached. */ exit (0); |
