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

网络

开发平台:

Unix_Linux

  1. /* RIPd main routine.
  2.  * Copyright (C) 1997, 98 Kunihiro Ishiguro <kunihiro@zebra.org>
  3.  *
  4.  * This file is part of GNU Zebra.
  5.  *
  6.  * GNU Zebra is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2, or (at your option) any
  9.  * later version.
  10.  *
  11.  * GNU Zebra is distributed in the hope that it will be useful, but
  12.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  18.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  19.  * 02111-1307, USA.  
  20.  */
  21. #include <zebra.h>
  22. #include "version.h"
  23. #include "getopt.h"
  24. #include "thread.h"
  25. #include "command.h"
  26. #include "memory.h"
  27. #include "prefix.h"
  28. #include "filter.h"
  29. #include "keychain.h"
  30. #include "log.h"
  31. #include "ripd/ripd.h"
  32. /* ripd options. */
  33. static struct option longopts[] = 
  34. {
  35.   { "daemon",      no_argument,       NULL, 'd'},
  36.   { "config_file", required_argument, NULL, 'f'},
  37.   { "pid_file",    required_argument, NULL, 'i'},
  38.   { "help",        no_argument,       NULL, 'h'},
  39.   { "vty_addr",    required_argument, NULL, 'A'},
  40.   { "vty_port",    required_argument, NULL, 'P'},
  41.   { "retain",      no_argument,       NULL, 'r'},
  42.   { "version",     no_argument,       NULL, 'v'},
  43.   { 0 }
  44. };
  45. /* Configuration file and directory. */
  46. char config_current[] = RIPD_DEFAULT_CONFIG;
  47. char config_default[] = SYSCONFDIR RIPD_DEFAULT_CONFIG;
  48. char *config_file = NULL;
  49. /* ripd program name */
  50. /* Route retain mode flag. */
  51. int retain_mode = 0;
  52. /* RIP VTY bind address. */
  53. char *vty_addr = NULL;
  54. /* RIP VTY connection port. */
  55. int vty_port = RIP_VTY_PORT;
  56. /* Master of threads. */
  57. struct thread_master *master;
  58. /* Process ID saved for use by init system */
  59. char *pid_file = PATH_RIPD_PID;
  60. /* Help information display. */
  61. static void
  62. usage (char *progname, int status)
  63. {
  64.   if (status != 0)
  65.     fprintf (stderr, "Try `%s --help' for more information.n", progname);
  66.   else
  67.     {    
  68.       printf ("Usage : %s [OPTION...]n
  69. Daemon which manages RIP version 1 and 2.nn
  70. -d, --daemon       Runs in daemon moden
  71. -f, --config_file  Set configuration file namen
  72. -i, --pid_file     Set process identifier file namen
  73. -A, --vty_addr     Set vty's bind addressn
  74. -P, --vty_port     Set vty's port numbern
  75. -r, --retain       When program terminates, retain added route by ripd.n
  76. -v, --version      Print program versionn
  77. -h, --help         Display this help and exitn
  78. n
  79. Report bugs to %sn", progname, ZEBRA_BUG_ADDRESS);
  80.     }
  81.   exit (status);
  82. }
  83. /* Signale wrapper. */
  84. RETSIGTYPE *
  85. signal_set (int signo, void (*func)(int))
  86. {
  87.   int ret;
  88.   struct sigaction sig;
  89.   struct sigaction osig;
  90.   sig.sa_handler = func;
  91.   sigemptyset (&sig.sa_mask);
  92.   sig.sa_flags = 0;
  93. #ifdef SA_RESTART
  94.   sig.sa_flags |= SA_RESTART;
  95. #endif /* SA_RESTART */
  96.   ret = sigaction (signo, &sig, &osig);
  97.   if (ret < 0) 
  98.     return (SIG_ERR);
  99.   else
  100.     return (osig.sa_handler);
  101. }
  102. /* SIGHUP handler. */
  103. void 
  104. sighup (int sig)
  105. {
  106.   zlog_info ("SIGHUP received");
  107.   rip_clean ();
  108.   rip_reset ();
  109.   zlog_info ("ripd restarting!");
  110.   /* Reload config file. */
  111.   vty_read_config (config_file, config_current, config_default);
  112.   /* Create VTY's socket */
  113.   vty_serv_sock (vty_addr, vty_port, RIP_VTYSH_PATH);
  114.   /* Try to return to normal operation. */
  115. }
  116. /* SIGINT handler. */
  117. void
  118. sigint (int sig)
  119. {
  120.   zlog (NULL, LOG_INFO, "Terminating on signal");
  121.   if (! retain_mode)
  122.     rip_clean ();
  123.   exit (0);
  124. }
  125. /* SIGUSR1 handler. */
  126. void
  127. sigusr1 (int sig)
  128. {
  129.   zlog_rotate (NULL);
  130. }
  131. /* Initialization of signal handles. */
  132. void
  133. signal_init ()
  134. {
  135.   signal_set (SIGHUP, sighup);
  136.   signal_set (SIGINT, sigint);
  137.   signal_set (SIGTERM, sigint);
  138.   signal_set (SIGPIPE, SIG_IGN);
  139.   signal_set (SIGUSR1, sigusr1);
  140. }
  141. /* Main routine of ripd. */
  142. int
  143. main (int argc, char **argv)
  144. {
  145.   char *p;
  146.   int daemon_mode = 0;
  147.   char *progname;
  148.   struct thread thread;
  149.   /* Set umask before anything for security */
  150.   umask (0027);
  151.   /* Get program name. */
  152.   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
  153.   /* First of all we need logging init. */
  154.   zlog_default = openzlog (progname, ZLOG_NOLOG, ZLOG_RIP,
  155.    LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
  156.   /* Command line option parse. */
  157.   while (1) 
  158.     {
  159.       int opt;
  160.       opt = getopt_long (argc, argv, "df:hA:P:rv", longopts, 0);
  161.     
  162.       if (opt == EOF)
  163. break;
  164.       switch (opt) 
  165. {
  166. case 0:
  167.   break;
  168. case 'd':
  169.   daemon_mode = 1;
  170.   break;
  171. case 'f':
  172.   config_file = optarg;
  173.   break;
  174. case 'A':
  175.   vty_addr = optarg;
  176.   break;
  177.         case 'i':
  178.           pid_file = optarg;
  179.           break;
  180. case 'P':
  181.   vty_port = atoi (optarg);
  182.   break;
  183. case 'r':
  184.   retain_mode = 1;
  185.   break;
  186. case 'v':
  187.   print_version (progname);
  188.   exit (0);
  189.   break;
  190. case 'h':
  191.   usage (progname, 0);
  192.   break;
  193. default:
  194.   usage (progname, 1);
  195.   break;
  196. }
  197.     }
  198.   /* Prepare master thread. */
  199.   master = thread_master_create ();
  200.   /* Library initialization. */
  201.   signal_init ();
  202.   cmd_init (1);
  203.   vty_init ();
  204.   memory_init ();
  205.   keychain_init ();
  206.   /* RIP related initialization. */
  207.   rip_init ();
  208.   rip_if_init ();
  209.   rip_zclient_init ();
  210.   rip_peer_init ();
  211.   /* Sort all installed commands. */
  212.   sort_node ();
  213.   /* Get configuration file. */
  214.   vty_read_config (config_file, config_current, config_default);
  215.   /* Change to the daemon program. */
  216.   if (daemon_mode)
  217.     daemon (0, 0);
  218.   /* Pid file create. */
  219.   pid_output (pid_file);
  220.   /* Create VTY's socket */
  221.   vty_serv_sock (vty_addr, vty_port, RIP_VTYSH_PATH);
  222.   /* Execute each thread. */
  223.   while (thread_fetch (master, &thread))
  224.     thread_call (&thread);
  225.   /* Not reached. */
  226.   exit (0);
  227. }