diff options
Diffstat (limited to 'zebra/main.c')
| -rw-r--r-- | zebra/main.c | 213 | 
1 files changed, 41 insertions, 172 deletions
diff --git a/zebra/main.c b/zebra/main.c index b72ce84cd6..b70ce7eda7 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -35,7 +35,7 @@  #include "privs.h"  #include "sigevent.h"  #include "vrf.h" -#include "sockopt.h" +#include "libfrr.h"  #include "zebra/rib.h"  #include "zebra/zserv.h" @@ -60,9 +60,6 @@ struct zebra_t zebrad =  /* process id. */  pid_t pid; -/* VTY Socket prefix */ -char vty_sock_path[MAXPATHLEN] = ZEBRA_VTYSH_PATH; -  /* Pacify zclient.o in libfrr, which expects this variable. */  struct thread_master *master; @@ -81,30 +78,18 @@ u_int32_t nl_rcvbufsize = 4194304;  #endif /* HAVE_NETLINK */  /* Command line options. */ -#define OPTION_VTYSOCK 1000  struct option longopts[] =   {    { "batch",        no_argument,       NULL, 'b'}, -  { "daemon",       no_argument,       NULL, 'd'},    { "allow_delete", no_argument,       NULL, 'a'},    { "keep_kernel",  no_argument,       NULL, 'k'},    { "fpm_format",   required_argument, NULL, 'F'}, -  { "config_file",  required_argument, NULL, 'f'}, -  { "pid_file",     required_argument, NULL, 'i'},    { "socket",       required_argument, NULL, 'z'}, -  { "help",         no_argument,       NULL, 'h'}, -  { "vty_addr",     required_argument, NULL, 'A'}, -  { "vty_port",     required_argument, NULL, 'P'}, -  { "vty_socket",   required_argument, NULL, OPTION_VTYSOCK },    { "ecmp",         required_argument, NULL, 'e'},    { "retain",       no_argument,       NULL, 'r'}, -  { "dryrun",       no_argument,       NULL, 'C'},  #ifdef HAVE_NETLINK    { "nl-bufsize",   required_argument, NULL, 's'},  #endif /* HAVE_NETLINK */ -  { "user",         required_argument, NULL, 'u'}, -  { "group",        required_argument, NULL, 'g'}, -  { "version",      no_argument,       NULL, 'v'},    { 0 }  }; @@ -130,54 +115,8 @@ struct zebra_privs_t zserv_privs =    .cap_num_i = 0  }; -/* Default configuration file path. */ -char config_default[] = SYSCONFDIR DEFAULT_CONFIG_FILE; - -/* Process ID saved for use by init system */ -const char *pid_file = PATH_ZEBRA_PID; -  unsigned int multipath_num = MULTIPATH_NUM; -/* 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 kernel routing table management and "\ -	      "redistribution between different routing protocols.\n\n"\ -	      "-b, --batch        Runs in batch mode\n"\ -	      "-d, --daemon       Runs in daemon mode\n"\ -	      "-a, --allow_delete Allow other processes to delete Quagga Routes\n" \ -	      "-f, --config_file  Set configuration file name\n"\ -	      "-F, --fpm_format   Set fpm format to 'netlink' or 'protobuf'\n"\ -	      "-i, --pid_file     Set process identifier file name\n"\ -	      "-z, --socket       Set path of zebra socket\n"\ -	      "-k, --keep_kernel  Don't delete old routes which installed by "\ -				  "zebra.\n"\ -	      "-C, --dryrun       Check configuration for validity and exit\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"\ -	      "-r, --retain       When program terminates, retain added route "\ -				  "by zebra.\n"\ -	      "-u, --user         User to run as\n"\ -	      "-g, --group        Group to run as\n", progname); -#ifdef HAVE_NETLINK -      printf ("-s, --nl-bufsize   Set netlink receive buffer size\n"); -#endif /* HAVE_NETLINK */ -      printf ("-v, --version      Print program version\n"\ -	      "-h, --help         Display this help and exit\n"\ -	      "\n"\ -	      "Report bugs to %s\n", FRR_BUG_ADDRESS); -    } - -  exit (status); -} -  /* SIGHUP handler. */  static void   sighup (void) @@ -229,8 +168,7 @@ sigint (void)      work_queue_free (zebrad.lsp_process_q);    meta_queue_free (zebrad.mq);    thread_master_free (zebrad.master); -  if (zlog_default) -    closezlog (zlog_default); +  closezlog ();    exit (0);  } @@ -239,7 +177,7 @@ sigint (void)  static void  sigusr1 (void)  { -  zlog_rotate (NULL); +  zlog_rotate();  }  struct quagga_signal_t zebra_signals[] = @@ -262,44 +200,49 @@ struct quagga_signal_t zebra_signals[] =    },  }; +FRR_DAEMON_INFO(zebra, ZEBRA, +	.vty_port = ZEBRA_VTY_PORT, +	.flags = FRR_NO_ZCLIENT, + +	.proghelp = "Daemon which manages kernel routing table management " +		"and\nredistribution between different routing protocols.", + +	.signals = zebra_signals, +	.n_signals = array_size(zebra_signals), + +	.privs = &zserv_privs, +) +  /* Main startup routine. */  int  main (int argc, char **argv)  { -  char *p; -  char *vty_addr = NULL; -  int vty_port = ZEBRA_VTY_PORT; -  int dryrun = 0; -  int batch_mode = 0; -  int daemon_mode = 0; -  char *config_file = NULL; -  char *progname; -  struct thread thread; +  // int batch_mode = 0;    char *zserv_path = NULL;    char *fpm_format = NULL; -  /* Set umask before anything for security */ -  umask (0027); +  frr_preinit(&zebra_di, argc, argv); -  /* preserve my name */ -  progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]); - -  zlog_default = openzlog (progname, ZLOG_ZEBRA, 0, -			   LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON); -  zprivs_init (&zserv_privs); -#if defined(HAVE_CUMULUS) -  zlog_set_level (NULL, ZLOG_DEST_SYSLOG, zlog_default->default_lvl); +  frr_opt_add("bakF:z:e:r" +#ifdef HAVE_NETLINK +	"s:"  #endif +	, longopts, +	"  -b, --batch        Runs in batch mode\n" +	"  -a, --allow_delete Allow other processes to delete Quagga Routes\n" +	"  -F, --fpm_format   Set fpm format to 'netlink' or 'protobuf'\n" +	"  -z, --socket       Set path of zebra socket\n" +	"  -e, --ecmp         Specify ECMP to use.\n" +	"  -k, --keep_kernel  Don't delete old routes which installed by zebra.\n" +	"  -r, --retain       When program terminates, retain added route by zebra.\n" +#ifdef HAVE_NETLINK +	"  -s, --nl-bufsize   Set netlink receive buffer size\n" +#endif /* HAVE_NETLINK */ +	); -  while (1)  +  while (1)      { -      int opt; -   -#ifdef HAVE_NETLINK   -      opt = getopt_long (argc, argv, "bdakf:F:i:z:hA:P:ru:g:vs:C", longopts, 0); -#else -      opt = getopt_long (argc, argv, "bdakf:F:i:z:hA:P:ru:g:vC", longopts, 0); -#endif /* HAVE_NETLINK */ +      int opt = frr_getopt(argc, argv, NULL);        if (opt == EOF)  	break; @@ -309,9 +252,7 @@ main (int argc, char **argv)  	case 0:  	  break;  	case 'b': -	  batch_mode = 1; -	case 'd': -	  daemon_mode = 1; +	  // batch_mode = 1;  	  break;  	case 'a':  	  allow_delete = 1; @@ -319,18 +260,9 @@ main (int argc, char **argv)  	case 'k':  	  keep_kernel_mode = 1;  	  break; -	case 'C': -	  dryrun = 1; -	  break; -	case 'f': -	  config_file = optarg; -	  break;  	case 'F':  	  fpm_format = optarg;  	  break; -	case 'A': -	  vty_addr = optarg; -	  break;          case 'e':            multipath_num = atoi (optarg);            if (multipath_num > MULTIPATH_NUM || multipath_num <= 0) @@ -339,27 +271,9 @@ main (int argc, char **argv)                return 1;              }            break; -        case 'i': -          pid_file = optarg; -          break;  	case 'z':  	  zserv_path = optarg;  	  break; -	case 'P': -	  /* Deal with atoi() returning 0 on failure, and zebra not -	     listening on zebra port... */ -	  if (strcmp(optarg, "0") == 0)  -	    { -	      vty_port = 0; -	      break; -	    }  -	  vty_port = atoi (optarg); -	  if (vty_port <= 0 || vty_port > 0xffff) -	    vty_port = ZEBRA_VTY_PORT; -	  break; -	case OPTION_VTYSOCK: -	  set_socket_path(vty_sock_path, ZEBRA_VTYSH_PATH, optarg, sizeof (vty_sock_path)); -	  break;  	case 'r':  	  retain_mode = 1;  	  break; @@ -368,34 +282,14 @@ main (int argc, char **argv)  	  nl_rcvbufsize = atoi (optarg);  	  break;  #endif /* HAVE_NETLINK */ -	case 'u': -	  zserv_privs.user = optarg; -	  break; -	case 'g': -	  zserv_privs.group = optarg; -	  break; -	case 'v': -	  print_version (progname); -	  exit (0); -	  break; -	case 'h': -	  usage (progname, 0); -	  break;  	default: -	  usage (progname, 1); +	  frr_help_exit (1);  	  break;  	}      } -  /* Make master thread emulator. */ -  zebrad.master = thread_master_create (); - -  /* Vty related initialize. */ -  signal_init (zebrad.master, array_size(zebra_signals), zebra_signals); -  cmd_init (1);    vty_config_lockless (); -  vty_init (zebrad.master); -  memory_init (); +  zebrad.master = frr_init();    /* Zebra related initialize. */    zebra_init (); @@ -443,29 +337,11 @@ main (int argc, char **argv)    *  The notifications from kernel will show originating PID equal    *  to that after daemon() completes (if ever called).    */ -  vty_read_config (config_file, config_default); +  frr_config_fork(); -  /* Don't start execution if we are in dry-run mode */ -  if (dryrun) -    return(0); -   -  /* Clean up rib. */ +  /* Clean up rib -- before fork (?) */    /* rib_weed_tables (); */ -  /* Exit when zebra is working in batch mode. */ -  if (batch_mode) -    exit (0); - -  /* Daemonize. */ -  if (daemon_mode && daemon (0, 0) < 0) -    { -      zlog_err("Zebra daemon failed: %s", strerror(errno)); -      exit (1); -    } - -  /* Output pid of zebra. */ -  pid_output (pid_file); -    /* After we have successfully acquired the pidfile, we can be sure    *  about being the only copy of zebra process, which is submitting    *  changes to the FIB. @@ -483,14 +359,7 @@ main (int argc, char **argv)    /* This must be done only after locking pidfile (bug #403). */    zebra_zserv_socket_init (zserv_path); -  /* Make vty server socket. */ -  vty_serv_sock (vty_addr, vty_port, vty_sock_path); - -  /* Print banner. */ -  zlog_notice ("Zebra %s starting: vty@%d", FRR_VERSION, vty_port); - -  while (thread_fetch (zebrad.master, &thread)) -    thread_call (&thread); +  frr_run (zebrad.master);    /* Not reached... */    return 0;  | 
