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

网络

开发平台:

Unix_Linux

  1. /*
  2.  * RIPngd main routine.
  3.  * Copyright (C) 1998, 1999 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 "vector.h"
  26. #include "vty.h"
  27. #include "command.h"
  28. #include "thread.h"
  29. #include "log.h"
  30. #include "prefix.h"
  31. #include "if.h"
  32. #include "ripngd/ripngd.h"
  33. /* Configuration filename and directory. */
  34. char config_current[] = RIPNG_DEFAULT_CONFIG;
  35. char config_default[] = SYSCONFDIR RIPNG_DEFAULT_CONFIG;
  36. /* RIPngd options. */
  37. struct option longopts[] = 
  38. {
  39.   { "daemon",      no_argument,       NULL, 'd'},
  40.   { "config_file", required_argument, NULL, 'f'},
  41.   { "pid_file",    required_argument, NULL, 'i'},
  42.   { "log_mode",    no_argument,       NULL, 'l'},
  43.   { "help",        no_argument,       NULL, 'h'},
  44.   { "vty_addr",    required_argument, NULL, 'A'},
  45.   { "vty_port",    required_argument, NULL, 'P'},
  46.   { "retain",      no_argument,       NULL, 'r'},
  47.   { "version",     no_argument,       NULL, 'v'},
  48.   { 0 }
  49. };
  50. /* RIPngd program name */
  51. /* Route retain mode flag. */
  52. int retain_mode = 0;
  53. /* Master of threads. */
  54. struct thread_master *master;
  55. /* Process ID saved for use by init system */
  56. char *pid_file = PATH_RIPNGD_PID;
  57. /* Help information display. */
  58. static void
  59. usage (char *progname, int status)
  60. {
  61.   if (status != 0)
  62.     fprintf (stderr, "Try `%s --help' for more information.n", progname);
  63.   else
  64.     {    
  65.       printf ("Usage : %s [OPTION...]n
  66. Daemon which manages RIPng.nn
  67. -d, --daemon       Runs in daemon moden
  68. -f, --config_file  Set configuration file namen
  69. -i, --pid_file     Set process identifier file namen
  70. -l. --log_mode     Set verbose log mode flagn
  71. -A, --vty_addr     Set vty's bind addressn
  72. -P, --vty_port     Set vty's port numbern
  73. -r, --retain       When program terminates, retain added route by ripngd.n
  74. -v, --version      Print program versionn
  75. -h, --help         Display this help and exitn
  76. n
  77. Report bugs to %sn", progname, ZEBRA_BUG_ADDRESS);
  78.     }
  79.   exit (status);
  80. }
  81. /* SIGHUP handler. */
  82. void 
  83. sighup (int sig)
  84. {
  85.   zlog (NULL, LOG_INFO, "SIGHUP received");
  86. }
  87. /* SIGINT handler. */
  88. void
  89. sigint (int sig)
  90. {
  91.   zlog (NULL, LOG_INFO, "Terminating on signal");
  92.   if (! retain_mode)
  93.     ripng_terminate ();
  94.   exit (0);
  95. }
  96. /* SIGUSR1 handler. */
  97. void
  98. sigusr1 (int sig)
  99. {
  100.   zlog_rotate (NULL);
  101. }
  102. /* Signale wrapper. */
  103. RETSIGTYPE *
  104. signal_set (int signo, void (*func)(int))
  105. {
  106.   int ret;
  107.   struct sigaction sig;
  108.   struct sigaction osig;
  109.   sig.sa_handler = func;
  110.   sigemptyset (&sig.sa_mask);
  111.   sig.sa_flags = 0;
  112. #ifdef SA_RESTART
  113.   sig.sa_flags |= SA_RESTART;
  114. #endif /* SA_RESTART */
  115.   ret = sigaction (signo, &sig, &osig);
  116.   if (ret < 0) 
  117.     return (SIG_ERR);
  118.   else
  119.     return (osig.sa_handler);
  120. }
  121. /* Initialization of signal handles. */
  122. void
  123. signal_init ()
  124. {
  125.   signal_set (SIGHUP, sighup);
  126.   signal_set (SIGINT, sigint);
  127.   signal_set (SIGTERM, sigint);
  128.   signal_set (SIGPIPE, SIG_IGN);
  129.   signal_set (SIGUSR1, sigusr1);
  130. }
  131. /* RIPngd main routine. */
  132. int
  133. main (int argc, char **argv)
  134. {
  135.   char *p;
  136.   char *vty_addr = NULL;
  137.   int vty_port = 0;
  138.   int daemon_mode = 0;
  139.   char *config_file = NULL;
  140.   char *progname;
  141.   struct thread thread;
  142.   /* Set umask before anything for security */
  143.   umask (0027);
  144.   /* get program name */
  145.   progname = ((p = strrchr (argv[0], '/')) ? ++p : argv[0]);
  146.   zlog_default = openzlog(progname, ZLOG_NOLOG, ZLOG_RIPNG,
  147.   LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
  148.   while (1) 
  149.     {
  150.       int opt;
  151.       opt = getopt_long (argc, argv, "dlf:hA:P:v", longopts, 0);
  152.     
  153.       if (opt == EOF)
  154. break;
  155.       switch (opt) 
  156. {
  157. case 0:
  158.   break;
  159. case 'd':
  160.   daemon_mode = 1;
  161.   break;
  162. case 'l':
  163.   /* log_mode = 1; */
  164.   break;
  165. case 'f':
  166.   config_file = optarg;
  167.   break;
  168. case 'A':
  169.   vty_addr = optarg;
  170.   break;
  171.         case 'i':
  172.           pid_file = optarg;
  173.           break;
  174. case 'P':
  175.   vty_port = atoi (optarg);
  176.   break;
  177. case 'r':
  178.   retain_mode = 1;
  179.   break;
  180. case 'v':
  181.   print_version (progname);
  182.   exit (0);
  183.   break;
  184. case 'h':
  185.   usage (progname, 0);
  186.   break;
  187. default:
  188.   usage (progname, 1);
  189.   break;
  190. }
  191.     }
  192.   master = thread_master_create ();
  193.   /* Library inits. */
  194.   signal_init ();
  195.   cmd_init (1);
  196.   vty_init ();
  197.   /* RIPngd inits. */
  198.   ripng_init ();
  199.   zebra_init ();
  200.   sort_node ();
  201.   /* Get configuration file. */
  202.   vty_read_config (config_file, config_current, config_default);
  203.   /* Change to the daemon program. */
  204.   if (daemon_mode)
  205.     daemon (0, 0);
  206.   /* Create VTY socket */
  207.   vty_serv_sock (vty_addr,
  208.  vty_port ? vty_port : RIPNG_VTY_PORT, RIPNG_VTYSH_PATH);
  209.   /* Process id file create. */
  210.   pid_output (pid_file);
  211.   /* Fetch next active thread. */
  212.   while (thread_fetch (master, &thread))
  213.     thread_call (&thread);
  214.   /* Not reached. */
  215.   exit (0);
  216. }