main.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:7k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  * zebra daemon main routine.
  3.  * Copyright (C) 1997, 98 Kunihiro Ishiguro
  4.  *
  5.  * This file is part of GNU Zebra.
  6.  *
  7.  * GNU Zebra is free software; you can redistribute it and/or modify it
  8.  * under the terms of the GNU General Public License as published by the
  9.  * Free Software Foundation; either version 2, or (at your option) any
  10.  * later version.
  11.  *
  12.  * GNU Zebra is distributed in the hope that it will be useful, but
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  19.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  20.  * 02111-1307, USA.  
  21.  */
  22. #include <zebra.h>
  23. #include "version.h"
  24. #include "getopt.h"
  25. #include "command.h"
  26. #include "thread.h"
  27. #include "filter.h"
  28. #include "memory.h"
  29. #include "prefix.h"
  30. #include "log.h"
  31. #include "zebra/rib.h"
  32. #include "zebra/zserv.h"
  33. #include "zebra/debug.h"
  34. #include "zebra/rib.h"
  35. /* Master of threads. */
  36. struct thread_master *master;
  37. /* process id. */
  38. pid_t old_pid;
  39. pid_t pid;
  40. /* Route retain mode flag. */
  41. int retain_mode = 0;
  42. /* Don't delete kernel route. */
  43. int keep_kernel_mode = 0;
  44. /* Command line options. */
  45. struct option longopts[] = 
  46. {
  47.   { "batch",       no_argument,       NULL, 'b'},
  48.   { "daemon",      no_argument,       NULL, 'd'},
  49.   { "keep_kernel", no_argument,       NULL, 'k'},
  50.   { "log_mode",    no_argument,       NULL, 'l'},
  51.   { "config_file", required_argument, NULL, 'f'},
  52.   { "pid_file",    required_argument, NULL, 'i'},
  53.   { "help",        no_argument,       NULL, 'h'},
  54.   { "vty_addr",    required_argument, NULL, 'A'},
  55.   { "vty_port",    required_argument, NULL, 'P'},
  56.   { "retain",      no_argument,       NULL, 'r'},
  57.   { "version",     no_argument,       NULL, 'v'},
  58.   { 0 }
  59. };
  60. /* Default configuration file path. */
  61. char config_current[] = DEFAULT_CONFIG_FILE;
  62. char config_default[] = SYSCONFDIR DEFAULT_CONFIG_FILE;
  63. /* Process ID saved for use by init system */
  64. char *pid_file = PATH_ZEBRA_PID;
  65. /* Help information display. */
  66. static void
  67. usage (char *progname, int status)
  68. {
  69.   if (status != 0)
  70.     fprintf (stderr, "Try `%s --help' for more information.n", progname);
  71.   else
  72.     {    
  73.       printf ("Usage : %s [OPTION...]nn
  74. Daemon which manages kernel routing table management and 
  75. redistribution between different routing protocols.nn
  76. -b, --batch        Runs in batch moden
  77. -d, --daemon       Runs in daemon moden
  78. -f, --config_file  Set configuration file namen
  79. -i, --pid_file     Set process identifier file namen
  80. -k, --keep_kernel  Don't delete old routes which installed by zebra.n
  81. -l, --log_mode     Set verbose log mode flagn
  82. -A, --vty_addr     Set vty's bind addressn
  83. -P, --vty_port     Set vty's port numbern
  84. -r, --retain       When program terminates, retain added route by zebra.n
  85. -v, --version      Print program versionn
  86. -h, --help         Display this help and exitn
  87. n
  88. Report bugs to %sn", progname, ZEBRA_BUG_ADDRESS);
  89.     }
  90.   exit (status);
  91. }
  92. /* SIGHUP handler. */
  93. void 
  94. sighup (int sig)
  95. {
  96.   zlog_info ("SIGHUP received");
  97.   /* Reload of config file. */
  98.   ;
  99. }
  100. /* SIGINT handler. */
  101. void
  102. sigint (int sig)
  103. {
  104.   /* Decrared in rib.c */
  105.   void rib_close ();
  106.   zlog_info ("Terminating on signal");
  107.   if (!retain_mode)
  108.     rib_close ();
  109. #ifdef HAVE_IRDP
  110.   irdp_finish();
  111. #endif
  112.   exit (0);
  113. }
  114. /* SIGUSR1 handler. */
  115. void
  116. sigusr1 (int sig)
  117. {
  118.   zlog_rotate (NULL);
  119. }
  120. /* Signale wrapper. */
  121. RETSIGTYPE *
  122. signal_set (int signo, void (*func)(int))
  123. {
  124.   int ret;
  125.   struct sigaction sig;
  126.   struct sigaction osig;
  127.   sig.sa_handler = func;
  128.   sigemptyset (&sig.sa_mask);
  129.   sig.sa_flags = 0;
  130. #ifdef SA_RESTART
  131.   sig.sa_flags |= SA_RESTART;
  132. #endif /* SA_RESTART */
  133.   ret = sigaction (signo, &sig, &osig);
  134.   if (ret < 0) 
  135.     return (SIG_ERR);
  136.   else
  137.     return (osig.sa_handler);
  138. }
  139. /* Initialization of signal handles. */
  140. void
  141. signal_init ()
  142. {
  143.   signal_set (SIGHUP, sighup);
  144.   signal_set (SIGINT, sigint);
  145.   signal_set (SIGTERM, sigint);
  146.   signal_set (SIGPIPE, SIG_IGN);
  147.   signal_set (SIGUSR1, sigusr1);
  148. }
  149. /* Main startup routine. */
  150. int
  151. main (int argc, char **argv)
  152. {
  153.   char *p;
  154.   char *vty_addr = NULL;
  155.   int vty_port = 0;
  156.   int batch_mode = 0;
  157.   int daemon_mode = 0;
  158.   char *config_file = NULL;
  159.   char *progname;
  160.   struct thread thread;
  161.   void rib_weed_tables ();
  162.   void zebra_vty_init ();
  163.   /* Set umask before anything for security */
  164.   umask (0027);
  165.   /* preserve my name */
  166.   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
  167.   zlog_default = openzlog (progname, ZLOG_STDOUT, ZLOG_ZEBRA,
  168.    LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
  169.   while (1) 
  170.     {
  171.       int opt;
  172.   
  173.       opt = getopt_long (argc, argv, "bdklf:hA:P:rv", longopts, 0);
  174.       if (opt == EOF)
  175. break;
  176.       switch (opt) 
  177. {
  178. case 0:
  179.   break;
  180. case 'b':
  181.   batch_mode = 1;
  182. case 'd':
  183.   daemon_mode = 1;
  184.   break;
  185. case 'k':
  186.   keep_kernel_mode = 1;
  187.   break;
  188. case 'l':
  189.   /* log_mode = 1; */
  190.   break;
  191. case 'f':
  192.   config_file = optarg;
  193.   break;
  194. case 'A':
  195.   vty_addr = optarg;
  196.   break;
  197.         case 'i':
  198.           pid_file = optarg;
  199.           break;
  200. case 'P':
  201.   vty_port = atoi (optarg);
  202.   break;
  203. case 'r':
  204.   retain_mode = 1;
  205.   break;
  206. case 'v':
  207.   print_version (progname);
  208.   exit (0);
  209.   break;
  210. case 'h':
  211.   usage (progname, 0);
  212.   break;
  213. default:
  214.   usage (progname, 1);
  215.   break;
  216. }
  217.     }
  218.   /* Make master thread emulator. */
  219.   master = thread_master_create ();
  220.   /* Vty related initialize. */
  221.   signal_init ();
  222.   cmd_init (1);
  223.   vty_init ();
  224.   memory_init ();
  225.   /* Zebra related initialize. */
  226.   zebra_init ();
  227.   rib_init ();
  228.   zebra_if_init ();
  229.   zebra_debug_init ();
  230.   zebra_vty_init ();
  231.   access_list_init ();
  232.   rtadv_init ();
  233. #ifdef HAVE_IRDP
  234.   irdp_init();
  235. #endif
  236.   /* For debug purpose. */
  237.   /* SET_FLAG (zebra_debug_event, ZEBRA_DEBUG_EVENT); */
  238.   /* Make kernel routing socket. */
  239.   kernel_init ();
  240.   interface_list ();
  241.   route_read ();
  242.   /* Sort VTY commands. */
  243.   sort_node ();
  244. #ifdef HAVE_SNMP
  245.   zebra_snmp_init ();
  246. #endif /* HAVE_SNMP */
  247.   /* Clean up self inserted route. */
  248.   if (! keep_kernel_mode)
  249.     rib_sweep_route ();
  250.   /* Configuration file read*/
  251.   vty_read_config (config_file, config_current, config_default);
  252.   /* Clean up rib. */
  253.   rib_weed_tables ();
  254.   /* Exit when zebra is working in batch mode. */
  255.   if (batch_mode)
  256.     exit (0);
  257.   /* Needed for BSD routing socket. */
  258.   old_pid = getpid ();
  259.   /* Daemonize. */
  260.   if (daemon_mode)
  261.     daemon (0, 0);
  262.   /* Output pid of zebra. */
  263.   pid_output (pid_file);
  264.   /* Needed for BSD routing socket. */
  265.   pid = getpid ();
  266.   /* Make vty server socket. */
  267.   vty_serv_sock (vty_addr,
  268.  vty_port ? vty_port : ZEBRA_VTY_PORT, ZEBRA_VTYSH_PATH);
  269.   while (thread_fetch (master, &thread))
  270.     thread_call (&thread);
  271.   /* Not reached... */
  272.   exit (0);
  273. }